百度地图API调用问题-sn 的生成

在使用百度地图的 逆地理编码 功能时遇到了一些问题,官方的文档有一些问题,并且说得也不是很清楚,现在把C# 版本的引用方式和调用方法在这里记录一下,给有需要的人参考一下。

 

SN码生成类

 

    public class AKSNCaculater
    {
        private static string MD5(string password)
        {
            try
            {
                System.Security.Cryptography.HashAlgorithm hash = System.Security.Cryptography.MD5.Create();
                byte[] hash_out = hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
                var md5_str = BitConverter.ToString(hash_out).Replace("-", "");
                return md5_str.ToLower();

            }
            catch
            {

                throw;
            }

        }

        private static string UrlEncode(string str)
        {
            str = System.Web.HttpUtility.UrlEncode(str);
            byte[] buf = Encoding.ASCII.GetBytes(str);//等同于Encoding.ASCII.GetBytes(str)
            for (int i = 0; i < buf.Length; i++)
                if (buf[i] == '%')
                {
                    if (buf[i + 1] >= 'a') buf[i + 1] -= 32;
                    if (buf[i + 2] >= 'a') buf[i + 2] -= 32;
                    i += 2;
                }
            return Encoding.ASCII.GetString(buf);//同上,等同于Encoding.ASCII.GetString(buf)
        }

        private static string HttpBuildQuery(IDictionary<string, string> querystring_arrays)
        {

            StringBuilder sb = new StringBuilder();
            foreach (var item in querystring_arrays)
            {
                sb.Append(UrlEncode(item.Key));
                sb.Append("=");
                sb.Append(UrlEncode(item.Value));
                sb.Append("&");
            }
            sb.Remove(sb.Length - 1, 1);
            return sb.ToString();
        }

        public static string CaculateAKSN(string ak, string sk, string url, IDictionary<string, string> querystring_arrays)
        {
            var queryString = HttpBuildQuery(querystring_arrays);

            var str = UrlEncode(url + "?" + queryString + sk);

            return MD5(str);
        }

    }

调用方法:

 public class LocationService
    {
        /// <summary>
        /// 根据经纬度获取地理位置
        /// </summary>
        /// <param name="lat">纬度</param>
        /// <param name="lng">经度</param>
        /// <returns>具体的地埋位置</returns>
        public static string GetLocation(string lat, string lng)
        {
            try
            {
                var ak = "你的AK";
                var sk = "你的SK";
                var uri = "http://api.map.baidu.com";
                var path = "/reverse_geocoding/v3/";
                var param = new Dictionary<string, string>();

                string location = string.Format("{0},{1}", lat, lng);
                param.Add("ak", ak);
                param.Add("location", location);
                param.Add("output", "json");
                param.Add("coordtype", "wgs84ll");
                var sn = AKSNCaculater.CaculateAKSN(ak, sk, path, param);
                location = string.Format("{0}%2C{1}", lat, lng);
                var url = string.Format("{0}{1}?ak={2}&location={3}&output=json&coordtype=wgs84ll&sn={4}",
                    uri,
                    path,
                    ak,
                    location,
                    sn);
                //发送 http get请求,可以使用自己顺手的方法
                var str = ExifEdit.Common.Utils.GetHttpPage(url, 1000);
                return str;
            }
            catch (Exception)
            {

                return "";
            }
        }
    }

这样就可以了,需要注意的是拼装经纬度参数这部分,传入生成SN的参数要使用逗号分隔,但在生成URL时,必须将逗号转义成 %2C,否则会提示  APP SN校验失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值