예제 #1
0
        public async Task <ReGeocodeLocation> ReGeocodeAsync(double lat, double lng, int radius = 50)
        {
            var inverseRequestPramter = new AmapInverseHttpRequestParamter();

            inverseRequestPramter.Locations = new Location[1]
            {
                new Location
                {
                    Latitude  = lat,
                    Longitude = lng
                }
            };
            return(await AmapHttpRequestClient.InverseAsync(inverseRequestPramter));
        }
예제 #2
0
        public virtual async Task <ReGeocodeLocation> InverseAsync(AmapInverseHttpRequestParamter requestParamter)
        {
            if (requestParamter.Locations.Length > 20)
            {
                var localizer      = ServiceProvider.GetRequiredService <IStringLocalizer <AmapLocationResource> >();
                var localizerError = localizer["SupportsResolveAddress", 20];
                localizerError = localizer["ResolveLocationFailed", localizerError];
                if (Options.VisableErrorToClient)
                {
                    throw new UserFriendlyException(localizerError);
                }
                throw new AbpException($"Resolution address failed:{localizerError}!");
            }
            var client            = HttpClientFactory.CreateClient(AmapHttpConsts.HttpClientName);
            var requestUrlBuilder = new StringBuilder(128);

            requestUrlBuilder.Append("http://restapi.amap.com/v3/geocode/regeo");
            requestUrlBuilder.AppendFormat("?key={0}", Options.ApiKey);
            requestUrlBuilder.AppendFormat("&batch={0}", requestParamter.Batch);
            requestUrlBuilder.AppendFormat("&output={0}", requestParamter.Output);
            requestUrlBuilder.AppendFormat("&radius={0}", requestParamter.Radius);
            requestUrlBuilder.AppendFormat("&extensions={0}", requestParamter.Extensions);
            requestUrlBuilder.AppendFormat("&homeorcorp={0}", requestParamter.HomeOrCorp);
            requestUrlBuilder.AppendFormat("&location=");
            for (int i = 0; i < requestParamter.Locations.Length; i++)
            {
                requestUrlBuilder.AppendFormat("{0},{1}", Math.Round(requestParamter.Locations[i].Longitude, 6),
                                               Math.Round(requestParamter.Locations[i].Latitude, 6));
                if (i < requestParamter.Locations.Length - 1)
                {
                    requestUrlBuilder.Append("|");
                }
            }
            if (!requestParamter.PoiType.IsNullOrWhiteSpace())
            {
                requestUrlBuilder.AppendFormat("&poitype={0}", requestParamter.PoiType);
            }
            if (!requestParamter.PoiType.IsNullOrWhiteSpace())
            {
                requestUrlBuilder.AppendFormat("&poitype={0}", requestParamter.PoiType);
            }
            if (!requestParamter.Sig.IsNullOrWhiteSpace())
            {
                requestUrlBuilder.AppendFormat("&sig={0}", requestParamter.Sig);
            }
            if (requestParamter.RoadLevel.HasValue)
            {
                requestUrlBuilder.AppendFormat("&roadlevel={0}", requestParamter.RoadLevel);
            }

            var requestMessage = new HttpRequestMessage(HttpMethod.Get, requestUrlBuilder.ToString());

            var response = await client.SendAsync(requestMessage, GetCancellationToken());

            if (!response.IsSuccessStatusCode)
            {
                throw new AbpException($"Amap request service returns error! HttpStatusCode: {response.StatusCode}, ReasonPhrase: {response.ReasonPhrase}");
            }

            var resultContent = await response.Content.ReadAsStringAsync();

            var amapResponse = JsonSerializer.Deserialize <AmapInverseLocationResponse>(resultContent);

            if (!amapResponse.IsSuccess())
            {
                var localizerFactory = ServiceProvider.GetRequiredService <IStringLocalizerFactory>();
                var localizerError   = amapResponse.GetErrorMessage().Localize(localizerFactory);
                if (Options.VisableErrorToClient)
                {
                    var localizer = ServiceProvider.GetRequiredService <IStringLocalizer <AmapLocationResource> >();
                    localizerError = localizer["ResolveLocationFailed", localizerError];
                    throw new UserFriendlyException(localizerError);
                }
                throw new AbpException($"Resolution address failed:{localizerError}!");
            }
            var inverseLocation = new ReGeocodeLocation
            {
                Street   = amapResponse.Regeocode.AddressComponent.StreetNumber.Street,
                AdCode   = amapResponse.Regeocode.AddressComponent.AdCode,
                Address  = amapResponse.Regeocode.Address,
                City     = amapResponse.Regeocode.AddressComponent.City.JoinAsString(","),
                Country  = amapResponse.Regeocode.AddressComponent.Country,
                District = amapResponse.Regeocode.AddressComponent.District,
                Number   = amapResponse.Regeocode.AddressComponent.StreetNumber.Number,
                Province = amapResponse.Regeocode.AddressComponent.Province,
                Town     = amapResponse.Regeocode.AddressComponent.TownShip.JoinAsString(" ")
            };

            return(inverseLocation);
        }