【轉】百度地圖api,根據多點注標坐標范圍計算地圖縮放級別zoom自適應地圖


本文記錄 如何通過標注點markers的坐標范圍來計算百度地圖的顯示級別zoom。

 

我們要實現的是地圖初始化的時候,能夠把我們所有的標注點markers顯示在地圖上,並且讓地圖有一個合適的顯示級別。以提高用戶體驗。

 

在天地圖系列文章里我也介紹了類似的辦法來處理天地圖的方法,但是也略有不同,天地圖的時候我是用的計算經緯度差的方法。 來跟每一個顯示級別的差做比較,從而確定天地圖的顯示級別。

而百度地圖我用了另外的辦法。 

 

百度地圖每一個顯示級別對應了一個比例尺,這里我們由比例尺入手。   計算最大經緯度與最小經緯度之間的距離,然后把這個距離乘以10(這里的10表示地圖通常占幾個比例遲的大小)。再根據這個結果來確定我們的地圖應該在一個什么樣的比例尺,從而確定我們的縮放級別。

 

1.數據:

 

[javascript]  view plain  copy
 
  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]  view plain  copy
 
  1. var map = new BMap.Map("container");    


3.計算最大經緯度,最小經緯度。計算中心點。並調用getZoom()獲取顯示級別。

 

 

 

[javascript]  view plain  copy
 
  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標注點剛好在一個比較舒服的顯示級別,都在可視范圍內。

演示地址:http://runningls.com/demos/baidumap/zoom.html

github:https://github.com/liusaint/baiduMap

本文介紹到這里,下一文章我們講百度地圖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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM