C#的百度地圖開發(三)依據座標獲取位置、商圈及周邊資訊
阿新 • • 發佈:2019-01-05
在《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。