LayerGroup представляет собой один из фундаментальных механизмов управления слоями в Leaflet, позволяющий объединять несколько объектов карты в единую логическую сущность. Это не визуальный слой, а контейнер, который управляет набором подслоёв как единым целым. Подобный подход используется для структурирования карты, упрощения управления состоянием и массовых операций над элементами.
LayerGroup реализует интерфейс слоя Leaflet, поэтому может быть добавлен на карту так же, как маркер, тайловый слой или GeoJSON-объект.
В Leaflet каждый объект карты — это слой: маркер, полилиния, полигон, растровый тайл. При росте количества элементов управление ими по отдельности становится затруднительным. LayerGroup решает эту проблему, объединяя слои в единый контейнер.
Ключевая идея:
Такой подход особенно полезен при работе с:
Базовая форма создания группы:
const group = L.layerGroup();
Группа изначально пустая и может принимать слои в момент создания:
const group = L.layerGroup([
L.marker([51.5, -0.09]),
L.marker([51.51, -0.1]),
L.circle([51.49, -0.08], { radius: 200 })
]);
Слои внутри группы не отображаются на карте, пока сама группа не добавлена в карту.
После создания группа добавляется как обычный слой:
group.addTo(map);
или альтернативно:
map.addLayer(group);
При этом все вложенные элементы становятся видимыми одновременно.
LayerGroup предоставляет методы для динамического управления содержимым.
Добавление слоя:
group.addLayer(L.marker([51.52, -0.1]));
Удаление слоя:
group.removeLayer(marker);
Очистка группы:
group.clearLayers();
Важно, что удаление слоя из группы не уничтожает сам объект слоя, если он сохранён в переменной.
Для проверки принадлежности слоя группе используется:
group.hasLayer(marker);
Метод возвращает true, если слой находится внутри
группы.
Для обхода всех слоёв используется метод eachLayer:
group.eachLayer(function (layer) {
console.log(layer);
});
Это основной способ выполнения массовых операций:
LayerGroup наследует поведение слоя карты, поэтому:
map.removeLayer(group);
скрывает все вложенные элементы одновременно, а:
map.addLayer(group);
возвращает их на карту без необходимости повторного добавления каждого элемента.
LayerGroup часто используется как контейнер тематических данных.
Пример: группа «рестораны»
const restaurants = L.layerGroup();
L.marker([51.5, -0.09]).addTo(restaurants);
L.marker([51.51, -0.1]).addTo(restaurants);
L.marker([51.49, -0.08]).addTo(restaurants);
restaurants.addTo(map);
Аналогично создаются группы:
LayerGroup тесно связан с контролом переключения слоёв:
const baseLayers = {};
const overlays = {
"Рестораны": restaurants
};
L.control.layers(baseLayers, overlays).addTo(map);
Такой механизм позволяет пользователю включать и выключать группы без ручного управления кодом.
Хотя LayerGroup и FeatureGroup внешне похожи, их назначение различается.
LayerGroup:
FeatureGroup:
click,
mouseover)LayerGroup применяется там, где не требуется агрегированная интерактивность.
LayerGroup может содержать другие LayerGroup, образуя иерархию:
const groupA = L.layerGroup([
L.marker([51.5, -0.09])
]);
const groupB = L.layerGroup([
L.marker([51.51, -0.1])
]);
const mainGroup = L.layerGroup([groupA, groupB]);
mainGroup.addTo(map);
Это позволяет строить сложные структуры слоёв с многоуровневым управлением.
LayerGroup особенно полезен при загрузке данных с сервера.
Типичный сценарий:
const dynamicGroup = L.layerGroup().addTo(map);
fetch('/api/points')
.then(res => res.json())
.then(data => {
data.forEach(item => {
L.marker([item.lat, item.lng]).addTo(dynamicGroup);
});
});
Обновление данных выполняется через очистку и повторное заполнение:
dynamicGroup.clearLayers();
LayerGroup позволяет выполнять операции над всеми элементами одновременно:
group.eachLayer(layer => {
if (layer.setStyle) {
layer.setStyle({ color: 'red' });
}
});
group.eachLayer(layer => {
layer.on('click', () => {
console.log('click');
});
});
group.eachLayer(layer => {
if (layer.feature && layer.feature.properties.hidden) {
group.removeLayer(layer);
}
});
LayerGroup не создаёт отдельного рендеринга. Он лишь управляет добавлением и удалением DOM-слоёв Leaflet.
Производительность зависит от:
Оптимизация достигается за счёт:
clearLayers вместо поэлементного
удаленияLayerGroup не влияет на поведение карты при зуме или панорамировании. Все вложенные слои ведут себя как самостоятельные объекты Leaflet:
Группа лишь контролирует их присутствие на карте.
LayerGroup часто применяется для реализации режимов отображения:
const trafficLayer = L.layerGroup();
const satelliteLayer = L.layerGroup();
map.addLayer(trafficLayer);
Переключение осуществляется через удаление и добавление групп:
map.removeLayer(trafficLayer);
map.addLayer(satelliteLayer);
GeoJSON-слои легко интегрируются в LayerGroup:
const geoGroup = L.layerGroup();
L.geoJSON(data).addTo(geoGroup);
geoGroup.addTo(map);
Это позволяет объединять географические данные с другими типами слоёв, такими как маркеры или окружности.
Один и тот же LayerGroup может использоваться многократно:
group.clearLayers();
group.addLayer(L.marker([51.5, -0.09]));
group.addLayer(L.marker([51.51, -0.1]));
Такой подход характерен для интерфейсов, где данные постоянно обновляются, но структура группы сохраняется.
LayerGroup выступает как промежуточный уровень между отдельными слоями и картой. Он позволяет:
В крупных приложениях именно LayerGroup становится базовым строительным блоком композиции карты, на котором строятся более сложные абстракции, включая фильтры, слои данных и динамические визуализации.