Функция jQuery для возврата уровня масштабирования карты Google - PullRequest
0 голосов
/ 26 августа 2011

как указано на 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
}

Я думал о выполнении вложенных, если еще больше / меньше условий, но разве нет более упорядоченного подхода?

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

Каждое уменьшение уровня масштабирования означает удвоение метров, поэтому вам не нужно сохранять каждое отдельное значение.

Вы можете попробовать это:

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;
}
1 голос
/ 26 августа 2011

Если вы сохранили уровни масштабирования в массиве, например,

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...