Класс FeatureGroup

Класс FeatureGroup в Leaflet представляет собой расширение слоя LayerGroup, предназначенное для объединения нескольких векторных объектов в единый логический контейнер с дополнительными возможностями управления стилями, событиями и геометрией. В отличие от базового LayerGroup, FeatureGroup рассматривает содержащиеся слои как набор «фич» (features), что позволяет применять к ним операции, характерные для векторной графики.


FeatureGroup наследует поведение от LayerGroup, но добавляет интерфейсы для работы с геометрическими объектами (Path layers). Это означает, что внутри группы могут находиться:

  • полилинии (Polyline)
  • полигоны (Polygon)
  • круги (Circle)
  • маркеры (Marker)
  • GeoJSON-слои (L.GeoJSON)

Ключевая особенность заключается в том, что FeatureGroup агрегирует не только добавление и удаление слоёв, но и их поведение:

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

Создание FeatureGroup

Создание группы выполняется через конструктор L.featureGroup():

const group = L.featureGroup();

Также возможно инициализировать группу сразу с наборами слоёв:

const group = L.featureGroup([
  L.marker([51.5, -0.1]),
  L.circle([51.51, -0.12], { radius: 200 }),
  L.polygon([
    [51.509, -0.08],
    [51.503, -0.06],
    [51.51, -0.047]
  ])
]);

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

group.addTo(map);

Управление слоями

FeatureGroup поддерживает полный набор методов LayerGroup, расширенных семантикой работы с фичами.

Добавление и удаление слоёв

group.addLayer(marker);
group.removeLayer(marker);

Удаление всех слоёв:

group.clearLayers();

Итерация по слоям

group.eachLayer(function(layer) {
  console.log(layer);
});

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


Геометрические границы группы

Одним из ключевых методов FeatureGroup является вычисление общей границы всех объектов.

const bounds = group.getBounds();
map.fitBounds(bounds);

Метод getBounds() возвращает объект LatLngBounds, который охватывает все векторные элементы внутри группы.

Особенности:

  • учитываются только слои с геометрией (Polyline, Polygon, Circle)
  • Marker включается как точка
  • пустая группа возвращает неопределённые границы

Управление стилями

FeatureGroup позволяет применять стили ко всем вложенным векторным слоям одновременно.

group.setStyle({
  color: 'blue',
  weight: 3,
  opacity: 0.7
});

Поведение метода:

  • применяется только к слоям, поддерживающим Path options
  • Marker игнорируется
  • изменения распространяются динамически на все существующие и будущие элементы

Это делает FeatureGroup удобным инструментом для тематического оформления наборов геометрии.


Управление порядком отображения

FeatureGroup поддерживает управление z-index для всех вложенных слоёв:

group.bringToFront();
group.bringToBack();

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


Обработка событий

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

group.on('click', function(e) {
  console.log('Клик по любому объекту группы', e.layer);
});

Передаваемые события

События содержат дополнительное поле:

  • layer — конкретный объект, вызвавший событие

Примеры событий:

  • click
  • mouseover
  • mouseout
  • contextmenu

Работа с GeoJSON

FeatureGroup часто используется как контейнер для GeoJSON-данных.

const geoLayer = L.geoJSON(data, {
  style: function(feature) {
    return { color: 'green' };
  }
});

const group = L.featureGroup([geoLayer]);
group.addTo(map);

При этом L.GeoJSON фактически наследует поведение FeatureGroup, что делает их тесно связанными концепциями.


Взаимодействие с картой

FeatureGroup интегрируется с картой как единый слой:

map.addLayer(group);
map.removeLayer(group);

Преимущества такого подхода:

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

Внутреннее поведение addLayer

При добавлении слоя происходит:

  1. проверка типа слоя
  2. регистрация в списке
  3. привязка событий к группе
  4. добавление на карту (если группа уже добавлена)

Особенности работы с Marker

Marker внутри FeatureGroup ведёт себя иначе, чем Path-объекты:

  • не участвует в setStyle
  • участвует в событиях группы
  • учитывается в getBounds
group.addLayer(L.marker([51.5, -0.09]));

Очистка и управление памятью

Метод clearLayers() выполняет полное удаление всех вложенных объектов:

group.clearLayers();

При этом:

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

Практика применения FeatureGroup

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

  • группировка объектов по смыслу (например, районы города, категории POI)
  • единое управление стилем
  • массовое скрытие/показ
  • вычисление общей геометрии
  • обработка событий на уровне набора объектов

Отличие FeatureGroup от LayerGroup

Возможность LayerGroup FeatureGroup
Группировка слоёв да да
События базовые агрегированные
setStyle нет да
getBounds нет да
Работа с Path-слоями ограничена расширена

FeatureGroup представляет собой специализированную версию LayerGroup, ориентированную на векторные данные.


Взаимодействие с динамическими слоями

FeatureGroup поддерживает добавление и удаление объектов в реальном времени:

setInterval(() => {
  group.addLayer(
    L.circle([51.5 + Math.random() * 0.01, -0.1], { radius: 50 })
  );
}, 1000);

Все новые элементы автоматически попадают под действующие стили и обработчики.


Использование getLayer и управление идентификацией

Каждый слой можно извлекать и модифицировать:

const layer = group.getLayer(id);
group.removeLayer(id);

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


Комбинирование с другими слоями

FeatureGroup может содержать:

  • другие FeatureGroup
  • LayerGroup
  • GeoJSON слои

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


Производственные сценарии

FeatureGroup применяется в системах, где требуется:

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

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