Типы событий карты

В библиотеке MapLibre GL JS событийная модель построена вокруг объекта карты, который генерирует поток событий на разных этапах жизненного цикла, взаимодействия пользователя и обновления визуального состояния. Все события можно условно разделить на несколько крупных категорий: события жизненного цикла, события камеры, пользовательские интеракции, события данных и источников, а также технические события рендера и ошибок.

Такая структура позволяет отделять логику отображения, управление состоянием и обработку пользовательских действий, обеспечивая предсказуемость поведения карты.


События жизненного цикла карты

Жизненный цикл карты охватывает этапы инициализации, загрузки стиля и готовности к работе.

load

Срабатывает после полной загрузки стиля, тайлов и ресурсов, необходимых для первого рендеринга.

  • момент, когда карта становится функционально готовой
  • все источники и слои уже загружены
  • можно безопасно добавлять дополнительные слои, источники и обработчики

Типичная особенность: событие вызывается один раз за жизненный цикл экземпляра карты, если не происходит полная переинициализация стиля.


style.load

Возникает после загрузки стиля, но до полной готовности всех тайлов и ресурсов.

Используется для:

  • модификации стиля до начала рендеринга
  • добавления слоёв, зависящих от структуры стиля
  • первичной конфигурации визуализации

idle

Срабатывает, когда карта завершила все активные операции:

  • загрузку тайлов
  • рендеринг кадров
  • обработку изменений состояния

Фактически фиксирует состояние «покоя», при котором отсутствуют асинхронные операции.


События камеры (view state)

Камера определяет геометрическое состояние отображения: центр, масштаб, наклон и вращение. Изменения камеры генерируют отдельный класс событий.

move

Срабатывает при любом изменении положения камеры:

  • изменение центра карты
  • панорамирование
  • программное или пользовательское перемещение

Используется для синхронизации UI с текущим положением карты.


movestart и moveend

Разделяют процесс перемещения на начало и завершение.

  • movestart фиксирует момент начала изменения камеры
  • moveend фиксирует завершение всех переходов

Такая пара событий позволяет реализовывать:

  • индикаторы загрузки
  • блокировку интерфейса
  • оптимизацию запросов к серверу при завершении перемещения

zoom / zoomstart / zoomend

Отслеживание масштабирования карты.

  • zoomstart — начало масштабирования
  • zoom — процесс изменения масштаба
  • zoomend — завершение изменения

События особенно важны при:

  • динамической подгрузке данных по уровням детализации
  • адаптации UI к масштабу

rotate / rotatestart / rotateend

Отвечают за изменение азимута карты.

Применяются в системах:

  • навигации
  • 3D-визуализации
  • аналитических панелях с ориентацией данных

pitch / pitchstart / pitchend

Изменение угла наклона камеры.

Используется для:

  • 3D-визуализации зданий
  • перспективного отображения данных
  • имитации трёхмерного пространства

Пользовательские интерактивные события

Эта группа событий отражает действия пользователя с картой через мышь или сенсорный ввод.

click и dblclick

События одиночного и двойного клика.

  • click используется для выбора объектов карты
  • dblclick часто связан с увеличением масштаба

Событие содержит информацию о координатах, точке на экране и объектах под курсором.


mousedown, mouseup, mousemove

Низкоуровневые события мыши.

Используются для:

  • кастомных инструментов рисования
  • реализации выделения областей
  • построения интерактивных редакторов поверх карты

mouseenter и mouseleave

Фиксируют вход и выход курсора в область карты.

Позволяют:

  • управлять подсказками
  • изменять курсор
  • активировать визуальные эффекты

mouseover и mouseout

Работают аналогично DOM-событиям, но привязаны к слоям и объектам карты.


contextmenu

Срабатывает при вызове контекстного меню (обычно правая кнопка мыши).

Используется для:

  • кастомных меню объектов
  • инструментов анализа
  • режимов редактирования

wheel

Отвечает за прокрутку колеса мыши.

Основная область применения:

  • контроль зума
  • кастомная обработка масштабирования
  • ограничение чувствительности

Touch-события

Для сенсорных устройств поддерживаются аналоги:

  • touchstart
  • touchmove
  • touchend

Эти события критичны для мобильных картографических приложений, где жесты заменяют мышь.


События данных и источников

Эта категория отражает состояние загрузки и обновления геоданных.

data

Общее событие, сигнализирующее об изменении данных карты.

Срабатывает при:

  • загрузке тайлов
  • обновлении источников
  • изменении геометрии объектов

dataloading

Возникает в момент начала загрузки данных.

Используется для:

  • отображения индикаторов загрузки
  • синхронизации состояния UI

sourcedata

Фокусируется на конкретных источниках данных.

Позволяет:

  • отслеживать загрузку отдельных слоёв
  • оптимизировать обновления
  • диагностировать проблемы с тайлами

styledata

Срабатывает при изменении или загрузке стиля.

Применяется в системах:

  • динамического переключения тем карты
  • визуальных редакторов стилей
  • аналитических панелей

События рендера

Рендеринг карты — непрерывный процесс, управляемый внутренним циклом отрисовки.

render

Срабатывает при каждом кадре отрисовки.

Используется для:

  • анимаций поверх карты
  • синхронизации внешних визуальных компонентов
  • отладки производительности

error

Событие ошибок, возникающих при:

  • загрузке ресурсов
  • парсинге стиля
  • сетевых запросах
  • рендеринге

Содержит диагностическую информацию, необходимую для логирования и восстановления состояния.


События взаимодействия с состоянием карты

Некоторые события отражают изменения не только камеры или данных, но и общего состояния карты.

resize

Срабатывает при изменении размеров контейнера карты.

Используется для:

  • адаптивных интерфейсов
  • пересчёта viewport
  • корректировки рендеринга при изменении layout

remove

Возникает при удалении экземпляра карты.

Позволяет:

  • очищать ресурсы
  • отменять подписки
  • завершать асинхронные операции

Структура объекта события

Каждое событие в MapLibre GL JS передаёт объект, содержащий контекст выполнения.

Ключевые поля:

  • type — тип события
  • target — экземпляр карты
  • originalEvent — нативное DOM-событие (если применимо)
  • point — координаты курсора в пикселях
  • lngLat — географические координаты
  • features — массив объектов карты под курсором (для событий взаимодействия)

Для событий камеры дополнительные поля могут включать:

  • bearing
  • zoom
  • pitch

Подписка и управление событиями

Система событий основана на паттерне наблюдателя.

Основные методы:

  • map.on(type, handler) — регистрация обработчика
  • map.off(type, handler) — удаление обработчика
  • map.once(type, handler) — одноразовое выполнение

Поведение обработчиков строго синхронизировано с внутренним циклом рендера, что исключает расхождения состояния при быстрых последовательных изменениях.


Приоритеты и порядок вызова

События генерируются в определённой последовательности, особенно при комплексных изменениях состояния.

Пример при зуме:

  1. zoomstart
  2. move
  3. zoom
  4. moveend
  5. zoomend
  6. idle

Такая последовательность позволяет точно отслеживать этапы взаимодействия и строить предсказуемую реакцию интерфейса.


Особенности обработки событий в WebGL-контексте

MapLibre GL JS использует WebGL-рендеринг, что накладывает особенности:

  • события не всегда синхронны с DOM
  • часть вычислений выполняется в GPU-пайплайне
  • интерактивные объекты вычисляются через hit-testing
  • производительность зависит от количества активных слоёв

Это делает важным минимизацию логики внутри часто вызываемых событий, таких как render или mousemove.


Делегирование и фильтрация событий

События могут быть привязаны к:

  • всей карте
  • конкретным слоям
  • отдельным источникам данных

Фильтрация позволяет ограничивать область реагирования обработчиков, снижая нагрузку и повышая точность взаимодействия.


Координация событий с состоянием приложения

События карты часто используются как слой синхронизации между визуализацией и бизнес-логикой:

  • обновление списка объектов при перемещении камеры
  • загрузка данных при изменении зума
  • динамическая фильтрация слоёв
  • реакция интерфейса на выбранные геообъекты

Эта модель позволяет строить реактивные геоинформационные интерфейсы, где карта выступает центральным источником событийного потока.