寻找薛定谔的猫

导航

 

最近项目中遇到一个地图显示的问题

从数据库查询到一个数据集,其中每条数据都包含自己的地理位置信息(经度、纬度、省、市),需要在地图上显示这些数据的分布,并高亮显示

省市字段的值并不规范,可能由于填写并不正确而找不到经纬度

于是我打算通过表中的经纬度逆向解析省市名称,再描绘省市的边框,填充颜色从而达到高亮显示的效果

这里我图方便直接用省市名称了,如果你想通过经纬度获取省市名称,只需调用下面的连接即可

http://api.map.baidu.com/geocoder/v2/?ak=你的ak值&callback=renderReverse&location=36.131234,114.297000&output=json&pois=1

先看运行效果

请注意我把演示代码传到了github上,由于github是基于https协议的,不允许引用http的脚本

所以应该把百度地图api连接改为如下格式,参数加一个s=1

<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=你的ak值&s=1"></script>

jquery也改为CDN的标准连接

<script src="https://cdn.bootcss.com/jquery/1.11.2/jquery.js"></script>

 

下面是代码

  1 <!DOCTYPE html>
  2 
  3 <html>
  4 <head>
  5     <meta name="viewport" content="width=device-width" />
  6     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7     <title></title>
  8     <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
  9     <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的ak值"></script>
 10     <script type="text/javascript" src="http://api.map.baidu.com/library/AreaRestriction/1.2/src/AreaRestriction_min.js"></script>
 11     
 12     <style type="text/css">
 13         html, body {
 14             margin: 0px;
 15             padding: 0px;
 16         }
 17         #container {
 18             height: 600px;
 19         }
 20     </style>
 21 </head>
 22 
 23 <body>
 24     <div id="container"></div>
 25 
 26 
 27 <script type='text/javascript'>
 28 //需引用api.map.baidu.com/library/AreaRestriction/1.2/src/AreaRestriction_min.js
 29 var map = new BMap.Map("container",{ minZoom : 5,maxZoom:20 }); // 创建地图实例
 30 //设置个性化样式
 31 map.setMapStyle({
 32       styleJson:  [{
 33             "featureType": "road",
 34             "elementType": "all",
 35             "stylers": {
 36                     "color": "#ffffff",
 37                     "visibility": "off"
 38                    }
 39             }]
 40 });
 41 
 42 map.enableScrollWheelZoom();
 43 map.enableDragging();
 44 map.disableDoubleClickZoom();
 45 
 46 var blist = [];
 47 var districtLoading = 0;
 48 
 49 /*
 50 =====获取行政区域边界=====
 51 */
 52 function getBoundary() {   
 53     addDistrict("辽宁省");
 54     addDistrict("河北省");
 55     addDistrict("陕西省");
 56     addDistrict("江西省");
 57     addDistrict("石家庄");
 58     addDistrict("青岛");
 59 }
 60 
 61 /*
 62 =====添加行政区域=====
 63 */
 64 function addDistrict(districtName) {
 65     //使用计数器来控制加载过程
 66     districtLoading++;
 67     var bdary = new BMap.Boundary();
 68     bdary.get(districtName, function (rs) {       //获取行政区域
 69         var count = rs.boundaries.length; //行政区域的点有多少个
 70         for (var i = 0; i < count; i++) {
 71             blist.push({ points: rs.boundaries[i], name: districtName });
 72         };
 73         //加载完成区域点后计数器-1
 74         districtLoading--;
 75         if (districtLoading == 0) {
 76             //全加载完成后画端点
 77             drawBoundary();
 78         }
 79     });
 80 }
 81 
 82 /*
 83 =====点击行政区域事件=====
 84 */
 85 function click(evt) {
 86     alert(evt.target.name);
 87 }
 88 /*
 89 =====绘制边界=====
 90 */
 91 function drawBoundary() {
 92     //包含所有区域的点数组
 93     var pointArray = [];
 94     //循环添加各闭合区域
 95     for (var i = 0; i < blist.length; i++) {
 96         //添加多边形层并显示
 97         var ply = new BMap.Polygon(blist[i].points, { 
 98                                           strokeWeight: 1,   //边框宽度
 99                                           trokeColor: "#014F99",   //边框颜色
100                                           fillColor: " #DDE4F0" //填充颜色
101                                        }); //建立多边形覆盖物
102         ply.name = blist[i].name;
103         ply.addEventListener("click", click);
104         map.addOverlay(ply);
105 
106         //将点增加到视野范围内
107         var path = ply.getPath();
108         pointArray = pointArray.concat(path);
109     }
110 
111     //限定显示区域(只显示特定区域,鼠标拖动松开后自动回到显示范围内),需要引用api库
112    // var boundply = new BMap.Polygon(pointArray);
113    // BMapLib.AreaRestriction.setBounds(map, boundply.getBounds());
114     map.setViewport(pointArray);    //调整视野 
115 }
116 
117 setTimeout(function () {
118     getBoundary();
119 }, 100);
120 </script>
121 </body>
122 </html>

运行效果如下

posted on 2018-04-18 21:05  teagueli  阅读(16054)  评论(0编辑  收藏  举报