1. 程式人生 > >從百度地圖批量獲取中國縣級以上行政區劃邊界座標

從百度地圖批量獲取中國縣級以上行政區劃邊界座標

不知道從什麼時候開始,在Google地圖或是百度地圖中用城市或者省名稱搜尋的時候,你會發現地圖上會勾勒出搜尋的行政區的輪廓來,這個功能非常人性化。

比如在百度地圖中搜索“廣西” ,地圖顯示如下圖所示:

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

如何實現上面的效果的,據我所知百度API已經開放了獲取行政區邊際座標的介面,相關說明可以參考

這裡有一篇關於如何獲取行政區域的邊界?的文章,本人根據這篇文章提供的程式碼稍作修改,把中國省市(地級市)邊界座標收入囊中

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>獲取地區輪廓線</title>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script>
    <script type="text/javascript" src="CityData.js"></script>
    <style type="text/css">
        body {
            font-size: 13px;
            margin: 10px
        }
        #container {
            width: 800px;
            height: 500px;
            border: 1px solid gray
        }
    </style>
</head>

<body>
    <div id="container"></div>
    <div id="event_descr"></div>
    <br />輸入省、直轄市或縣名稱:
    <input type="text" id="districtName" style="width:80px" value="桂林市">
    <input type="button" onclick="getBoundary()" value="獲取輪廓線">
    <script type="text/javascript">
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        
        var folderName = "C:\\china\\";
        if (!fso.FolderExists(folderName)) fso.CreateFolder(folderName);
        
        var map = new BMap.Map("container");
        map.centerAndZoom(new BMap.Point(116.403765, 39.914850), 5);
        map.addControl(new BMap.NavigationControl({
            type: BMAP_NAVIGATION_CONTROL_SMALL
        }));
        map.enableScrollWheelZoom();
         //直轄市 
        if (cityData.municipalities && cityData.municipalities.length > 0) {
            for (var i = 0, n = cityData.municipalities.length; i < n; i++) {
                var mu = cityData.municipalities[i];
                getBoundary(mu.n, "");
            }
        }
         // 普通省
        for (var i = 0, n = cityData.provinces.length; i < n; i++) {
            var pv = cityData.provinces[i];
            var newFolderName = folderName + pv.n
            if (!fso.FolderExists(newFolderName)) newFolderName = fso.CreateFolder(folderName + pv.n);
            getBoundary(pv.n, "");
            for (var j = 0, m = pv.cities.length; j < m; j++) {
                getBoundary(pv.cities[j].n, pv.n);
            }

        }

         // 其他地區
        if (cityData.other && cityData.other.length > 0) {
            for (var i = 0, n = cityData.other.length; i < n; i++) {
                var oth = cityData.other[i];
                getBoundary(oth.n, "");
            }

        }

        function getBoundary(name, pvName) {
            var bdary = new BMap.Boundary();

            bdary.get(name, function(rs) { //獲取行政區域
                //  map.clearOverlays(); //清除地圖覆蓋物       
                //  var count = rs.boundaries.length; //行政區域的點有多少個
                //  for (var i = 0; i < count; i++) {
                //      var ply = new BMap.Polygon(rs.boundaries[i], {
                //           strokeWeight: 2,
                //           strokeColor: "#ff0000"
                //       }); //建立多邊形覆蓋物
                //       map.addOverlay(ply); //新增覆蓋物
                //     map.setViewport(ply.getPath()); //調整視野         

                //  }
                var fileName = "";
                var newFileObject = null;
                if (pvName == "") newFileObject = fso.CreateTextFile(folderName + name + ".txt", true)
                else newFileObject = fso.CreateTextFile(folderName + pvName + "\\" + name + ".txt", true);

                newFileObject.write(rs.boundaries[0]);
                newFileObject.Close();
                //  eventsTable.innerHTML = rs.boundaries[0].length +':'+ rs.boundaries[0];
            });
        }
    </script>
</body>

</html>

現在有 了這些邊界座標資料,就可以在Google地圖中顯示行政區輪廓了。(ps:不知Google是否也有類似百度這樣的獲取邊界座標的介面,如果你知道怎麼實現,請告知,謝謝)。

我把這些從百度獲取的邊界座標應用到我最近寫的一個地圖下載器當中,實現了按省市下載地圖功能,如下圖所示:

效果不錯吧。

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

原文地址:http://www.cnblogs.com/i-gps/archive/2012/05/18/2507941.html