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)); }
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); }