1. 程式人生 > >LBS——地理編碼 座標轉地名(C#)

LBS——地理編碼 座標轉地名(C#)

地理編碼 高德、百度座標取地名


採用高德免費Key方式或者百度Key方式 地理編碼 (供從經緯度座標到地址的轉換服務)

座標取地名

        /// <summary>
        /// 座標轉地名型別
        /// </summary>
        public enum CON_TYPE
        {
            [Description("高德座標轉地名")]
            GCJ02_TO_ADDRESS = 1,
            [
Description("百度座標轉地名")] DB09_TO_ADDRESS = 2 } /// <summary> /// 座標轉地名 /// 如採用高德轉地名,請傳入標準GCJ02座標 /// 如採用百度轉地名,請傳入標準DB09座標 /// </summary> /// <param name="lat">緯度(注意座標系)</param> /// <param name="lon">經度(注意座標系)</param>
/// <param name="TYPE">型別</param> /// <param name="ask">金鑰(高德地名不需要金鑰)</param> /// <returns>地名</returns> public static string GPS_TO_ADDRESS(double lat, double lon, CON_TYPE TYPE,string ask=null) { string MSG = ""; switch
(TYPE) { case CON_TYPE.GCJ02_TO_ADDRESS: MSG= GCJ02_TO_ADDRESS(lat, lon); break; case CON_TYPE.DB09_TO_ADDRESS: MSG = DB09_TO_ADDRESS(lat, lon, ask); break; } return MSG; } #region 轉化方法 /// <summary> /// 高德轉地名 /// </summary> /// <param name="lat">緯度</param> /// <param name="lon">經度</param> /// <returns></returns> private static string GCJ02_TO_ADDRESS(double lat, double lon) { string url = "http://gc.ditu.aliyun.com/regeocoding"; Dictionary<string, string> myDic = new Dictionary<string, string>(); myDic.Add("l", lat + "," + lon);//36.6424,107.6821 myDic.Add("type", "010"); string jsonText = ""; string rusting = ""; try { jsonText = CreateHttpGetResponse(url, myDic); JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText); JArray addrList = (JArray)JsonConvert.DeserializeObject(jo["addrList"].ToString()); string status = addrList[0]["status"].ToString(); if (status == "1") { rusting = addrList[0]["admName"].ToString() + addrList[0]["name"].ToString(); } else { rusting= addrList.ToString(); } return rusting; } catch (Exception) { return rusting; } } /// <summary> /// 百度轉地名介面 /// </summary> /// <param name="lat">緯度</param> /// <param name="lon">經度</param> /// <param name="ask">百度金鑰</param> /// <returns>地址</returns> private static string DB09_TO_ADDRESS(double lat, double lon,string ask) { string url = "http://api.map.baidu.com/geocoder/v2/"; Dictionary<string, string> myDic = new Dictionary<string, string>(); myDic.Add("location", lat + "," + lon); myDic.Add("coordtype", "gcj02ll"); myDic.Add("output", "json"); myDic.Add("ak", ask); string jsonText = ""; string rusting = "無地址"; try { jsonText = CreateHttpGetResponse(url, myDic); JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText); if (jo["status"].ToString() == "0") { JObject joadd = (JObject)JsonConvert.DeserializeObject(jo["result"].ToString()); rusting = joadd["formatted_address"].ToString(); } else if (jo["status"].ToString() == "4") { rusting = "ASK超額"; } else { rusting = jo.ToString(); } return rusting; } catch (Exception) { return rusting; } } #endregion

http 後臺呼叫方法

        /// <summary>
        /// 後臺http呼叫
        /// </summary>
        /// <param name="url">ip地址</param>
        /// <param name="parameters">引數</param>
        /// <returns>返回結果</returns>
       public static string CreateHttpGetResponse(string url, IDictionary<string, string> parameters)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }

            HttpWebRequest request = null;

            StringBuilder buffer = new StringBuilder();
            if (!(parameters == null || parameters.Count == 0))
            {
                int i = 0;
                foreach (string key in parameters.Keys)
                {
                    if (i > 0)
                    {
                        buffer.AppendFormat("&{0}={1}", key, parameters[key]);
                    }
                    else
                    {
                        buffer.AppendFormat("?{0}={1}", key, parameters[key]);
                    }
                    i++;
                }
            }
            //如果是傳送HTTPS請求   
            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                //ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                //request = WebRequest.Create(url) as HttpWebRequest;
                //request.ProtocolVersion = HttpVersion.Version10;
            }
            else
            {
                request = WebRequest.Create(url + buffer.ToString()) as HttpWebRequest;
            }
            request.Method = "GET";

            request.Headers.Add("X_REG_CODE", "288a633ccc1");
            request.Headers.Add("X_MACHINE_ID", "a306b7c51254cfc5e22c7ac0702cdf87");
            request.Headers.Add("X_REG_SECRET", "de308301cf381bd4a37a184854035475d4c64946");
            request.Headers.Add("X_STORE", "0001");
            request.Headers.Add("X_BAY", "0001-01");
            request.Headers.Add("X-Requested-With", "XMLHttpRequest");
            request.ContentType = "application/x-www-form-urlencoded";
            request.Headers.Add("Accept-Language", "zh-CN");
            request.Headers.Add("Accept-Encoding", "gzip, deflate");
            request.Accept = "*/*";

            request.CookieContainer = new CookieContainer();


            HttpWebResponse res;
            try
            {
                res = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                res = (HttpWebResponse)ex.Response;
            }
            Stream s = res.GetResponseStream();
            StreamReader sr = new StreamReader(s);

            //讀取伺服器端返回的訊息 
            string sReturnString = sr.ReadLine();
            return sReturnString;
        }