Показать как можно больше карты, не дублируя и не показывая области за пределами карты

#leaflet

#листовка

Вопрос:

Моя карта занимает 100% экрана, и я показываю весь мир, когда пользователь загружает карту.

При первой загрузке я пытаюсь показать как можно больше мира, учитывая эти три условия:

  • Нулевой меридиан на экваторе находится в центре экрана.
  • Карта увеличена настолько, что область выше 90 градусов широты и ниже 90 градусов долготы не отображается.
  • Карта увеличена настолько, что области слева и справа от карты не дублируются. В принципе, нет двух или более Аляски или России.

В настоящее время я использую .fitBounds([[-90, -180], [90, 180]]); , но это соответствует только моим первым критериям. Каков наилучший подход к этому?

Ответ №1:

Используйте maxZoom опцию карты вместе с вызовом getBoundsZoom метода.

А именно, вы хотите рассчитать уровень масштабирования, при котором [-85.0511, -180], [85.0511, 180]] охват прямоугольника покрывает больше, чем весь экран просмотра карты, затем установите для карты maxZoom это значение.

Обратите внимание, что максимальные и минимальные широты равны /-85.0511, а не /-90; проекция карты по умолчанию Листовки (EPSG:3857, он ЖЕ web mercator) представляет собой цилиндрическую проекцию, которая простирается вертикально до бесконечности и не имеет представления полюсов.

Также обратите внимание, что выходные getBoundsZoom данные зависят от значений параметра карты zoomSnap и размера контейнера карты. Возможно, вам захочется пересчитать карту maxZoom при каждом изменении ее размера.

tl; dr: map.setMaxZoom(map.getBoundsZoom([-85.0511, -180], [85.0511, 180]], true)); .