MapLibre GL JS строится вокруг событийной модели, унаследованной от архитектуры EventEmitter-подобного интерфейса. Практически все взаимодействие с картой — от загрузки стиля до кликов по слоям — выражается через строго типизированные события, которые формируют основу реактивного управления состоянием карты.
События делятся на несколько крупных категорий: жизненный цикл карты, взаимодействие пользователя, работа с источниками данных, рендеринг и диагностические сигналы. В TypeScript-окружении каждое событие связано с конкретным типом объекта события, что позволяет строить безопасные обработчики без приведения типов вручную.
В основе лежит интерфейс событийного эмиттера, доступный у объекта карты:
map.on('load', () => {
console.log('Карта загружена');
});
Каждое событие регистрируется через:
map.on(type, listener)map.once(type, listener)map.off(type, listener)Тип события — строковый идентификатор, а обработчик получает объект события, тип которого зависит от категории события.
События жизненного цикла фиксируют ключевые стадии готовности карты и её стиля.
loadСрабатывает после полной загрузки стиля и всех ресурсов.
map.on('load', (e) => {
// карта готова к добавлению слоёв
});
Тип события обычно минимален и содержит базовые поля контекста.
idleСрабатывает, когда карта завершила все рендер-операции и больше не выполняет асинхронных задач.
Используется для:
removeСрабатывает при уничтожении карты.
Рендеринговые события отражают внутренний цикл отрисовки WebGL.
renderСрабатывает при каждом цикле рендера, включая анимации и перемещения.
map.on('render', () => {
// вызывается очень часто
});
rendercompleteФиксирует завершение полного цикла отрисовки.
Эти события относятся к камере (camera state).
movestart,
move, moveendmovestart — начало перемещенияmove — процесс перемещенияmoveend — завершениеТип события включает информацию о:
zoomstart,
zoom, zoomendОтдельный поднабор для масштабирования.
rotatestart,
rotate, rotateendИспользуются при изменении угла поворота карты.
Взаимодействие с картой реализуется через унифицированные pointer-события.
clickdblclickmousedownmouseupmousemovemouseentermouseleavemouseovermouseoutКаждое событие содержит объект MapMouseEvent, который
расширяет базовый event:
Пример:
map.on('click', (e) => {
console.log(e.lngLat);
console.log(e.point);
console.log(e.features);
});
dragstartdragdragendПрименяются при перетаскивании карты.
touchstarttouchmovetouchendИспользуют тип MapTouchEvent, содержащий массив касаний
и агрегированную информацию.
Эти события относятся к интерактивности конкретных слоёв.
click /
hover с фильтром слояmap.on('click', 'cities-layer', (e) => {
console.log(e.features);
});
Такая перегрузка позволяет привязать обработчик к конкретному слою.
Тип события расширяется до MapLayerMouseEvent, который
включает:
features — выбранные геообъектыlayerId — идентификатор слояmouseenter /
mouseleave слояПозволяют отслеживать вход и выход курсора из объектов слоя.
Данные в MapLibre GL JS подгружаются асинхронно, и для контроля используются специализированные события.
dataОбщее событие изменения данных.
Тип события — MapDataEvent, включает:
source)dataType)sourcedataСрабатывает при изменении конкретного источника данных.
map.on('sourcedata', (e) => {
console.log(e.sourceId);
});
styledataСрабатывает при изменении стиля карты.
Источник данных (source) может генерировать отдельные события загрузки и обновления.
Тип события MapSourceDataEvent содержит:
sourceIderrorФиксирует ошибки различного уровня:
map.on('error', (e) => {
console.error(e.error);
});
Тип события содержит объект Error и контекст
возникновения.
Система типов в MapLibre GL JS основана на строгом сопоставлении событий и их payload-типов.
MapMouseEventMapTouchEventMapLayerMouseEventMapDataEventMapSourceDataEventMapStyleDataEventMapBoxZoomEvent (в некоторых версиях наследованных
API)Каждый тип расширяет базовый MapEvent, содержащий:
type — строка событияtarget — экземпляр картыoriginalEvent — нативное DOM-событиеСистема перегрузок позволяет писать строго типизированный код:
map.on('click', (e: MapMouseEvent) => {});
map.on('click', 'layer-id', (e: MapLayerMouseEvent) => {});
На уровне типов происходит следующее:
MapMouseEventMapLayerMouseEventЭто разделение критично для корректной работы с
features.
Помимо встроенных событий, доступна генерация собственных:
map.fire('custom-event', { value: 42 });
Такие события не имеют строгого типа по умолчанию и работают через
расширение базового интерфейса Evented.
События проходят через систему подписчиков с сохранением порядка регистрации. При этом:
once удаляет обработчик после первого вызоваoff полностью исключает обработчикСобытия типа render, mousemove,
move могут вызываться десятки раз в секунду. Их обработка
требует:
Все события предоставляют доступ к:
point)lngLat)Это позволяет строить сложные интерактивные системы без прямого доступа к WebGL-слою.
События тесно связаны с внутренним состоянием карты:
Такая модель обеспечивает детерминированное обновление интерфейса при изменениях состояния карты.