2015-08-05 3 views
0

В моем веб-приложении у меня есть координаты, которые я бы хотел изменить, чтобы имитировать «масштабирование» на картах google. Кажется, что масштабирование взад и вперед по картам google просто удваивает или уменьшает каждую сторону ограничивающей рамки. Так что моя функция, чтобы сделать это на сервере выглядит следующим образом:Алгоритм масштабирования Google Maps

private static decimal[] ZoomIn(decimal latMax, decimal lngMin, decimal latMin, decimal lngMax) 
{ 
    decimal lngAdjustment = (lngMax - lngMin) * .25m; 
    decimal latAdjustment = (latMax - latMin) * .25m; 
    return new[] 
    { 
     // North 
     latMax - latAdjustment, 
     // West 
     lngMin + lngAdjustment, 
     // South 
     latMin + latAdjustment, 
     // East 
     lngMax - lngAdjustment 
    }; 
} 

Проблема с этим подходом является latAdjustment, что я делаю. По сравнению с фактическим увеличением с помощью управления картами google, это становится довольно точным при увеличении до уровня города. Тем не менее, это менее точно, чем больше вид увеличен. Я предполагаю, что это связано с проекцией Меркатора Земли, которую используют карты Google. Кто-нибудь знает о лучшей формуле или методе для имитации «увеличения»?

Обновление: Моя проблема связана не с тем, чтобы не знать правильную формулу, а по карте Google. Позвольте мне проиллюстрировать использование некоторых номеров примеров.

Возьмите Чикаго, сосредоточенных в 41.8563226156679, -87,7339862646484

И ограничительную рамку, окружающую эту точку:

  • West: -87,984955197753800
  • Восток: -87,483017331542900
  • Юг: 41,546931599561100
  • Север: 42.164224124684300

Наблюдая поведение карты Google, это ограничивающее окно увеличено на одном уровне будет: - Запад: -87,859470731201100 - Восток: -87,608501798095600 - Юг: 41,701813184067600 - Север: 42,010459667660800

(центр остался неизменным, нет отклонения от движения мыши и т. д. Я просто использовал кнопку ручного масштабирования, а не мышь)

Используя мою формулу выше, значения долготы выйдут правильно. Пример:

запад = запад + (запад - восток) * .25 -87,984955197753800 + ((-87,483017331542900 - -87,984955197753800) * .25) = -87,859470731201075

Однако та же формула не будет работать, если имея дело с широтой. Он находится рядом с правильными значениями, но достаточно, чтобы карта заметно изменилась. Этот эффект хуже с большими ограничивающими прямоугольниками и/или когда широта дальше от экватора. Я предполагаю, что это связано с проекцией мерцатора Земли. Класс Trig был давным-давно для меня, и на данный момент я не могу найти подходящую формулу для широты масштабирования для этой ситуации.

+0

Является ли _only_ 'latAdjustment' неточным? – bcdan

+0

@bcdan yes, lngAdjustment is corrent –

+0

Похоже, что координаты края экрана неправильные. Каков ваш метод тестирования? Компьютер-зум? Прокрутка мыши? – bcdan

ответ

0

Судя по тому, что ваш метод тестирования использует мышь, мне кажется, что ваш метод тестирования является проблемой. Так как карта масштабируется по-разному на основе центрирования мыши, а не центра экрана, границы границ меняются, но не разница между ними. Это, похоже, совпадает с данными, которые вы указали.

Интуитивно, нет ничего плохого в вашей формуле - просто как вы ее протестировали.

Смежные вопросы