本文记录 如何通过标注点markers的坐标范围来计算百度地图的显示级别zoom。
 
我们要实现的是地图初始化的时候,能够把我们所有的标注点markers显示在地图上,并且让地图有一个合适的显示级别。以提高用户体验。
 
在天地图系列文章里我也介绍了类似的办法来处理天地图的方法,但是也略有不同,天地图的时候我是用的计算经纬度差的方法。 来跟每一个显示级别的差做比较,从而确定天地图的显示级别。
而百度地图我用了另外的办法。 
 
百度地图每一个显示级别对应了一个比例尺,这里我们由比例尺入手。   计算最大经纬度与最小经纬度之间的距离,然后把这个距离乘以10(这里的10表示地图通常占几个比例迟的大小)。再根据这个结果来确定我们的地图应该在一个什么样的比例尺,从而确定我们的缩放级别。
 
1.数据:
 
- var points = [{"lng":116,"lat":40,"status":1,"id":50},  
- {"lng":117,"lat":31,"status":1,"id":2},  
- {"lng":116,"lat":34,"status":0,"id":3},  
- {"lng":118,"lat":39,"status":0,"id":4},  
- {"lng":110,"lat":35,"status":1,"id":5}  
- ];  
 
2.加载地图:
 
 
- var map = new BMap.Map("container");    
 
3.计算最大经纬度,最小经纬度。计算中心点。并调用getZoom()获取显示级别。
 
 
 
- function setZoom(points){  
-     if(points.length>0){  
-         var maxLng = points[0].lng;  
-         var minLng = points[0].lng;  
-         var maxLat = points[0].lat;  
-         var minLat = points[0].lat;  
-         var res;  
-         for (var i = points.length - 1; i >= 0; i--) {  
-             res = points[i];  
-             if(res.lng > maxLng) maxLng =res.lng;  
-             if(res.lng < minLng) minLng =res.lng;  
-             if(res.lat > maxLat) maxLat =res.lat;  
-             if(res.lat < minLat) minLat =res.lat;  
-         };  
-         var cenLng =(parseFloat(maxLng)+parseFloat(minLng))/2;  
-         var cenLat = (parseFloat(maxLat)+parseFloat(minLat))/2;  
-         var zoom = getZoom(maxLng, minLng, maxLat, minLat);  
-         map.centerAndZoom(new BMap.Point(cenLng,cenLat), zoom);    
-     }else{  
-         
-         map.centerAndZoom(new BMap.Point(103.388611,35.563611), 5);    
-     }   
- }  
 
4.getZoom()。我写的计算缩放级别的函数。
- function getZoom (maxLng, minLng, maxLat, minLat) {  
-     var zoom = ["50","100","200","500","1000","2000","5000","10000","20000","25000","50000","100000","200000","500000","1000000","2000000"]
-     var pointA = new BMap.Point(maxLng,maxLat);  
-     var pointB = new BMap.Point(minLng,minLat);  
-     var distance = map.getDistance(pointA,pointB).toFixed(1);  
-     for (var i = 0,zoomLen = zoom.length; i < zoomLen; i++) {  
-         if(zoom[i] - distance > 0){  
-             return 18-i+3;
-         }  
-     };  
- }  
5.加载标注点。上一文章的内容。
 
 
- function addMarker(points){  
-   
-     
-     for(var i = 0,pointsLen = points.length;i <pointsLen;i++){  
-         var point = new BMap.Point(points[i].lng,points[i].lat);      
-         var  marker = new BMap.Marker(point);     
-         map.addOverlay(marker);   
-         
-         (function() {  
-             var thePoint = points[i];  
-             marker.addEventListener("click",function(){  
-                 showInfo(this,thePoint);  
-             });  
-         })();  
-   
-     }  
-   
- }   
 
 
 
效果图:

 
如图。一加载百度地图,我们显示的makers标注点刚好在一个比较舒服的显示级别,都在可视范围内。
演示地址:http://runningls.com/demos/baidumap/zoom.html
github:https://github.com/liusaint/baiduMap
本文介绍到这里,下一文章我们讲百度地图API实时轨迹。
 
2016-01-08日更新:
评论里有小伙伴说百度地图api就可以实现这个功能,试了一下,效果很好,建议大家使用这种方法。 非常感谢。    
 
 
- var points = [point1, point2,point3];  
- var view = map.getViewport(eval(points));  
- var mapZoom = view.zoom;   
- var centerPoint = view.center;   
- map.centerAndZoom(centerPoint,mapZoom);  
 
 喝水不忘挖井人,原文链接:http://blog.csdn.net/liusaint1992/article/details/50071613#comments
【转】百度地图api,根据多点注标坐标范围计算地图缩放级别zoom自适应地图
原文:http://www.cnblogs.com/lanshangyi/p/6386756.html