簡體   English   中英

jQuery函數返回google map縮放級別

[英]jQuery function to return google map zoom level

http://laudontech.com/GISBlog/?p=28所引用,我知道Google地圖縮放級別的比例尺(以米為單位):

縮放級別0 1:20088000.56607700米

縮放級別1 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
}

我曾考慮過要進行嵌套(如果有更多/更少的條件),但是沒有更簡化的方法嗎?

縮放級別的每次降低都意味着米的加倍,因此您不必存儲每個單獨的值。

您可以嘗試以下方法:

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;
}

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

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM