1. 程式人生 > >C#的百度地圖開發(三)依據座標獲取位置、商圈及周邊資訊

C#的百度地圖開發(三)依據座標獲取位置、商圈及周邊資訊

在《C#的百度地圖開發(二)轉換JSON資料為相應的類》一文中,我們得到了百度座標,現在依據這一座標來獲取相應的資訊。下面是相應的程式碼

public class BaiduMap
{
        /// <summary>
        /// 依據座標獲取定位資訊的URL模板。
        /// 引數1:百度地圖API的KEY。
        /// 引數2:座標(經度,緯度)。        
        /// </summary>
        public const string GEOCODING_COORDINATE_URL_TEMPLATE =
            "http://api.map.baidu.com/geocoder/v2/?ak={0}&location={1}&output=json&pois=1";

        /// <summary>
        /// 依據座標獲取定位資訊
        /// </summary>
        /// <param name="coordinates">座標(經度,緯度),多個座標間用分號隔開</param>
        /// <param name="mapCoordinateType">座標型別</param>
        /// <returns></returns>
        public static CoordLocationResult FetchLocation(String coordinates,
                                                     MapCoordinateType mapCoordinateType)
        {
            CoordTransResult transformResult = TransToBaiduCoord(coordinates, mapCoordinateType);
            String info = "";
            if (!transformResult.status.Equals(CoordTransStatus.OK))
            {
                info = "座標轉換異常:狀態是---" + transformResult.status.ToString();
                return null;
            }

            if (transformResult.result == null || transformResult.result.Length <= 0)
            {
                info = "座標轉換異常:結果為空或陣列長度為0";
                return null;
            }

            String locationUrl = "";
            foreach (Coordinate coordTemp in transformResult.result)
            {
                locationUrl = String.Format(GEOCODING_COORDINATE_URL_TEMPLATE,
                                                    MAP_KEY_BAI_DU,
                                                    coordTemp.x + "," + coordTemp.y);
            }

            String locationResponseText = RequestHelper.RequestUrl(locationUrl, null);

            CoordLocationResult locationResult = null;
            try
            {
                locationResult = Newtonsoft.Json.JsonConvert.DeserializeObject<CoordLocationResult>(locationResponseText);
            }
            catch (Exception e)
            {
                info = "定位異常:" + e.Message;
                return null;
            }

            return locationResult;
        }
<span style="white-space:pre">	</span>    /// <summary>
        /// 依據座標獲取定位資訊
        /// </summary>
        /// <param name="coordinate">座標</param>
        /// <returns></returns>
        public static CoordLocationResult FetchLocation(Coordinate coordinate)
        {
            if (coordinate == null)
            {
                return null;
            }
            return FetchLocation(String.Format("{0},{1}", coordinate.x, coordinate.y), MapCoordinateType.GOOGLE_SOSO_ALIYUN_MAPABC_AMAP);
        }
}
注:

(1).使用const常量來定義一個百度地圖API的URL模板,方便後面的呼叫。

(2).TransToBaiduCoord函式是《C#的百度地圖開發(二)轉換JSON資料為相應的類》中將非百度座標轉換成百度座標方法的封裝。

(4).CoordLocationResult類的具體實現,請參看後面的程式碼。

namespace MapApi.Baidu
{

    [Serializable]
    public class CoordLocationResult
    {
        /// <summary>
        /// 狀態
        /// </summary>
        public String status { get; set; }

        /// <summary>
        /// 結果
        /// </summary>
        public CoordLocationResult_Result result { get; set; }
    }

    #region CoordLocationResult_Result
    /// <summary>
    /// 定位結果
    /// </summary>
    [Serializable]
    public class CoordLocationResult_Result
    {
        /// <summary>
        /// 定位的經度與緯度
        /// </summary>
        public CoordLocationResult_Result_Location location { get; set; }

        /// <summary>
        /// 結構化地址資訊
        /// </summary>
        public String formatted_address { get; set; }

        /// <summary>
        /// 所在商圈資訊,如 "人民大學,中關村,蘇州街"
        /// </summary>	
        public String business { get; set; }

        /// <summary>
        /// 定位的行政區域
        /// </summary>
        public CoordLocationResult_Result_AddressComponent addressComponent { get; set; }

        /// <summary>
        /// 周邊位置
        /// </summary>
        public CoordLocationResult_Result_Poi[] pois { get; set; }

