В системе WebGL-картографии MapLibre GL JS трёхмерное представление карты строится вокруг двух ключевых параметров камеры:
Pitch (наклон) — угол наклона камеры относительно поверхности земли.
0° соответствует строго вертикальному виду
сверху0° до 60°Bearing (поворот) — азимутальный угол вращения карты вокруг вертикальной оси.
0° обычно соответствует северу вверхЭти параметры являются частью состояния камеры и напрямую влияют на матрицу трансформации WebGL-сцены.
Система событий в MapLibre GL JS построена на реактивной модели: любое изменение состояния камеры может сопровождаться событиями жизненного цикла.
Для pitch и rotate предусмотрены следующие события:
pitchstartpitchpitchendrotatestartrotaterotateendКаждое событие отражает определённую фазу взаимодействия пользователя или программного изменения камеры.
Срабатывает в момент начала изменения наклона карты.
Типичные источники:
setPitchСобытие сигнализирует о входе в режим трансформации камеры.
Срабатывает многократно в процессе изменения наклона.
Особенности:
Используется для:
Фиксирует завершение изменения pitch.
Момент окончания определяется:
Срабатывает при начале вращения карты.
Источники:
setBearingСобытие фиксирует переход камеры в режим вращения.
Промежуточное событие вращения.
Характеристики:
Срабатывает при завершении вращения.
Фиксирует:
События pitch и rotate подписываются через единый интерфейс
map.on.
map.on('pitchstart', (e) => {
console.log('Начало наклона');
});
map.on('pitch', (e) => {
console.log('Текущий pitch:', map.getPitch());
});
map.on('pitchend', (e) => {
console.log('Наклон завершён');
});
Аналогично для вращения:
map.on('rotatestart', () => {
console.log('Начало вращения');
});
map.on('rotate', () => {
console.log('Bearing:', map.getBearing());
});
map.on('rotateend', () => {
console.log('Вращение завершено');
});
Каждое событие камеры передаёт объект event, содержащий контекст взаимодействия.
Типичная структура:
type — имя событияtarget — экземпляр картыoriginalEvent — DOM-событие (если применимо)Пример обработки:
map.on('rotate', (e) => {
if (e.originalEvent) {
console.log('Пользовательское вращение');
} else {
console.log('Программное изменение камеры');
}
});
Различение источника события критично при построении сложных интерфейсов, где программные и пользовательские изменения должны обрабатываться по-разному.
MapLibre GL JS предоставляет методы управления камерой:
map.setPitch(45);
Изменяет наклон камеры. При наличии transition вызовет полный цикл событий:
map.setBearing(120);
Устанавливает угол поворота карты.
При одновременном изменении pitch и bearing события могут интерливаться:
map.easeTo({
pitch: 60,
bearing: 180,
duration: 2000
});
В этом случае события генерируются в рамках единой анимации камеры, но остаются разделёнными по типу.
Часто события используются для обновления UI-компонентов:
map.on('pitch', () => {
const value = map.getPitch();
ui.pitchLabel.textContent = value.toFixed(1);
});
Поскольку pitch и rotate вызываются с
высокой частотой, тяжёлые операции внутри обработчиков приводят к
деградации производительности.
Подход:
pitch/rotatepitchend /
rotateendlet userInteracting = false;
map.on('rotatestart', () => {
userInteracting = true;
});
map.on('rotateend', () => {
userInteracting = false;
});
Это позволяет отделить автоматические анимации от ручного управления.
| Характеристика | pitch | rotate |
|---|---|---|
| Ось изменения | X/Z перспектива | вертикальная ось |
| Влияние | наклон камеры | поворот карты |
| Тип восприятия | 3D глубина | ориентация |
| Частота событий | высокая | высокая |
Несмотря на различия, событийная модель идентична, что упрощает унификацию логики обработки.
При одновременной работе pitch и rotate возникают сложные состояния камеры, характерные для 3D-навигации:
Пример наблюдения состояния:
function logCameraState() {
console.log({
pitch: map.getPitch(),
bearing: map.getBearing()
});
}
map.on('pitch', logCameraState);
map.on('rotate', logCameraState);
События pitch и rotate интегрированы в render-loop MapLibre:
Это означает, что фактическое количество событий зависит от FPS и сложности сцены.
rotate или
pitchoriginalEvent, что приводит к
путанице между программными и пользовательскими изменениямиmoveend для финальной
фиксации состояния камеры