public virtual async Task <GecodeLocation> GeocodeAsync(string address, string city = null) { var requestParamters = new Dictionary <string, string> { { "address", address }, { "ak", Options.AccessKey }, { "output", Options.Output }, { "ret_coordtype", Options.ReturnCoordType } }; if (!city.IsNullOrWhiteSpace()) { requestParamters.Add("city", city); } var baiduMapUrl = "http://api.map.baidu.com"; var baiduMapPath = "/geocoding/v3"; if (Options.CaculateAKSN) { // TODO: 百度的文档不明不白,sn的算法在遇到特殊字符会验证失败,有待完善 var sn = BaiduAKSNCaculater.CaculateAKSN(Options.AccessSecret, baiduMapPath, requestParamters); requestParamters.Add("sn", sn); } var requestUrl = BuildRequestUrl(baiduMapUrl, baiduMapPath, requestParamters); var responseContent = await MakeRequestAndGetResultAsync(requestUrl); var baiduLocationResponse = JsonSerializer.Deserialize <BaiduGeocodeResponse>(responseContent); if (!baiduLocationResponse.IsSuccess()) { var localizerFactory = ServiceProvider.GetRequiredService <IStringLocalizerFactory>(); var localizerErrorMessage = baiduLocationResponse.GetErrorMessage(Options.VisableErrorToClient).Localize(localizerFactory); var localizerErrorDescription = baiduLocationResponse.GetErrorMessage(Options.VisableErrorToClient).Localize(localizerFactory); var localizer = ServiceProvider.GetRequiredService <IStringLocalizer <BaiduLocationResource> >(); localizerErrorMessage = localizer["ResolveLocationFailed", localizerErrorMessage, localizerErrorDescription]; if (Options.VisableErrorToClient) { throw new UserFriendlyException(localizerErrorMessage); } throw new AbpException($"Resolution address failed:{localizerErrorMessage}!"); } var location = new GecodeLocation { Confidence = baiduLocationResponse.Result.Confidence, Latitude = baiduLocationResponse.Result.Location.Lat, Longitude = baiduLocationResponse.Result.Location.Lng, Level = baiduLocationResponse.Result.Level }; location.AddAdditional("BaiduLocation", baiduLocationResponse.Result); return(location); }
public virtual async Task <IPGecodeLocation> IPGeocodeAsync(string ipAddress) { var requestParamters = new Dictionary <string, string> { { "ip", ipAddress }, { "ak", Options.AccessKey }, { "coor", Options.CoordType } }; var baiduMapUrl = "http://api.map.baidu.com"; var baiduMapPath = "/location/ip"; if (Options.CaculateAKSN) { // TODO: 百度的文档不明不白,sn的算法在遇到特殊字符会验证失败,有待完善 var sn = BaiduAKSNCaculater.CaculateAKSN(Options.AccessSecret, baiduMapPath, requestParamters); requestParamters.Add("sn", sn); } var requestUrl = BuildRequestUrl(baiduMapUrl, baiduMapPath, requestParamters); var responseContent = await MakeRequestAndGetResultAsync(requestUrl); var baiduLocationResponse = JsonSerializer.Deserialize <BaiduIpGeocodeResponse>(responseContent); if (!baiduLocationResponse.IsSuccess()) { var localizerFactory = ServiceProvider.GetRequiredService <IStringLocalizerFactory>(); var localizerErrorMessage = baiduLocationResponse.GetErrorMessage(Options.VisableErrorToClient).Localize(localizerFactory); var localizerErrorDescription = baiduLocationResponse.GetErrorMessage(Options.VisableErrorToClient).Localize(localizerFactory); var localizer = ServiceProvider.GetRequiredService <IStringLocalizer <BaiduLocationResource> >(); localizerErrorMessage = localizer["ResolveLocationFailed", localizerErrorMessage, localizerErrorDescription]; if (Options.VisableErrorToClient) { throw new UserFriendlyException(localizerErrorMessage); } throw new AbpException($"Resolution address failed:{localizerErrorMessage}!"); } var location = new IPGecodeLocation { Province = baiduLocationResponse.Content.AddressDetail?.Province, City = baiduLocationResponse.Content.AddressDetail?.City, AdCode = baiduLocationResponse.Content.AddressDetail?.CityCode.ToString(), }; var point = baiduLocationResponse.Content.Point.ToPoint(); location.Location.Latitude = point.Y; location.Location.Longitude = point.X; location.AddAdditional("Address", baiduLocationResponse.Address); location.AddAdditional("Content", baiduLocationResponse.Content); return(location); }
public virtual async Task <ReGeocodeLocation> ReGeocodeAsync(double lat, double lng, int radius = 1000) { var requestParamters = new Dictionary <string, string> { { "ak", Options.AccessKey }, { "output", Options.Output }, { "radius", radius.ToString() }, { "language", Options.Language }, { "coordtype", Options.CoordType }, { "extensions_poi", Options.ExtensionsPoi }, { "ret_coordtype", Options.ReturnCoordType }, { "location", string.Format("{0},{1}", lat, lng) }, { "extensions_road", Options.ExtensionsRoad ? "true" : "false" }, { "extensions_town", Options.ExtensionsTown ? "true" : "false" }, }; var baiduMapUrl = "http://api.map.baidu.com"; var baiduMapPath = "/reverse_geocoding/v3"; if (Options.CaculateAKSN) { // TODO: 百度的文档不明不白,sn的算法在遇到特殊字符会验证失败,有待完善 var sn = BaiduAKSNCaculater.CaculateAKSN(Options.AccessSecret, baiduMapPath, requestParamters); requestParamters.Add("sn", sn); } requestParamters["location"] = string.Format("{0}%2C{1}", lat, lng); var requestUrl = BuildRequestUrl(baiduMapUrl, baiduMapPath, requestParamters); var responseContent = await MakeRequestAndGetResultAsync(requestUrl); var baiduLocationResponse = JsonSerializer.Deserialize <BaiduReGeocodeResponse>(responseContent); if (!baiduLocationResponse.IsSuccess()) { var localizerFactory = ServiceProvider.GetRequiredService <IStringLocalizerFactory>(); var localizerErrorMessage = baiduLocationResponse.GetErrorMessage().Localize(localizerFactory); var localizerErrorDescription = baiduLocationResponse.GetErrorDescription().Localize(localizerFactory); var localizer = ServiceProvider.GetRequiredService <IStringLocalizer <BaiduLocationResource> >(); localizerErrorMessage = localizer["ResolveLocationFailed", localizerErrorMessage, localizerErrorDescription]; if (Options.VisableErrorToClient) { throw new UserFriendlyException(localizerErrorMessage); } throw new AbpException($"Resolution address failed:{localizerErrorMessage}!"); } var location = new ReGeocodeLocation { Street = baiduLocationResponse.Result.AddressComponent.Street, AdCode = baiduLocationResponse.Result.AddressComponent.AdCode.ToString(), Address = baiduLocationResponse.Result.Address, City = baiduLocationResponse.Result.AddressComponent.City, Country = baiduLocationResponse.Result.AddressComponent.Country, District = baiduLocationResponse.Result.AddressComponent.District, Number = baiduLocationResponse.Result.AddressComponent.StreetNumber, Province = baiduLocationResponse.Result.AddressComponent.Province, Town = baiduLocationResponse.Result.AddressComponent.Town, Pois = baiduLocationResponse.Result.Pois.Select(p => new Poi { Address = p.Address, Name = p.Name, Tag = p.Tag, Type = p.PoiType }).ToList(), Roads = baiduLocationResponse.Result.Roads.Select(r => new Road { Name = r.Name }).ToList() }; location.AddAdditional("BaiduLocation", baiduLocationResponse.Result); return(location); }