В основе плавного перемещения карты лежит модель камеры. В Mapbox GL JS карта рассматривается как виртуальная сцена, где положение наблюдателя задаётся через параметры центра, масштаба, угла поворота и наклона. Любое изменение этих параметров может быть выполнено мгновенно или с анимацией.
Ключевые параметры камеры:
Плавность достигается интерполяцией между текущим и целевым состоянием камеры с использованием встроенного анимационного движка.
Метод flyTo создаёт анимацию «перелёта» к новой точке с
естественной траекторией, имитирующей движение камеры в
пространстве.
map.flyTo({
center: [66.9237, 48.0196],
zoom: 12,
speed: 1.2,
curve: 1.42,
essential: true
});
Особенности:
flyTo используется для выразительных переходов между
удалёнными точками.
Метод easeTo выполняет более контролируемое плавное
перемещение без выраженной «трёхмерной» траектории.
map.easeTo({
center: [66.9237, 48.0196],
zoom: 10,
duration: 2000,
easing: (t) => t * (2 - t)
});
Особенности:
durationИспользуется для интерфейсных переходов и мягких смещений карты.
Мгновенное перемещение камеры без анимации.
map.jumpTo({
center: [66.9237, 48.0196],
zoom: 8
});
Применяется в случаях, когда плавность не требуется или может мешать взаимодействию.
Mapbox GL JS позволяет анимировать параметры независимо друг от друга.
map.setCenter([66.9237, 48.0196]);
Для плавности используется:
map.easeTo({
center: [66.9237, 48.0196],
duration: 1500
});
map.easeTo({
zoom: 14,
duration: 1200
});
При изменении zoom происходит интерполяция с сохранением позиции центра.
map.easeTo({
bearing: 90,
duration: 2000
});
Поворот часто комбинируется с наклоном для создания эффекта 3D-навигации.
map.easeTo({
pitch: 60,
duration: 1800
});
Высокие значения pitch усиливают визуальную глубину сцены.
Одним из наиболее практичных инструментов является
fitBounds, автоматически рассчитывающий центр и
масштаб.
map.fitBounds(
[
[65.0, 47.0],
[68.0, 49.0]
],
{
padding: 40,
duration: 2000
}
);
Механизм:
Используется для отображения маршрутов, регионов и кластеров объектов.
Параметр easing определяет характер изменения прогресса
анимации.
map.easeTo({
center: [66.9, 48.0],
duration: 2000,
easing: (t) => Math.sin(t * Math.PI / 2)
});
Типовые варианты:
tt * (2 - t)Math.sin(...)Кривые позволяют синхронизировать движение карты с UI-анимациями.
Любую активную анимацию можно остановить:
map.stop();
Прерывание применяется при:
Mapbox GL JS предоставляет события для отслеживания состояния анимации:
map.on('move', () => {
console.log('камера перемещается');
});
map.on('moveend', () => {
console.log('перемещение завершено');
});
Дополнительные события:
zoomrotatepitchidleСобытийная модель позволяет синхронизировать интерфейс с движением карты.
Частый сценарий — слежение за координатами (например, GPS-трек).
function updatePosition(coords) {
map.easeTo({
center: coords,
duration: 1000,
essential: true
});
}
Для более «жёсткого» следования используется уменьшение duration или
jumpTo.
При пользовательском drag-движении применяется встроенная инерция. Поведение регулируется внутренними параметрами карты:
Хотя они не всегда напрямую доступны, их влияние ощущается в характере плавности взаимодействия.
Одновременное изменение нескольких параметров камеры создаёт сложные переходы:
map.easeTo({
center: [66.9237, 48.0196],
zoom: 13,
bearing: 45,
pitch: 50,
duration: 3000
});
Такие комбинации используются для:
При интенсивной анимации важно учитывать производительность:
easeTomap.isMoving() для контроля
состоянияmoveДополнительный эффект достигается через снижение нагрузки на слой рендеринга и оптимизацию источников данных.
В современных версиях Mapbox GL JS доступен низкоуровневый контроль камеры:
const camera = map.getFreeCameraOptions();
camera.position = mapboxgl.MercatorCoordinate.fromLngLat(
[66.9237, 48.0196],
1200
);
map.setFreeCameraOptions(camera);
Этот подход позволяет:
Для построения сложных сценариев навигации используется цепочка анимаций:
map.flyTo({
center: [66.9, 48.0],
zoom: 10,
speed: 1.5
});
map.once('moveend', () => {
map.easeTo({
pitch: 60,
bearing: 120,
duration: 2000
});
});
Такой подход позволяет формировать многоступенчатые переходы с контролем каждой фазы движения.