2011-08-26 74 views
0

截至http://laudontech.com/GISBlog/?p=28參考,我知道在谷歌地圖的縮放級別米的規模:jQuery函數返回谷歌地圖縮放級別

縮放等級爲0 1:20088000.56607700米

縮放級別1: 10044000.28303850米

縮放級別2 1:5022000.14151925米

縮放級別3 1:2511000.07075963米

變焦4級1:1255500.03537981米

變焦5級1:627750.01768991米

變焦6級1:313875.00884495米

變焦7級1:156937.50442248米

縮放級別8 1:78468.75221124米

縮放等級9 1:39234.37610562米

縮放級別10 1:19617.18805281米

縮放級別11 1:9808.59402640米

縮放級別12 1:4909.29701320米

縮放級別13 1:2452.14850660米

縮放級別14 1: 1226.07425330米

縮放級別15 1:613.03712665米

縮放級別16 1:306。 51856332米

變焦17級1:153.25928166米

縮放級別18 1:76.62964083米

縮放級別19 1:38.31482042米

我想用這個信息來創建功能如此:

function getZoomLevel(meters) { 
    //take input in whole meters 
    //return best match for zoom level as integer 
} 

我想過要做嵌套if else else/less然後條件,但沒有更簡化的方法?

回答

3

縮放級別的每次下降意味着雙倍的米,所以你不必存儲每個單獨的值。

你可以試試這個:

function getZoomLevel(m){ 
    var z=0; 
    var i=20088000; 
    while(i/2>=m && z<19){ 
     z++; 
     i=i/2; 
    } 
    return z; 
} 

其儘快返回下一個較小的變焦水平米,超過目前的水平。

或更好:

function getZoomLevel(m){ 
    var z=Math.floor((Math.log(20088000/m))/Math.log(2)); 
    if (z>19) z=19; 
    if (z<0) z=0; 
    return z; 
} 
+0

什麼是「/ 2」位?不知道我明白了。 – Inator

+0

while循環的每次迭代縮放級別都會增加,「米數」除以2 – stewe

+0

好吧,我現在得到它......沒有注意到縮放數據中的圖案,直到我仔細觀察。 – Inator

1

如果將縮放級別存儲在數組中,例如

var zoomLevels = [ 
    20088000.56607700, 
    10044000.28303850, 
    5022000.14151925, 
    2511000.07075963 
    // etc. ... 
]; 

然後重複以獲得最佳擬合。因爲已知縮放級別數組正在減少,因此搜索將是O(n)

function getZoomLevel(meters) { 
    for (var idx = 0; idx < zoomLevels.length; ++idx) { 
     if (zoomLevels[idx] < meters) { 
      return idx; 
     } 
    } 
    return zoomLevels.length - 1; 
} 
+0

「因爲衆所周知,縮放級別陣列正在下降」的意思是,你會找到正確的答案,這是O(n),因爲它是線性搜索。但那只是挑選挑剔。 –

+0

有道理。所以第一次zoomLevel小於米,它會引發回報,對吧?試圖用jQuery each()函數來重寫它。 – Inator

+0

功能getZoomLevel(米){ \t。每$(zoomLevels,函數(指數,值){ 如果(值<米){ 返回索引; } \t}); } – Inator

相關問題