@豆奶 同学给我出了题目. 题目中的一部分可以理解为是获取某一地区的边界. 故有此文.
百度有 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. 对于附近一部分水域也会算上, 因此不一定符合沿海, 湖周边地区数据统计需要.