Ограничения углов наклона

В библиотеке Mapbox GL JS наклон карты управляется параметром pitch — углом наклона камеры относительно поверхности земли. Значение pitch измеряется в градусах и определяет, насколько сильно карта «наклонена» в перспективе:

  • 0 — полностью ортографический вид сверху
  • ~45 — умеренная перспектива
  • >60 — выраженный 3D-эффект
  • ~85–89 — почти горизонтальный взгляд вдоль поверхности

Параметр pitch является частью камеры вместе с center, zoom и bearing, образуя единое состояние визуализации сцены.


Диапазон допустимых значений наклона

Ограничение угла наклона задаётся через свойства minPitch и maxPitch. Они контролируют допустимый диапазон значений, которые может принимать камера:

  • minPitch — минимальный угол наклона
  • maxPitch — максимальный угол наклона

Пример конфигурации при инициализации карты

const map = new mapboxgl.Map({
  container: 'map',
  style: 'mapbox://styles/mapbox/streets-v12',
  center: [37.6173, 55.7558],
  zoom: 12,
  pitch: 30,
  minPitch: 0,
  maxPitch: 60
});

В данном случае пользователь не сможет наклонить карту ниже 0° и выше 60°, даже при использовании жестов или программного управления камерой.


Ограничение наклона через методы экземпляра карты

Помимо конфигурации при создании карты, ограничения могут изменяться динамически:

map.setMinPitch(10);
map.setMaxPitch(75);

Эти методы переопределяют текущие ограничения без необходимости пересоздания карты. Изменения применяются сразу ко всем последующим интерактивным и программным действиям камеры.


Поведение пользовательских взаимодействий при ограничениях

Ограничения pitch влияют на несколько типов взаимодействий:

Перетаскивание с наклоном

Если включено dragRotate и pitchWithRotate, пользователь может одновременно вращать и наклонять карту. При достижении границы:

  • дальнейшее увеличение угла блокируется
  • инерция движения обрезается на предельном значении
  • визуальный отклик сохраняется, но без выхода за пределы

Жесты на сенсорных устройствах

На мобильных устройствах:

  • два пальца управляют наклоном
  • ограничения применяются аналогично десктопу
  • при достижении minPitch или maxPitch жест теряет эффект увеличения угла

Связь pitch с режимом 3D и terrain

При использовании 3D-слоёв и рельефа ограничения угла наклона приобретают функциональное значение.

Terrain и минимальный наклон

При включённом рельефе:

map.setTerrain({ source: 'mapbox-dem', exaggeration: 1.5 });

малые значения pitch (0–10°) часто теряют смысл, так как рельеф визуально «не раскрывается». В таких случаях минимальный угол обычно повышается до 30–40°.

Максимальный наклон и читаемость сцены

При больших значениях pitch:

  • объекты на переднем плане начинают перекрывать дальние области
  • вертикальные искажения усиливаются
  • навигация по карте становится менее точной

Поэтому maxPitch часто ограничивается диапазоном 60–70° для интерфейсов с высокой плотностью данных.


Программное управление наклоном

Изменение наклона через API камеры выполняется методом setPitch:

map.setPitch(45);

С учётом ограничений значение автоматически нормализуется:

  • если pitch > maxPitch, применяется maxPitch
  • если pitch < minPitch, применяется minPitch

Также поддерживается анимация:

map.easeTo({
  pitch: 60,
  duration: 1200
});

Анимация всегда учитывает ограничения диапазона, не выходя за них.


Ограничения в связке с bearing

Pitch тесно взаимодействует с углом поворота карты (bearing). При комбинированных изменениях:

  • увеличение pitch усиливает визуальный эффект вращения
  • при высоких значениях bearing (например, 180°) ориентация сцены становится менее интуитивной
  • ограничения pitch помогают стабилизировать восприятие при сложной анимации камеры

При необходимости поддержания строгой ориентации сцены часто фиксируется либо bearing, либо pitch:

map.dragRotate.disable();
map.setMaxPitch(40);

Поведение fitBounds при наклоне

Метод fitBounds учитывает pitch при расчёте итогового положения камеры:

map.fitBounds([
  [37.4, 55.5],
  [37.8, 55.9]
], {
  pitch: 50
});

При высоком pitch увеличивается потребность в отступах, так как перспектива «сжимает» видимую область. В результате:

  • карта масштабируется сильнее, чем при pitch = 0
  • центр смещается для компенсации перспективного искажения
  • ограничения pitch сохраняются и применяются к итоговому состоянию

UX-ограничения и проектирование диапазона pitch

Выбор значений minPitch и maxPitch определяется типом интерфейса:

Навигационные карты

  • minPitch: 0–10
  • maxPitch: 45–60 Основной акцент на читаемость и стабильность

Визуализация рельефа и 3D-сцен

  • minPitch: 30–40
  • maxPitch: 70–85 Фокус на объём и глубину сцены

Аналитические панели

  • minPitch: 0
  • maxPitch: 30 Минимизация перспективных искажений

Ограничения в контексте производительности

Увеличение pitch напрямую влияет на стоимость рендеринга:

  • возрастает нагрузка на GPU из-за перспективных трансформаций
  • увеличивается количество пересчётов тайлов при рельефе
  • усложняется отрисовка символов и 3D-слоёв

Жёсткое ограничение максимального угла снижает вероятность просадок FPS на слабых устройствах.


Взаимодействие с состоянием камеры

Pitch входит в объект камеры и может быть извлечён через:

const camera = map.getCameraState();

При этом значение всегда находится в пределах заданных ограничений, что упрощает синхронизацию состояния с внешними интерфейсами и анимационными системами.