Example #1
0
        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);
        }
Example #3
0
        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);
        }