Оверлеи в OpenLayers представляют собой механизм наложения произвольных HTML-элементов поверх карты с привязкой к географическим координатам. В отличие от слоёв, работающих с тайлами или векторной графикой внутри canvas/SVG, оверлеи оперируют DOM-элементами и используются для реализации всплывающих окон, тултипов, карточек объектов, пользовательских маркеров и интерактивных панелей.
Оверлей в OpenLayers связывает DOM-элемент с координатой карты и управляет его позиционированием при изменении масштаба, центра или проекции.
Ключевые свойства оверлея:
Оверлей создаётся как объект, который затем регистрируется в экземпляре карты.
DOM-структура оверлея формируется вручную, поскольку OpenLayers не навязывает шаблон отображения.
const container = document.createElement('div');
container.className = 'ol-popup';
const content = document.createElement('div');
content.className = 'ol-popup-content';
container.appendChild(content);
const closer = document.createElement('a');
closer.className = 'ol-popup-closer';
closer.href = '#';
container.appendChild(closer);
Подобная структура используется для реализации всплывающих окон с кнопкой закрытия и динамическим содержимым.
Создание оверлея выполняется через конструктор
Overlay.
import Overlay from 'ol/Overlay.js';
const overlay = new Overlay({
element: container,
positioning: 'bottom-center',
stopEvent: true,
offset: [0, -10],
autoPan: true,
autoPanAnimation: {
duration: 250
}
});
После создания объект не отображается до привязки к карте.
Оверлей добавляется в контекст карты как отдельная сущность.
map.addOverlay(overlay);
С этого момента OpenLayers начинает управлять его положением при каждом изменении вида карты.
Географическая привязка выполняется через метод
setPosition.
overlay.setPosition([lon, lat]);
Координаты должны соответствовать проекции карты. При использовании стандартной Web Mercator часто требуется преобразование:
import { fromLonLat } from 'ol/proj.js';
overlay.setPosition(fromLonLat([37.6173, 55.7558]));
Удаление привязки выполняется передачей undefined:
overlay.setPosition(undefined);
Параметр positioning определяет, как HTML-элемент
располагается относительно координаты.
Основные режимы:
bottom-leftbottom-centerbottom-rightcenter-leftcenter-centercenter-righttop-lefttop-centertop-rightЛогика основана на точке привязки: координата на карте соответствует выбранной точке элемента.
Пример:
positioning: 'top-center'
В этом режиме нижняя часть оверлея «смотрит» на координату, что часто используется для маркеров с всплывающими подсказками.
Параметр offset задаёт пиксельное смещение от точки
привязки.
offset: [15, -30]
Первое значение — горизонтальное смещение, второе — вертикальное. Это позволяет компенсировать размеры иконок или визуально отделять всплывающий блок от точки на карте.
DOM-элементы оверлея могут перехватывать события мыши. Параметр
stopEvent управляет этим поведением.
stopEvent: true
При значении true события кликов и прокрутки внутри
оверлея не передаются карте, что предотвращает случайное перемещение
карты при взаимодействии с интерфейсом оверлея.
При false взаимодействие с картой сохраняется даже при
кликах по элементу.
Оверлей может выходить за пределы видимой области. Для предотвращения
скрытия содержимого используется autoPan.
autoPan: true
В этом режиме карта автоматически смещается, чтобы оверлей оставался видимым.
Расширенная конфигурация:
autoPanAnimation: {
duration: 300
}
Движение карты становится плавным, что важно при появлении всплывающих окон в плотных интерфейсах.
Оверлей обычно используется для отображения информации об объектах карты. Содержимое DOM обновляется вручную:
content.innerHTML = `
<strong>Объект</strong><br>
Координаты: ${coord}
`;
overlay.setPosition(coord);
Обновление не требует пересоздания оверлея, что снижает нагрузку на DOM.
Карты OpenLayers поддерживают любое количество оверлеев одновременно.
map.addOverlay(overlay1);
map.addOverlay(overlay2);
map.addOverlay(overlay3);
Каждый оверлей независим по позиционированию и логике отображения. Это используется для реализации кластерных подсказок, групповых меток и интерактивных слоёв информации.
Удаление оверлея выполняется через карту:
map.removeOverlay(overlay);
После удаления DOM-элемент остаётся в памяти и может быть повторно использован или уничтожен вручную.
Оверлеи часто используются вместе с событиями карты:
map.on('click', function (event) {
const coord = event.coordinate;
overlay.setPosition(coord);
});
Это позволяет реализовать интерактивные всплывающие окна при клике по карте.
DOM-элемент оверлея может включать любые интерфейсные компоненты:
Структура не ограничивается OpenLayers и полностью контролируется разработчиком.
DOM-оверлеи создают нагрузку при большом количестве одновременно активных элементов. Основные ограничения связаны не с картой, а с браузерным рендерингом.
Типичные приёмы оптимизации:
autoPan при массовых обновленияхinnerHTMLПри каждом изменении вида карты OpenLayers пересчитывает экранные
координаты оверлея. Преобразование координат выполняется через
внутренние функции проекции, после чего DOM-элемент позиционируется
через CSS transform.
Это обеспечивает:
Если карта использует нестандартную систему координат, позиция оверлея должна быть приведена к проекции карты:
import { transform } from 'ol/proj.js';
overlay.setPosition(
transform([lon, lat], 'EPSG:4326', 'EPSG:3857')
);
Ошибки в преобразовании координат приводят к смещению оверлея вне ожидаемой области отображения.
Хотя для маркеров существуют векторные слои, DOM-оверлеи часто применяются для сложных визуальных маркеров, требующих интерактивности или нестандартной разметки.
Пример структуры:
Такой подход позволяет реализовать сложные интерфейсы без работы с canvas или SVG-стилями.