從百度獲取地圖行政區划邊界


@豆奶 同學給我出了題目. 題目中的一部分可以理解為是獲取某一地區的邊界. 故有此文. 

百度有 LBS 的開發者服務, 但是需要注冊開發者並獲取 key, 而我抱着能簡單就簡單的原則, 就不樂意做這樣的事情. 當然如果真有項目的話, 注冊必須的啦. 我在 http://developer.baidu.com/map/jsdemo.htm#c1_10 發現了度娘提供的一個代碼演示, 不用 key 就可以獲得一些簡單的結果. 

其代碼為

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
 6     <style type="text/css">
 7         body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微軟雅黑";}
 8     </style>
 9     <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密鑰"></script>
10     <title>添加行政區划</title>
11 </head>
12 <body>
13     <div id="allmap"></div>
14       
15 </body>
16 </html>
17 <script type="text/javascript">
18     // 百度地圖API功能
19     var map = new BMap.Map("allmap");
20     map.centerAndZoom(new BMap.Point(116.403765, 39.914850), 5);
21     map.enableScrollWheelZoom();
22 
23     function getBoundary(){       
24         var bdary = new BMap.Boundary();
25         bdary.get("重慶", function(rs){       //獲取行政區域
26             map.clearOverlays();        //清除地圖覆蓋物       
27             var count = rs.boundaries.length; //行政區域的點有多少個
28             for(var i = 0; i < count; i++){
29                 var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#ff0000"}); //建立多邊形覆蓋物
30                 map.addOverlay(ply);  //添加覆蓋物
31                 map.setViewport(ply.getPath());    //調整視野         
32             }                
33         });   
34     }
35 
36     setTimeout(function(){
37         getBoundary();
38     }, 2000);
39 </script>

利用 getBoundary() 獲取 Bourndary 數據並存為 rs.boundaries 里. 話說為什么是默認是重慶呢. 接下來的任務就簡單了, 只要獲取 rs.boundaires 的數據就可以了. 稍稍修改下代碼: 

 1 <html>
 2 <head>
 3 // 略
 4 </head>
 5 <body>
 6     <input type='text' name='text1' />  //*** 插入一個輸入文本框
 7     <div id="allmap"></div>  
 8 </body>
 9 </html>
10 <script type="text/javascript">
11     //
12     function getBoundary(){       
13         var bdary = new BMap.Boundary();
14         bdary.get("重慶", function(rs){       //獲取行政區域
15             map.clearOverlays();        //清除地圖覆蓋物       
16             var count = rs.boundaries.length; //行政區域的點有多少個
17             document.all.text1.value = rs.boundaries; //***將數據賦給文本框
18             for(var i = 0; i < count; i++){
19                         // 下略
20 </script>
在 HTML 代碼中添加 <input type='text' name='text1' />  //*** 插入一個輸入文本框
並在 js 代碼中添加:
document.all.text1.value = rs.boundaries; //***將數據賦給文本框

運行以后得到:

將上面的文本框內的數據復制到文本編輯器中, 愛怎么搗鼓怎么搗鼓. 其數據格式很簡單, 就是

x坐標, y坐標; x坐標, y坐標; ......  x坐標, y坐標;

挺方便的轉換的. 寫 matlab 代碼如下

function plotmap()

close all; clear all; clc; data = [109.756569, 30.833813; 109.773902, 30.84064; 109.788836, 30.854885; %... 各種數據,109.739207, 30.824822; 109.756569, 30.833813]; myarea.('x') = data(:,1); myarea.('y') = data(:,2); plot(myarea.('x'),myarea.('y'),'linewidth',2,'color',[0.8,0,0]); set(gcf,'color','w') axis off; end

得到圖: 

 

目前有三個問題: 

1. 地圖最小行政級別到縣. 直轄市到區. 

2. 對於較小行政單位其曲線精度不是太高. 

3. 對於附近一部分水域也會算上, 因此不一定符合沿海, 湖周邊地區數據統計需要. 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM