В Mapbox GL JS вся модель взаимодействия с картой построена вокруг событийной системы. Любое изменение состояния карты — от загрузки стиля до смещения камеры или обновления источника данных — транслируется через поток уведомлений, на которые можно подписываться и реагировать в реальном времени.
Событийная модель основана на паттерне Observer. Карта выступает в роли источника событий, а обработчики подписываются на конкретные типы изменений.
Основной объект — экземпляр map, создаваемый через
new mapboxgl.Map(...). Он генерирует события,
отражающие:
Каждое событие можно перехватывать через метод:
map.on('event-name', handler);
и удалять через:
map.off('event-name', handler);
Инициализация карты проходит несколько фаз, каждая из которых сопровождается уведомлениями.
Срабатывает, когда стиль карты и все ресурсы загружены.
map.on('load', () => {
// безопасно добавлять слои и источники
});
На этом этапе можно:
addSource);addLayer);Сигнализирует о завершении всех рендеринговых операций и отсутствии активных загрузок.
map.on('idle', () => {
console.log('Карта полностью стабилизировалась');
});
Это событие полезно для определения момента, когда карта перестала «дергаться».
Камера карты — центральный объект визуального состояния. Любое изменение позиции вызывает серию событий.
Срабатывает при любом изменении положения карты:
map.on('move', () => {
console.log(map.getCenter(), map.getZoom());
});
Фиксирует завершение движения камеры.
map.on('moveend', () => {
console.log('Перемещение завершено');
});
Позволяют отслеживать начало и конец масштабирования.
map.on('zoomstart', () => {
console.log('Начало зума');
});
map.on('zoomend', () => {
console.log('Конец зума');
});
Дополнительно можно отслеживать наклон и вращение карты:
map.on('rotate', () => {});
map.on('pitch', () => {});
Внутренний рендеринг WebGL генерирует отдельный поток уведомлений.
Срабатывает каждый раз при отрисовке кадра.
map.on('render', () => {
// вызывается очень часто
});
Используется для:
Сигнализирует об изменении данных, влияющих на визуализацию.
map.on('data', (e) => {
console.log(e.dataType, e.isSourceLoaded);
});
Источники (sources) в Mapbox GL JS могут загружаться асинхронно и обновляться динамически.
Отслеживает изменения конкретных источников:
map.on('sourcedata', (e) => {
console.log(e.sourceId, e.isSourceLoaded);
});
Это событие полезно при работе с:
map.on('data', (e) => {
if (e.sourceId === 'my-source') {
console.log('Обновление конкретного источника');
}
});
Изменения визуальной структуры карты также генерируют уведомления.
Срабатывает при изменении стиля карты:
map.on('styledata', () => {
console.log('Стиль обновлён');
});
Используется при:
Центральное событие для отладки.
map.on('error', (e) => {
console.error(e.error);
});
Оно может сигнализировать о:
Событийная модель Mapbox GL JS не просто уведомляет об изменениях, а формирует поток состояния карты. Это позволяет строить реактивные системы:
Пример синхронизации состояния:
map.on('move', () => {
const state = {
center: map.getCenter(),
zoom: map.getZoom(),
bearing: map.getBearing(),
pitch: map.getPitch()
};
updateSidebar(state);
});
Некоторые события вызываются с высокой частотой (move,
render). Их использование требует оптимизации.
Типичные подходы:
moveend или
idle.Пример оптимизации:
let timeout;
map.on('move', () => {
clearTimeout(timeout);
timeout = setTimeout(() => {
console.log('Стабильное состояние карты');
}, 200);
});
Каждое событие передаёт объект event, содержащий
дополнительную информацию:
type — тип события;target — экземпляр карты;sourceId — идентификатор источника (для
data-событий);tile — информация о тайле;isSourceLoaded — статус загрузки.map.on('sourcedata', (e) => {
if (e.isSourceLoaded) {
console.log(`Источник ${e.sourceId} загружен`);
}
});
Корректное управление подписками критично при динамических интерфейсах.
function onMove() {
console.log('движение');
}
map.on('move', onMove);
// позже
map.off('move', onMove);
При удалении карты:
map.remove();
все подписки уничтожаются автоматически, предотвращая утечки памяти.