        /// <summary>
        /// 周邊區域
        /// </summary>
        public CoordLocationResult_Result_PoiRegion[] poiRegions { get; set; }

        /// <summary>
        /// 城市程式碼
        /// </summary>
        public String cityCode { get; set; }
    }

    /// <summary>
    /// 定位結果之定位的經緯度
    /// </summary>
    [Serializable]
    public class CoordLocationResult_Result_Location
    {
        /// <summary>
        /// 經度
        /// </summary>
        public String lng { get; set; }

        /// <summary>
        /// 緯度
        /// </summary>
        public String lat { get; set; }
    }

    /// <summary>
    /// 定位結果之行政區域
    /// </summary>
    [Serializable]
    public class CoordLocationResult_Result_AddressComponent
    {
        /// <summary>
        /// 城市名
        /// </summary>
        public String city { get; set; }

        /// <summary>
        /// 區縣名
        /// </summary>
        public String district { get; set; }

        /// <summary>
        /// 省名
        /// </summary>
        public String province { get; set; }

        /// <summary>
        /// 街道名
        /// </summary>
        public String street { get; set; }

        /// <summary>
        /// 街道門牌號
        /// </summary>
        public String street_number { get; set; }
    }

    #endregion

    #region CoordLocationResult_Result_Poi
    /// <summary>
    /// 周邊位置資訊
    /// </summary>
    [Serializable]
    public class CoordLocationResult_Result_Poi
    {
        //"addr": "福建省廈門市湖裡區嘉禾路388",
        //       "cp": "NavInfo",
        //       "direction": "西",
        //       "distance": "49",
        //       "name": "永同昌大廈",
        //       "poiType": "商務大廈",
        //       "point": {
        //           "x": 118.13374113945,
        //           "y": 24.501871673827
        //       },
        //       "tel": "",
        //       "uid": "19c4b3f2642893beafb22a1e",
        //       "zip": ""

        /// <summary>
        /// 地址資訊
        /// </summary>
        public String addr { get; set; }

        /// <summary>
        /// 資料來源
        /// </summary>
        public String cp { get; set; }

        /// <summary>
        /// 方向
        /// </summary>
        public String direction { get; set; }

        /// <summary>
        /// 離座標點距離
        /// </summary>
        public String distance { get; set; }

        /// <summary>
        /// poi名稱
        /// </summary>
        public String name { get; set; }

        /// <summary>
        /// poi型別,如’辦公大廈,商務大廈’
        /// </summary>
        public String poiType { get; set; }

        /// <summary>
        /// poi座標{x,y}
        /// </summary>
        public Coordinate point { get; set; }

        /// <summary>
        /// 電話
        /// </summary>
        public String tel { get; set; }

        /// <summary>
        /// poi唯一標識
        /// </summary>
        public String uid { get; set; }

        /// <summary>
        /// 郵編
        /// </summary>
        public String zip { get; set; }
    }
    #endregion

    #region CoordLocationResult_Result_PoiRegion
    /// <summary>
    /// 周邊區域
    /// </summary>
    [Serializable]
    public class CoordLocationResult_Result_PoiRegion
    {
        /// <summary>
        /// 目標方向。比如:內
        /// </summary>
        public String direction_desc { get; set; }

        /// <summary>
        /// 區域名稱。比如:音樂·家生活廣場
        /// </summary>
        public String name { get; set; }
    }
    #endregion

}
注:類的構造方法依據前面所說的構造,也可以使用工具直接生成(連結)。

下面是測試程式碼

 protected void btnTest_Click(object sender, EventArgs e)
        {          
            Coordinate coordinate = new Coordinate("39.92", "116.46");
            CoordLocationResult coordLocationResult=BaiduMap.FetchLocation(coordinate);
            Alert.Show(coordLocationResult.status.ToString());
        }

測試結果如下

從圖中可以看到,formatted_address是位置資訊,business是商圈資訊,pois是周圍的資訊,其他的資訊可自行參考百度地圖WebApi的官方文件說明。

這樣,我們就得到了指定座標點的位置資訊,那得到了這些資訊後,如果在前面的地圖上顯示呢?請參看後文《C#的百度地圖開發(四)前端顯示與定位》。

轉載請註明出處http://blog.csdn.net/xxdddail/article/details/42705549。