Контроль области просмотра в веб-картах — ключевой механизм, позволяющий ограничить перемещение пользователя, задать допустимые границы карты и сформировать предсказуемое поведение интерфейса. В экосистеме Mapbox такие ограничения реализуются на уровне камеры карты и взаимодействия пользователя с жестами, управлением и программными методами API.
Mapbox GL JS предоставляет несколько независимых, но взаимодействующих уровней ограничения: географические границы, ограничения масштаба, управление вращением и наклоном, а также контроль поведения интерактивных жестов.
Основной механизм ограничения перемещения карты — параметр
maxBounds. Он задаёт прямоугольную область, за пределы
которой камера не может выйти.
Используется объект LngLatBounds, определяющий
юго-западную и северо-восточную точки:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [69.2401, 41.2995],
zoom: 5,
maxBounds: [
[60.0, 35.0], // юго-запад
[75.0, 45.0] // северо-восток
]
});
После создания карты границы можно изменить динамически:
map.setMaxBounds([
[61.0, 36.0],
[74.0, 44.0]
]);
Удаление ограничения:
map.setMaxBounds(null);
Это полезно при переключении между регионами, режимами отображения или пользовательскими фильтрами.
Контроль области просмотра невозможен без ограничения уровня
приближения. Параметры minZoom и maxZoom
задают диапазон допустимого масштабирования.
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/light-v11',
center: [69.2401, 41.2995],
zoom: 6,
minZoom: 4,
maxZoom: 12
});
zoom ниже minZoom блокируется
zoom выше maxZoom недоступен
ограничения применяются ко всем способам изменения масштаба:
map.zoomTo()map.setMinZoom(3);
map.setMaxZoom(14);
Контроль диапазона zoom часто используется при:
Хотя географическая область ограничивает перемещение, визуальная область также зависит от угла обзора.
map.dragRotate.disable();
map.touchZoomRotate.disableRotation();
Полное отключение вращения:
map.setRenderWorldCopies(false);
map.setPitch(0);
map.setMaxPitch(30);
pitch — угол наклона камерыmaxPitch ограничивает максимальный наклонГлобусная проекция и мировые тайлы могут повторяться по горизонтали.
Это поведение контролируется параметром
renderWorldCopies.
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [0, 20],
zoom: 2,
renderWorldCopies: false
});
true — карта повторяется по оси X (бесконечная
прокрутка)false — ограниченная одна «копия мира»Использование false важно при:
map.dragPan.disable();
или частичное ограничение:
map.dragPan.enable();
map.scrollZoom.disable();
map.boxZoom.disable();
map.doubleClickZoom.disable();
Каждый тип взаимодействия отключается отдельно, что позволяет точно настраивать UX:
scrollZoom — колесо мышиboxZoom — выделение областиdoubleClickZoom — двойной кликtouchZoomRotate — жесты на мобильных устройствахВ некоторых сценариях требуется предотвратить случайное масштабирование при прокрутке страницы:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [69.2401, 41.2995],
zoom: 5,
cooperativeGestures: true
});
Метод fitBounds позволяет программно задать отображаемую
область и автоматически подогнать масштаб.
map.fitBounds([
[68.0, 40.0],
[71.0, 43.0]
], {
padding: 40
});
padding — отступы от краёвmaxZoom — ограничение приближения при подгонкеlinear — линейная интерполяция камерыduration — анимация переходаmap.fitBounds(bounds, {
padding: 20,
maxZoom: 10,
duration: 1200
});
В сложных интерфейсах часто используется комбинация:
maxBounds — жёсткое ограничение перемещенияfitBounds — программная навигация внутри этих
границПример сценария:
Mapbox GL JS предоставляет низкоуровневый контроль через события
move, moveend и movestart.
map.on('move', () => {
const center = map.getCenter();
if (center.lng < 60) {
map.setCenter([60, center.lat]);
}
});
Внутренне карта представляет собой камеру с параметрами:
center — центр обзораzoom — масштабbearing — вращениеpitch — наклонКаждый параметр может быть ограничен:
map.setMinZoom(4);
map.setMaxZoom(10);
map.setMaxPitch(45);
Эти ограничения образуют многомерное пространство допустимых состояний камеры.
При создании карт, привязанных к конкретной стране или региону, применяется комплекс ограничений:
const bounds = [
[60.0, 35.0],
[75.0, 45.0]
];
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/outdoors-v12',
center: [67.5, 40.0],
zoom: 6,
minZoom: 5,
maxZoom: 10,
maxBounds: bounds,
renderWorldCopies: false
});
Дополнительно отключаются жесты:
map.scrollZoom.disable();
map.boxZoom.disable();
Такой набор параметров формирует строго ограниченное «окно» в геопространстве, исключающее выход пользователя за заданные координаты.
Несмотря на наличие maxBounds, поведение камеры имеет
нюансы:
flyTo могут временно игнорировать
ограниченияЭти особенности связаны с системой плавной интерполяции камеры внутри Mapbox GL JS.
На мобильных устройствах ограничения особенно важны:
Используются комбинации:
map.touchZoomRotate.disableRotation();
map.dragPan.enable();
map.setMaxBounds(bounds);
Ограничение области просмотра тесно связано со стилем карты:
maxPitchВ рамках платформы Mapbox эти параметры интегрируются в стиль и поведение камеры как единая система визуального контроля.