Группы слоев

OpenLayers предоставляет механизм группировки слоёв через ol/layer/Group, позволяющий объединять несколько слоёв в единый логический контейнер и управлять ими как единым объектом. Такой подход используется при построении сложных картографических интерфейсов, где требуется иерархия отображения, переключение наборов данных и централизованное управление визуальными слоями.

Группа слоёв представляет собой расширение базовой сущности слоя. Внутри она содержит коллекцию дочерних слоёв, реализованную через ol/Collection. Каждый элемент коллекции остаётся полноценным слоем со своими источниками данных, стилями и настройками рендеринга.

Ключевая особенность заключается в том, что группа сама является слоем, но при этом не имеет собственного источника данных. Её роль заключается в агрегации и делегировании поведения дочерним слоям.

Основные свойства:

  • layers — коллекция вложенных слоёв
  • visible — общая видимость группы
  • opacity — общая прозрачность
  • extent — ограничение области отображения
  • zIndex — порядок отрисовки относительно других слоёв

Создание группы слоёв

Группа создаётся через конструктор ol/layer/Group, которому передаётся массив или коллекция слоёв.

import Group from 'ol/layer/Group.js';
import TileLayer from 'ol/layer/Tile.js';
import OSM from 'ol/source/OSM.js';

const baseLayer = new TileLayer({
  source: new OSM(),
  visible: true
});

const group = new Group({
  layers: [baseLayer],
  visible: true
});

Группа может включать любые типы слоёв: тайловые, векторные, изображений и пользовательские реализации.

Иерархия и вложенность

Группы допускают вложенную структуру. Это позволяет строить многоуровневые композиции:

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

Пример вложенной структуры:

const roadsGroup = new Group({
  layers: [roadsLayer, highwaysLayer]
});

const infrastructureGroup = new Group({
  layers: [roadsGroup, railwaysLayer]
});

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

Управление коллекцией слоёв

Доступ к вложенным слоям осуществляется через методы коллекции:

Добавление слоя

group.getLayers().push(newLayer);

Удаление слоя

group.getLayers().remove(layer);

Очистка группы

group.getLayers().clear();

Итерация

group.getLayers().forEach(layer => {
  layer.setVisible(false);
});

Коллекция поддерживает реактивное поведение: изменения автоматически отражаются в карте без необходимости ручного обновления.

Видимость и наследование свойств

Свойства группы влияют на все вложенные слои. Наиболее значимым является параметр visible. При отключении группы рендеринг всех дочерних слоёв прекращается независимо от их индивидуальных настроек.

group.setVisible(false);

Однако индивидуальные свойства слоя сохраняются и восстанавливаются при повторной активации группы.

Opacity также распространяется каскадно:

group.setOpacity(0.5);

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

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

Группа участвует в общем порядке рендеринга карты. Вложенные слои сохраняют свой внутренний порядок, но итоговая позиция определяется положением группы среди других слоёв карты.

group.setZIndex(10);

Внутри группы порядок слоёв задаётся последовательностью в коллекции. Верхние элементы коллекции отображаются поверх нижних.

Extent и ограничение области отображения

Параметр extent задаёт географические границы, в пределах которых группа активна. Если текущий экстент карты не пересекается с заданным, рендеринг группы отключается.

group.setExtent([minX, minY, maxX, maxY]);

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

Событийная модель

Группа наследует событийную систему слоя. Основные события:

  • изменение коллекции слоёв
  • изменение видимости
  • изменение opacity

Прослушивание изменений коллекции:

group.getLayers().on('add', event => {
  const layer = event.element;
});

Изменения внутри вложенных слоёв не всегда автоматически всплывают на уровень группы, поэтому при необходимости синхронизации требуется подписка на каждый слой отдельно.

Производительность и рендеринг

Группы слоёв не создают дополнительного визуального слоя в WebGL или Canvas. Они являются логической абстракцией. Рендеринг оптимизируется следующим образом:

  • пропуск скрытых групп
  • исключение слоёв вне extent
  • батчинг отрисовки тайловых слоёв

Использование групп позволяет уменьшить количество операций управления слоями на уровне карты, но не уменьшает количество фактически отрисовываемых данных.

Практические модели использования

Базовые карты

Типичная структура базовых слоёв:

  • спутниковый слой
  • схематический слой
  • гибридный слой
const baseMaps = new Group({
  layers: [satelliteLayer, streetLayer, hybridLayer],
  visible: true
});

Тематические слои

Группировка по смыслу данных:

  • население
  • транспорт
  • инфраструктура
const thematic = new Group({
  layers: [populationLayer, transportLayer]
});

Переключаемые наборы данных

Группа используется как единый переключатель:

baseMaps.setVisible(false);
thematic.setVisible(true);

Интеграция с UI управления слоями

Группы упрощают построение интерфейсов управления слоями, где одна операция изменяет состояние сразу нескольких визуальных компонентов.

Особенности вложенных коллекций

Коллекции слоёв внутри группы обладают реактивностью. Это означает:

  • добавление слоя вызывает обновление карты
  • удаление слоя немедленно отражается на рендере
  • изменение порядка влияет на z-order без перерисовки всей структуры

При этом вложенные группы сохраняют независимость коллекций, что позволяет комбинировать разные источники данных без конфликтов.

Ограничения модели группировки

Несмотря на гибкость, модель имеет ряд архитектурных особенностей:

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

Эти ограничения компенсируются простотой структуры и предсказуемостью поведения.

Взаимодействие с источниками данных

Группа не влияет на источники данных слоёв. Каждый слой продолжает самостоятельно запрашивать данные у своего source. Это важно для:

  • тайловых сервисов
  • WMS/WFS запросов
  • локальных векторных наборов

Группа лишь регулирует участие слоя в процессе рендеринга.

Динамическое управление составом группы

Группы поддерживают динамическое изменение структуры в рантайме:

const layers = group.getLayers();

layers.insertAt(0, newBaseLayer);
layers.removeAt(2);

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

Композиционные паттерны

Группы слоёв формируют основу композиционного подхода к построению карты:

  • композиция базовых слоёв
  • композиция тематических доменов
  • композиция временных слоёв

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