2011-08-26 40 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

相关问题