博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】百度地图api,根据多点注标坐标范围计算地图缩放级别zoom自适应地图
阅读量:6188 次
发布时间:2019-06-21

本文共 2885 字,大约阅读时间需要 9 分钟。

本文记录 如何通过标注点markers的坐标范围来计算百度地图的显示级别zoom。

 

我们要实现的是地图初始化的时候,能够把我们所有的标注点markers显示在地图上,并且让地图有一个合适的显示级别。以提高用户体验。

 

在天地图系列文章里我也介绍了类似的办法来处理天地图的方法,但是也略有不同,天地图的时候我是用的计算经纬度差的方法。 来跟每一个显示级别的差做比较,从而确定天地图的显示级别。

而百度地图我用了另外的办法。 

 

百度地图每一个显示级别对应了一个比例尺,这里我们由比例尺入手。   计算最大经纬度与最小经纬度之间的距离,然后把这个距离乘以10(这里的10表示地图通常占几个比例迟的大小)。再根据这个结果来确定我们的地图应该在一个什么样的比例尺,从而确定我们的缩放级别。

 

1.数据:

 

[javascript]   
 
  1. //数据准备  
  2. var points = [{
    "lng":116,"lat":40,"status":1,"id":50},  
  3. {
    "lng":117,"lat":31,"status":1,"id":2},  
  4. {
    "lng":116,"lat":34,"status":0,"id":3},  
  5. {
    "lng":118,"lat":39,"status":0,"id":4},  
  6. {
    "lng":110,"lat":35,"status":1,"id":5}  
  7. ];  

2.加载地图:

 

 

[javascript]   
 
  1. var map = new BMap.Map("container");    

3.计算最大经纬度,最小经纬度。计算中心点。并调用getZoom()获取显示级别。

 

 

 

[javascript]   
 
  1. //根据原始数据计算中心坐标和缩放级别,并为地图设置中心坐标和缩放级别。  
  2. function setZoom(points){  
  3.     if(points.length>0){  
  4.         var maxLng = points[0].lng;  
  5.         var minLng = points[0].lng;  
  6.         var maxLat = points[0].lat;  
  7.         var minLat = points[0].lat;  
  8.         var res;  
  9.         for (var i = points.length - 1; i >= 0; i--) {  
  10.             res = points[i];  
  11.             if(res.lng > maxLng) maxLng =res.lng;  
  12.             if(res.lng < minLng) minLng =res.lng;  
  13.             if(res.lat > maxLat) maxLat =res.lat;  
  14.             if(res.lat < minLat) minLat =res.lat;  
  15.         };  
  16.         var cenLng =(parseFloat(maxLng)+parseFloat(minLng))/2;  
  17.         var cenLat = (parseFloat(maxLat)+parseFloat(minLat))/2;  
  18.         var zoom = getZoom(maxLng, minLng, maxLat, minLat);  
  19.         map.centerAndZoom(new BMap.Point(cenLng,cenLat), zoom);    
  20.     }else{  
  21.         //没有坐标,显示全中国  
  22.         map.centerAndZoom(new BMap.Point(103.388611,35.563611), 5);    
  23.     }   
  24. }  

4.getZoom()。我写的计算缩放级别的函数。

  1. //根据经纬极值计算绽放级别。  
  2. function getZoom (maxLng, minLng, maxLat, minLat) {  
  3.     var zoom = ["50","100","200","500","1000","2000","5000","10000","20000","25000","50000","100000","200000","500000","1000000","2000000"]//级别18到3。  
  4.     var pointA = new BMap.Point(maxLng,maxLat);  // 创建点坐标A  
  5.     var pointB = new BMap.Point(minLng,minLat);  // 创建点坐标B  
  6.     var distance = map.getDistance(pointA,pointB).toFixed(1);  //获取两点距离,保留小数点后两位  
  7.     for (var i = 0,zoomLen = zoom.length; i < zoomLen; i++) {  
  8.         if(zoom[i] - distance > 0){  
  9.             return 18-i+3;//之所以会多3,是因为地图范围常常是比例尺距离的10倍以上。所以级别会增加3。  
  10.         }  
  11.     };  
  12. }  

5.加载标注点。上一文章的内容。

 

 
  1. //在轨迹点上创建图标,并添加点击事件  
  2. function addMarker(points){  // 创建图标对象     
  3.   
  4.     // 创建标注对象并添加到地图     
  5.     for(var i = 0,pointsLen = points.length;i <pointsLen;i++){  
  6.         var point = new BMap.Point(points[i].lng,points[i].lat);      
  7.         var  marker = new BMap.Marker(point);     
  8.         map.addOverlay(marker);   
  9.         //给标注点添加点击事件。使用立即执行函数和闭包  
  10.         (function() {  
  11.             var thePoint = points[i];  
  12.             marker.addEventListener("click",function(){  
  13.                 showInfo(this,thePoint);  
  14.             });  
  15.         })();  
  16.   
  17.     }  
  18.   
  19. }   

 

 

效果图:

 

如图。一加载百度地图,我们显示的makers标注点刚好在一个比较舒服的显示级别,都在可视范围内。

演示地址:

github:

本文介绍到这里,下一文章我们讲百度地图API实时轨迹。

 

2016-01-08日更新:

评论里有小伙伴说百度地图api就可以实现这个功能,试了一下,效果很好,建议大家使用这种方法。 非常感谢。    

 

 
  1. var points = [point1, point2,point3];  
  2. var view = map.getViewport(eval(points));  
  3. var mapZoom = view.zoom;   
  4. var centerPoint = view.center;   
  5. map.centerAndZoom(centerPoint,mapZoom);  

 喝水不忘挖井人,原文链接:http://blog.csdn.net/liusaint1992/article/details/50071613#comments

转载于:https://www.cnblogs.com/lanshangyi/p/6386756.html

你可能感兴趣的文章
【spring】让spring的注解和xml配置文件变得优雅,最常用的注解
查看>>
EM算法小结
查看>>
系统之间接口的可移植性考虑
查看>>
php学习函数如何执行的
查看>>
android adb端口被占用问题
查看>>
状态压缩
查看>>
hdu-2844&&POJ-1742 Coins---多重背包
查看>>
javascript 去除空格 方法
查看>>
Spring3- Spring 自动装配 Bean
查看>>
C++练习--实现客户机(CLIENT)类
查看>>
多接口网桥——以太网交换机
查看>>
输入一组数组,回车结束
查看>>
手动创建oem
查看>>
python的标准模块
查看>>
Django urls 路由系统
查看>>
Nlpir Parser智能语义分析系统文本新算法
查看>>
再读《数据库系统概论书》
查看>>
网页游戏开发(一)------ Hello,World
查看>>
mongo数据更新(修改器)
查看>>
【leetcode】966. Vowel Spellchecker
查看>>