В Mapbox GL JS под viewport понимается текущее состояние отображаемой области карты: центр, масштаб, наклон, поворот и границы видимой области. Вся визуализация карты строится вокруг этого состояния, а любое взаимодействие пользователя или программное изменение приводит к перерасчёту и перерисовке сцены.
Viewport в Mapbox GL JS не является статичным параметром — это динамическая структура, которая постоянно синхронизируется с внутренним состоянием рендерера WebGL.
Viewport формируется набором взаимосвязанных параметров:
Координаты центра карты в формате [lng, lat].
map.setCenter([73.3678, 49.8064]);
Центр определяет точку, относительно которой выполняются все трансформации тайлов и слоёв.
Уровень масштабирования определяет детализацию отображения.
map.setZoom(10);
Особенности поведения:
Поворот карты вокруг вертикальной оси (в градусах).
map.setBearing(45);
Наклон карты, создающий перспективное и псевдо-3D отображение.
map.setPitch(60);
Основной объект управления состоянием viewport — экземпляр
mapboxgl.Map.
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [73.3678, 49.8064],
zoom: 9,
bearing: 0,
pitch: 0
});
Все параметры viewport можно задавать:
Mapbox GL JS предоставляет методы синхронного изменения состояния карты без анимации.
map.setCenter([72.9, 40.5]);
map.setZoom(12);
map.setBearing(90);
map.setPitch(45);
map.jumpTo({
center: [72.9, 40.5],
zoom: 11,
bearing: 30,
pitch: 20
});
jumpTo изменяет viewport мгновенно, без
интерполяции.
Для плавного изменения состояния используется анимация.
map.easeTo({
center: [73.2, 49.9],
zoom: 12,
duration: 2000,
easing: (t) => t
});
Характеристики:
map.flyTo({
center: [73.2, 49.9],
zoom: 13,
speed: 1.2,
curve: 1.5
});
Особенности:
Viewport может быть ограничен географическими рамками.
map.setMaxBounds([
[72.0, 49.0],
[74.0, 50.5]
]);
Это предотвращает выход камеры за заданную область.
Применение:
const center = map.getCenter();
const zoom = map.getZoom();
const bearing = map.getBearing();
const pitch = map.getPitch();
Для анализа видимой области используется getBounds.
const bounds = map.getBounds();
Возвращает:
Применение:
Mapbox GL JS предоставляет инструменты преобразования между географическими и экранными координатами.
const point = map.project([73.3678, 49.8064]);
Используется для:
const lngLat = map.unproject([100, 200]);
Применение:
Viewport в Mapbox GL JS сопровождается набором событий.
Срабатывает при любом изменении положения карты.
map.on('move', () => {
console.log(map.getCenter());
});
Срабатывает после завершения перемещения.
map.on('moveend', () => {
console.log('viewport стабилизирован');
});
map.on('zoom', () => {});
map.on('zoomend', () => {});
map.on('rotate', () => {});
map.on('pitch', () => {});
Viewport часто связывается с UI состоянием приложения.
Типовой подход:
let state = {
center: null,
zoom: null
};
map.on('move', () => {
state.center = map.getCenter();
state.zoom = map.getZoom();
});
Все изменения viewport проходят через WebGL pipeline, поэтому:
Zoom не линейно связан с масштабом карты, а экспоненциально влияет на детализацию тайлов.
При высоких значениях:
Viewport часто изменяется одновременно по нескольким осям:
map.easeTo({
center: [73.1, 49.8],
zoom: 14,
bearing: 60,
pitch: 70,
duration: 3000
});
Такие трансформации используются для:
Внутри Mapbox GL JS viewport транслируется в параметры виртуальной камеры:
Каждое изменение viewport вызывает пересчёт матриц трансформации и перерасчёт тайловой сетки.
map.fitBounds([
[72.5, 49.2],
[73.9, 50.1]
]);
Используется при:
map.flyTo({
center: feature.geometry.coordinates,
zoom: 15
});
Применяется для:
Viewport может управляться жестами:
Mapbox GL JS автоматически преобразует эти жесты в изменения центра, zoom, bearing и pitch.
Viewport напрямую влияет на:
При изменении viewport происходит перерасчёт: