Архитектура MapLibre GL JS построена вокруг непрерывного цикла загрузки, обработки и отрисовки геоданных. В основе этого цикла лежит поток событий, отражающих состояние стиля, источников данных, тайлов и процесса рендеринга. События, связанные с данными, позволяют отслеживать жизненный цикл загрузки географических слоёв, управлять состоянием интерфейса и синхронизировать внешние процессы с внутренним состоянием карты.
Процесс отображения карты проходит несколько стадий:
style)sources)tiles)render)idle)Каждая стадия сопровождается соответствующими событиями, которые формируют основу наблюдаемой реактивной модели.
styledataСобытие styledata возникает при изменениях в структуре
стиля карты. Это может включать:
Сигнал отражает факт того, что внутренняя модель стиля была пересобрана или модифицирована.
map.on('styledata', (e) => {
const style = map.getStyle();
console.log('Изменение стиля:', style.layers.length);
});
Событие полезно при построении систем, где стиль генерируется динамически, например при переключении тематических режимов отображения.
styledataloadingСобытие styledataloading срабатывает перед тем, как
новые данные стиля начинают загружаться или пересобираться.
Фаза загрузки включает:
map.on('styledataloading', () => {
console.log('Начало загрузки стиля');
});
Это событие отражает старт критической фазы обновления визуальной модели.
sourcedataloadingСобытие sourcedataloading сигнализирует о начале
загрузки данных конкретного источника (source).
Источниками могут быть:
map.on('sourcedataloading', (e) => {
console.log('Источник загружается:', e.sourceId);
});
Каждый источник обрабатывается независимо, что позволяет параллельно загружать несколько потоков данных.
sourcedataСобытие sourcedata отражает изменения состояния
источника данных. Оно вызывается:
map.on('sourcedata', (e) => {
if (e.isSourceLoaded) {
console.log('Источник полностью загружен:', e.sourceId);
}
});
Ключевым свойством события является isSourceLoaded,
показывающее завершённость загрузки конкретного источника.
dataloadingСобытие dataloading возникает при начале загрузки любых
данных, участвующих в рендеринге карты.
Оно охватывает:
map.on('dataloading', () => {
console.log('Началась загрузка данных карты');
});
Это событие агрегирует низкоуровневые процессы загрузки и представляет их как единый поток.
dataСобытие data фиксирует изменения в состоянии данных
карты. Оно может возникать многократно в процессе одного кадра
рендеринга.
Типичные случаи:
map.on('data', (e) => {
console.log('Тип события данных:', e.dataType);
console.log('Источник:', e.sourceId);
});
Поле dataType может принимать значения:
sourcestyletileСобытие играет роль универсального уведомления о любых изменениях в data pipeline.
idleСобытие idle возникает, когда карта завершает все
активные процессы:
map.on('idle', () => {
console.log('Карта находится в стабильном состоянии');
});
Состояние idle часто используется как индикатор
готовности карты к взаимодействию или следующему циклу обновления
данных.
renderСобытие render срабатывает при каждом кадре отрисовки
карты.
Хотя оно не является строго data-событием, оно тесно связано с обновлением данных, поскольку каждый рендер может быть вызван:
map.on('render', () => {
const zoom = map.getZoom();
console.log('Рендер кадра, zoom:', zoom);
});
Частота события может быть высокой при анимациях или потоковой загрузке данных.
Последовательность событий при загрузке источника данных часто выглядит следующим образом:
dataloading — начинается загрузка данныхsourcedataloading — активируется конкретный
источникdata — поступают промежуточные обновленияsourcedata — фиксируется состояние источникаdata — финальное обновление после синхронизацииidle — завершение всех процессовЭта цепочка отражает многоуровневую структуру обработки данных: от глобального состояния карты до конкретного тайла.
errorСобытие error сигнализирует о сбоях в процессе загрузки
или обработки данных.
Причины могут включать:
map.on('error', (e) => {
console.log('Ошибка карты:', e.error);
});
Хотя error не относится строго к data-событиям, он
является частью того же потока, так как большинство ошибок возникают в
процессе загрузки данных.
Многие события поддерживают фильтрацию по sourceId, что
позволяет отслеживать состояние конкретных данных.
map.on('sourcedata', (e) => {
if (e.sourceId === 'cities') {
console.log('Обновление источника cities');
}
});
Такой подход особенно важен при работе с множеством слоёв и разнородных источников, где каждый поток данных имеет независимую жизненную логику.
Data-события в MapLibre GL JS не следуют строгой линейной последовательности. Они:
Это делает систему событий реактивной, а не детерминированной.
Векторные и растровые тайлы являются основным источником data-событий. При изменении viewport происходит:
dataloading и dataКаждый тайл может независимо завершать загрузку, вызывая отдельные события.
Состояние карты считается согласованным, когда:
Событие idle является финальным маркером этого состояния
и завершает цикл data pipeline до следующего изменения входных
параметров карты.