FeatureGroup в Leaflet представляет собой
специализированную коллекцию слоёв, ориентированную на работу с
векторными объектами (маркерaми, полигонами, полилиниями и кругами),
которые должны рассматриваться как единая логическая сущность. В отличие
от базового контейнера LayerGroup, данный класс расширяет
возможности управления группой слоёв за счёт агрегированных операций,
обработки событий и работы с геометрией всей группы.
Ключевая особенность заключается в том, что FeatureGroup
не только хранит набор слоёв, но и предоставляет единый интерфейс
взаимодействия с ними как с цельным объектом карты.
Создание группы осуществляется через стандартный конструктор:
const group = L.featureGroup();
В момент инициализации можно сразу передать массив слоёв:
const group = L.featureGroup([
L.marker([51.5, -0.09]),
L.circle([51.51, -0.1], { radius: 200 }),
L.polygon([
[51.509, -0.08],
[51.503, -0.06],
[51.51, -0.047]
])
]);
Группа ведёт себя как слой-контейнер, который может быть добавлен на карту:
group.addTo(map);
Несмотря на схожесть, FeatureGroup обладает расширенным
функционалом:
LayerGroup выступает как универсальный контейнер, тогда
как FeatureGroup ориентирован на работу с геометрическими
объектами.
Добавление и удаление слоёв выполняется аналогично другим коллекциям:
group.addLayer(L.marker([51.5, -0.1]));
group.removeLayer(marker);
Очистка группы:
group.clearLayers();
Проверка наличия слоя:
group.hasLayer(marker);
Получение слоя по идентификатору:
group.getLayer(id);
Итерация по всем слоям:
group.eachLayer(function(layer) {
console.log(layer);
});
Одним из ключевых методов является вычисление границ всех объектов группы:
const bounds = group.getBounds();
map.fitBounds(bounds);
Метод агрегирует bounding box всех вложенных геометрических объектов и возвращает общий прямоугольник охвата. Это особенно важно при динамической отрисовке данных, например GeoJSON или пользовательских наборов объектов.
FeatureGroup объединяет события всех вложенных слоёв и
позволяет обрабатывать их на уровне группы.
group.on('click', function(e) {
console.log('Клик по любому объекту группы', e.layer);
});
События, возникающие внутри любого дочернего слоя, всплывают до уровня группы. Это устраняет необходимость навешивать обработчики на каждый объект отдельно.
Поддерживаются стандартные события Leaflet:
clickmouseovermouseoutcontextmenudblclickГруппа позволяет централизованно работать с интерактивностью:
group.bindPopup('Общая информация для всех объектов');
Если у вложенных слоёв уже есть собственные popups, Leaflet приоритетно использует их, но групповая логика может применяться как fallback или общий обработчик.
Одно из ключевых преимуществ FeatureGroup — возможность
применять стили ко всем дочерним слоям, если они поддерживают стилизацию
(например, Path-объекты):
group.setStyle({
color: 'red',
weight: 3,
opacity: 0.7
});
Метод проходит по всем вложенным слоям и применяет стиль к каждому
объекту, который поддерживает setStyle.
Это особенно эффективно при работе с полигонами и полилиниями, загруженными динамически.
Группа может управлять интерактивностью вложенных объектов через массовые операции:
group.eachLayer(layer => {
layer.setInteractive(false);
});
Хотя прямого метода setInteractive у группы нет, доступ
через eachLayer позволяет централизованно управлять
поведением.
FeatureGroup часто используется как контейнер для
GeoJSON-слоёв:
const geoLayer = L.geoJSON(data);
const group = L.featureGroup([geoLayer]);
map.addLayer(group);
После добавления можно:
При работе с изменяющимися наборами объектов
FeatureGroup позволяет эффективно обновлять состояние
карты:
group.clearLayers();
data.forEach(item => {
const marker = L.marker(item.coords);
group.addLayer(marker);
});
После обновления можно автоматически подогнать карту:
map.fitBounds(group.getBounds());
FeatureGroup может содержать другие группы, формируя
иерархическую структуру:
const subGroup = L.featureGroup([
L.marker([51.5, -0.1]),
L.marker([51.51, -0.11])
]);
const mainGroup = L.featureGroup([subGroup]);
Такой подход используется при сложной сегментации данных: регионы, категории объектов, тематические слои.
Не все методы одинаково применимы ко всем вложенным объектам:
setStyle работает только с
Path-объектами;getBounds игнорирует слои без геометрии;При смешанных типах слоёв часть операций выполняется частично, без генерации ошибок.
FeatureGroup применяется в ситуациях, где требуется
единое управление набором объектов:
Особую роль играет способность агрегировать события и вычислять общие границы без дополнительной логики со стороны разработчика.
Добавление группы:
map.addLayer(group);
Удаление:
map.removeLayer(group);
При добавлении на карту автоматически активируются все вложенные слои, а при удалении — деактивируются, сохраняя внутреннее состояние группы.
Методы управления порядком отрисовки применяются к вложенным слоям:
group.eachLayer(layer => {
layer.bringToFront();
});
Это важно при работе с перекрывающимися полигонами и маркерами, где визуальная иерархия имеет значение.
Внутренняя реализация основана на расширении LayerGroup,
с добавлением специализированных методов для работы с
Path-слоями и событийной агрегацией. Это делает его
промежуточным уровнем между универсальными контейнерами и
специализированными коллекциями геометрии.
Основной принцип работы заключается в делегировании операций дочерним слоям с последующей агрегацией результатов на уровне группы.