В библиотеке Leaflet слои не существуют изолированно: они
объединяются в коллекции, позволяющие управлять множеством объектов как
единым целым. Базовыми структурами выступают LayerGroup и
его расширение FeatureGroup. Эти классы наследуют поведение
Evented, что делает их полноценными источниками
событий.
Ключевая особенность — группа слоёв не только агрегирует объекты, но и транслирует изменения состава через событийную систему. Это позволяет синхронизировать состояние карты, UI и бизнес-логики без ручного обхода каждого слоя.
LayerGroup — контейнер для произвольных слоёв (маркеров,
полилиний, полигонов и других объектов).
Основные задачи:
FeatureGroup расширяет LayerGroup,
добавляя:
Группы слоёв являются источниками событий (Evented), что
означает наличие стандартного набора методов:
on(type, fn) — подписка на событиеoff(type, fn) — удаление обработчикаfire(type, data) — ручной вызов событияСобытие layeradd возникает при добавлении нового слоя в
группу.
Срабатывает:
addLayer(layer)Передаваемый объект события:
layer — добавленный слойconst group = L.layerGroup();
group.on('layeradd', (e) => {
console.log('Добавлен слой:', e.layer);
});
group.addLayer(L.marker([51.5, -0.09]));
Событие layerremove возникает при удалении слоя из
группы.
Срабатывает:
removeLayer(layer)group.on('layerremove', (e) => {
console.log('Удалён слой:', e.layer);
});
group.removeLayer(marker);
Событие add связано с добавлением всей группы на карту.
Оно отличается от layeradd тем, что относится к самой
группе как объекту, а не к внутренним слоям.
group.on('add', (e) => {
console.log('Группа добавлена на карту');
});
Событие remove возникает при удалении группы с
карты.
group.on('remove', () => {
console.log('Группа удалена с карты');
});
Группы слоёв тесно связаны с объектом Map, но их события
не полностью совпадают с картографическими событиями.
| Событие | Источник | Смысл |
|---|---|---|
layeradd |
LayerGroup | Добавление слоя в группу |
layerremove |
LayerGroup | Удаление слоя из группы |
add |
LayerGroup | Добавление группы на карту |
remove |
LayerGroup | Удаление группы с карты |
layeradd (Map) |
Map | Добавление любого слоя на карту |
FeatureGroup усиливает событийную модель за счёт
поддержки интерактивных слоёв.
События проксируются от дочерних слоёв:
const features = L.featureGroup();
features.on('click', (e) => {
console.log('Клик по одному из объектов группы:', e.layer);
});
Особенность заключается в том, что событие содержит:
layer — конкретный слой, вызвавший событиеlatlng — координаты (если применимо)target — группа как объект-источникЕсли слои внутри группы используют popup, события также всплывают:
features.on('popupopen', (e) => {
console.log('Открыт popup слоя:', e.popup);
});
Группы в Leaflet реализуют механизм проксирования событий от дочерних слоёв.
Это означает:
При добавлении слоя в группу происходит следующая цепочка:
group.addLayer(layer)layeraddАналогично при удалении:
group.removeLayer(layer)layerremoveВ контексте GeoJSON группы часто используются для
динамической привязки событий:
const geoGroup = L.featureGroup();
L.geoJSON(data, {
onEachFeature: (feature, layer) => {
layer.on('click', () => {
console.log(feature.properties);
});
geoGroup.addLayer(layer);
}
});
Метод eachLayer позволяет массово навесить
обработчики:
group.eachLayer((layer) => {
layer.on('click', () => {
console.log('Клик по слою');
});
});
События внутри групп могут вести себя как «всплывающие», особенно в
FeatureGroup.
Иерархия:
Пример цепочки:
clickКаждое событие группы содержит стандартные поля:
type — тип событияtarget — объект, который инициировал событиеlayer — конкретный слой (если применимо)latlng — координаты (для геометрических слоёв)sourceTarget — исходный объект событияconst group = L.layerGroup();
group.on('layeradd', (e) => {
e.layer._addedAt = Date.now();
});
group.addLayer(L.marker([55.75, 37.61]));
group.on('layerremove', (e) => {
console.log('Слой удалён:', e.layer);
});
group.on('layeradd layerremove', () => {
console.log('Состав группы изменён:', group.getLayers().length);
});
При интенсивной работе с данными группы часто пересобираются:
group.clearLayers();
data.forEach(item => {
group.addLayer(L.marker(item.coords));
});
События:
layerremovelayeraddЭто позволяет отслеживать полное обновление состояния.
При работе с десятками тысяч слоёв:
layeradd могут генерироваться массово;let timer;
group.on('layeradd layerremove', () => {
clearTimeout(timer);
timer = setTimeout(() => {
console.log('Группа стабилизировалась');
}, 50);
});
Группы слоёв часто выступают мостом между:
События layeradd и layerremove становятся
точкой синхронизации состояния приложения с картой.