天地圖專題三:根據標註點的範圍確定天地圖的中心點和縮放級別
上一篇文章寫了 如何在天地圖上迴圈顯示標註點以及懸停顯示資訊視窗。以及在標註點下面顯示標註點的名字。
但實際運用中我們常常有這樣的需求。
1.儘可能把所有的標註點放在我們地圖的可視範圍內。
2.在滿足1的情況下,讓縮放級別儘可能的高,以使我們可以看到更多的資訊。
為了滿足上面的需求,實際上就是要我們根據所有的標註點的經緯度,分析出初始化地圖時的 地圖中心點 和 地圖縮放級別。
地圖中心點比較好求,直接用所有標註點的
(最大經度+最小經度)/2 = 中心點經度
(最大緯度+最小緯度)/2 = 中心點緯度
而縮放級別我們則要從 最大經度差和最大緯度差入手。
我們這裡還要比較一下最大經度差和最大緯度差,再確定以哪一個為計算標準。
步驟:
1.準備資料。標註點的資訊。
var lnglats = [ {"B":"23.1","L":"113.3","PName":"1111","Status":1}, {"B":"23.2","L":"113.4","PName":"2222","Status":1}, {"B":"22.9","L":"113.1","PName":"3333","Status":3004}, {"B":"23.7","L":"113.8","PName":"第四個點","Status":1}, {"B":"23.8","L":"113.5","PName":"第五個點","Status":1}, {"B":"23.3","L":"113.2","PName":"第六個點","Status":1}, {"B":"23.1","L":"113.7","PName":"7777","Status":1}, {"B":"23.5","L":"113.3","PName":"8888","Status":1}]; //這是頁面需要的資料。實際應用中常用ajax獲取。座標點狀態。點的型別。點的名字。
2.計算最大經緯度。
var maxl = lnglats[0].L,minl=lnglats[0].L,maxb=lnglats[0].B,minb=lnglats[0].B;
$.each(lnglats,
function(i, res) {
if(res.L > maxl) maxl =res.L;
if(res.L < minl) minl =res.L;
if(res.B > maxb) maxb =res.B;
if(res.B < minb) minb =res.B;
});
3.計算 地圖中心點,注意 parseFloat。
var cenB =(parseFloat(maxb)+parseFloat(minb))/2; var cenL= (parseFloat(maxl)+parseFloat(minl))/2;
4.下面是計算縮放級別。 這個也是查了不少資料最後才得到的方法。 是以最大經度差與最大緯度差 按一定的比例計算出比較大的標準值。 然後再由這個標準值來計算級別。
首先定義兩個陣列。 zoomArr表示對應的顯示級別。 而diffArr對應 經緯度的差值。 這個差值大於180的時候,顯示級別為1. 差值大於90度的時候,顯示級別為2,差值大於45度的時候,顯示級別為3……依次類推。最終得到最適合的縮放級別。 而這些差值與級別的對應關係,以及經緯差值之間的計算比例,是經過了我不少的除錯得出來的。 也是花了一點功夫的。 越是顯示級別大的時候,越小的差值引起的誤差就可能越大。所以我們這裡預設最大的顯示級別為14。也就是說,如果差值比我們差值陣列中最小的差值還小的話,我們就返回14。
其他的地圖api大概也可以使用類似的方法。
var zoom = getZoom(maxl, minl, maxb, minb);
//通過經緯度縮放級別
function getZoom(maxJ, minJ, maxW, minW) {
if (maxJ == minJ && maxW == minW) return 13;
var diff = maxJ - minJ;
if (diff < (maxW - minW) * 2.1) diff = (maxW - minW) * 2.1;
diff = parseInt(10000 * diff) / 10000;
var zoomArr = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
var diffArr = new Array(180, 90, 45, 22, 11, 5.5, 2.75, 1.37, 0.68, 0.34, 0.17, 0.08, 0.04);
for (var i = 0; i < diffArr.length; i++) {
if ((diff - diffArr[i]) >= 0) {
return zoomArr[i];
}
}
return 14;
}
5.用計算出的縮放級別與中心點載入天地圖。
//載入基本地圖和導航
function loadMap(){
try {
map = new TMap("mapDiv"); //初始化地圖物件
if (zoom == 1) { // 如果級別是1的話,就顯示整張地圖了。
cenB = 0;
cenL = 0;
}
map.centerAndZoom(new TLngLat(cenL, cenB), zoom);//設定顯示地圖的中心點和級別
map.enableHandleMouseScroll(); //允許滑鼠雙擊放大地圖
} catch(err) {
alert('天地圖載入不成功,請稍候再試!你可以先使用其他功能!');
}
}
至於標註點的顯示等功能,則參考上一文章的內容。
最終地圖初始化時的效果圖:
如果所示:我們標註點資料中的所有點都在天地圖的可視範圍內了。
注意:後來發現天地圖有這個功能的原生介面。大家可以用這個。上面的就當拓展思路吧。
setViewport(view:Array<TLngLat>) | none | 根據提供的座標點陣列設定地圖視野,調整後的視野會保證包含提供的座標點。 |
更多天地圖api運用的內容請關注本系列後續文章。轉載請註明出處。