从百度获取地图行政区划边界

@豆奶 同学给我出了题目. 题目中的一部分可以理解为是获取某一地区的边界. 故有此文. 

百度有 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. 对于附近一部分水域也会算上, 因此不一定符合沿海, 湖周边地区数据统计需要. 

 

posted @ 2015-06-06 22:05  willowfly  阅读(7952)  评论(0编辑  收藏  举报