В OpenLayers визуальное перекрытие объектов на карте определяется несколькими независимыми механизмами: порядком слоёв в карте, параметрами z-index у слоёв, внутренним порядком отрисовки объектов внутри слоя и отдельными правилами для DOM-оверлеев.
Система рендеринга строится по принципу слоёного стека, где каждый уровень может иметь собственный контекст отрисовки (Canvas, WebGL или DOM). Итоговое изображение формируется путём последовательного наложения этих слоёв.
Базовый механизм определения глубины — порядок добавления слоёв в объект карты:
map.addLayer(rasterLayer);
map.addLayer(vectorLayer);
map.addLayer(labelLayer);
В этом случае labelLayer будет находиться выше
остальных, независимо от их типа.
При использовании коллекции слоёв (ol/Collection)
порядок определяется индексами внутри массива. Изменение порядка
элементов коллекции немедленно влияет на визуальное перекрытие.
Помимо порядка добавления, используется явное управление глубиной
через zIndex.
layer.setZIndex(10);
Слои с большим zIndex отображаются выше слоёв с меньшим
значением, независимо от порядка добавления.
Ключевые особенности:
zIndex работает только внутри группы слоёв одного
контейнера картыzIndex интерпретируется как
0Типичная схема использования:
zIndex = 0zIndex = 5–10zIndex = 20+LayerGroup позволяет объединять слои в логические блоки.
Внутри группы сохраняются те же правила:
zIndex применяется как дополнительный уровень
сортировкиПри конфликте значений:
zIndex группыВекторный слой (VectorLayer) имеет собственный порядок
отрисовки фич.
По умолчанию:
source)Для точечного и линейного рендера используется стиль с
zIndex:
style: new Style({
zIndex: 5
})
Более высокие значения поднимают объект выше других в пределах одного слоя.
При отрисовке внутри одного слоя учитываются дополнительные факторы:
zIndexПри конфликте перекрытия:
Это поведение можно частично переопределять стилями и кастомной сортировкой.
При использовании Canvas порядок строго императивный:
В WebGL:
Векторные данные могут группироваться, что иногда приводит к более сложному поведению наложения по сравнению с Canvas.
DOM-оверлеи (Overlay) находятся вне canvas-контекста
карты и управляются через CSS.
Основной механизм:
overlay.getElement().style.zIndex = '1000';
Особенности:
z-indexКонтейнер карты обычно имеет базовый стек, внутри которого overlay располагаются поверх всех визуальных слоёв карты.
HTML-маркеры, созданные через Overlay, ведут себя как
обычные DOM-узлы:
Конфликты z-index часто возникают между:
Векторные стили позволяют управлять визуальной иерархией внутри одного слоя:
zIndex в Stylefeature.get(...))Пример приоритизации:
Для более тонкого контроля используется renderOrder:
layer.setRenderOrder((a, b) => {
return a.get('priority') - b.get('priority');
});
Механизм позволяет:
При одновременном использовании нескольких механизмов приоритета возможны неоднозначности:
zIndex слоя перекрывает порядок добавленияrenderOrder влияет только внутри слояПри отладке визуального перекрытия учитываются сразу три уровня: