不知道從什么時候開始,在Google地圖或是百度地圖中用城市或者省名稱搜索的時候,你會發現地圖上會勾勒出搜索的行政區的輪廓來,這個功能非常人性化。
比如在百度地圖中搜索“廣西” ,地圖顯示如下圖所示:

在Google地圖中搜索“桂林”,會定位到桂林市的中心坐標,需要把地圖級別調小,才能看到如下圖的效果

如何實現上面的效果的,據我所知百度API已經開放了獲取行政區邊際坐標的接口,相關說明可以參考
http://developer.baidu.com/map/reference/index.php?title=Class:%E6%9C%8D%E5%8A%A1%E7%B1%BB/Boundary
這里有一篇關於如何獲取行政區域的邊界?的文章,本人根據這篇文章提供的代碼稍作修改,把中國省市(地級市)邊界坐標收入囊中


1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 6 <title>獲取地區輪廓線</title> 7 <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script> 8 <script type="text/javascript" src="CityData.js"></script> 9 <style type="text/css"> 10 body { 11 font-size: 13px; 12 margin: 10px 13 } 14 #container { 15 width: 800px; 16 height: 500px; 17 border: 1px solid gray 18 } 19 </style> 20 </head> 21 22 <body> 23 <div id="container"></div> 24 <div id="event_descr"></div> 25 <br />輸入省、直轄市或縣名稱: 26 <input type="text" id="districtName" style="width:80px" value="桂林市"> 27 <input type="button" onclick="getBoundary()" value="獲取輪廓線"> 28 <script type="text/javascript"> 29 var fso = new ActiveXObject("Scripting.FileSystemObject"); 30 31 var folderName = "C:\\china\\"; 32 if (!fso.FolderExists(folderName)) fso.CreateFolder(folderName); 33 34 var map = new BMap.Map("container"); 35 map.centerAndZoom(new BMap.Point(116.403765, 39.914850), 5); 36 map.addControl(new BMap.NavigationControl({ 37 type: BMAP_NAVIGATION_CONTROL_SMALL 38 })); 39 map.enableScrollWheelZoom(); 40 //直轄市 41 if (cityData.municipalities && cityData.municipalities.length > 0) { 42 for (var i = 0, n = cityData.municipalities.length; i < n; i++) { 43 var mu = cityData.municipalities[i]; 44 getBoundary(mu.n, ""); 45 } 46 } 47 // 普通省 48 for (var i = 0, n = cityData.provinces.length; i < n; i++) { 49 var pv = cityData.provinces[i]; 50 var newFolderName = folderName + pv.n 51 if (!fso.FolderExists(newFolderName)) newFolderName = fso.CreateFolder(folderName + pv.n); 52 getBoundary(pv.n, ""); 53 for (var j = 0, m = pv.cities.length; j < m; j++) { 54 getBoundary(pv.cities[j].n, pv.n); 55 } 56 57 } 58 59 // 其他地區 60 if (cityData.other && cityData.other.length > 0) { 61 for (var i = 0, n = cityData.other.length; i < n; i++) { 62 var oth = cityData.other[i]; 63 getBoundary(oth.n, ""); 64 } 65 66 } 67 68 function getBoundary(name, pvName) { 69 var bdary = new BMap.Boundary(); 70 71 bdary.get(name, function(rs) { //獲取行政區域 72 // map.clearOverlays(); //清除地圖覆蓋物 73 // var count = rs.boundaries.length; //行政區域的點有多少個 74 // for (var i = 0; i < count; i++) { 75 // var ply = new BMap.Polygon(rs.boundaries[i], { 76 // strokeWeight: 2, 77 // strokeColor: "#ff0000" 78 // }); //建立多邊形覆蓋物 79 // map.addOverlay(ply); //添加覆蓋物 80 // map.setViewport(ply.getPath()); //調整視野 81 82 // } 83 var fileName = ""; 84 var newFileObject = null; 85 if (pvName == "") newFileObject = fso.CreateTextFile(folderName + name + ".txt", true) 86 else newFileObject = fso.CreateTextFile(folderName + pvName + "\\" + name + ".txt", true); 87 88 newFileObject.write(rs.boundaries[0]); 89 newFileObject.Close(); 90 // eventsTable.innerHTML = rs.boundaries[0].length +':'+ rs.boundaries[0]; 91 }); 92 } 93 </script> 94 </body> 95 96 </html>
現在有 了這些邊界坐標數據,就可以在Google地圖中顯示行政區輪廓了。(ps:不知Google是否也有類似百度這樣的獲取邊界坐標的接口,如果你知道怎么實現,請告知,謝謝)。
我把這些從百度獲取的邊界坐標應用到我最近寫的一個地圖下載器當中,實現了按省市下載地圖功能,如下圖所示:

效果不錯吧。
當然行政區的邊界坐標對於我來說,還有其他用途,本人從事GPS方面的軟件開發,一個常見的功能就是“電子圍欄”,來判斷GPS設備是否在某一區域,以前都是單純的設置一個矩形,或者多邊形來判斷,現在可以按省市,甚至縣來作為電子圍欄,這個功能看起來很不錯。
