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 задаёт географические границы, в
пределах которых группа активна. Если текущий экстент карты не
пересекается с заданным, рендеринг группы отключается.
group.setExtent([minX, minY, maxX, maxY]);
Механизм используется для оптимизации производительности и условного отображения тематических данных.
Группа наследует событийную систему слоя. Основные события:
Прослушивание изменений коллекции:
group.getLayers().on('add', event => {
const layer = event.element;
});
Изменения внутри вложенных слоёв не всегда автоматически всплывают на уровень группы, поэтому при необходимости синхронизации требуется подписка на каждый слой отдельно.
Группы слоёв не создают дополнительного визуального слоя в WebGL или Canvas. Они являются логической абстракцией. Рендеринг оптимизируется следующим образом:
Использование групп позволяет уменьшить количество операций управления слоями на уровне карты, но не уменьшает количество фактически отрисовываемых данных.
Типичная структура базовых слоёв:
const baseMaps = new Group({
layers: [satelliteLayer, streetLayer, hybridLayer],
visible: true
});
Группировка по смыслу данных:
const thematic = new Group({
layers: [populationLayer, transportLayer]
});
Группа используется как единый переключатель:
baseMaps.setVisible(false);
thematic.setVisible(true);
Группы упрощают построение интерфейсов управления слоями, где одна операция изменяет состояние сразу нескольких визуальных компонентов.
Коллекции слоёв внутри группы обладают реактивностью. Это означает:
При этом вложенные группы сохраняют независимость коллекций, что позволяет комбинировать разные источники данных без конфликтов.
Несмотря на гибкость, модель имеет ряд архитектурных особенностей:
Эти ограничения компенсируются простотой структуры и предсказуемостью поведения.
Группа не влияет на источники данных слоёв. Каждый слой продолжает
самостоятельно запрашивать данные у своего source. Это
важно для:
Группа лишь регулирует участие слоя в процессе рендеринга.
Группы поддерживают динамическое изменение структуры в рантайме:
const layers = group.getLayers();
layers.insertAt(0, newBaseLayer);
layers.removeAt(2);
Такая гибкость используется при переключении режимов отображения и адаптивной подгрузке данных.
Группы слоёв формируют основу композиционного подхода к построению карты:
Иерархия может быть произвольной глубины, что позволяет моделировать сложные пространственные представления без изменения логики карты.