Контролы в OpenLayers представляют собой независимые UI-компоненты, привязанные к карте и предназначенные для взаимодействия пользователя с визуализацией. Они не являются частью слоя данных и не участвуют в отрисовке геометрии — их задача ограничена интерфейсной логикой: масштабирование, полноэкранный режим, масштабная линейка, подписи атрибуции и пользовательские элементы управления.
Контролы реализуются через базовый класс
ol/control/Control, который задаёт фундаментальную модель
поведения: DOM-элемент, связанный с картой, и набор методов жизненного
цикла (setMap, dispose, управление состоянием
активности).
Каждый контрол состоит из двух ключевых частей:
element) — визуальное
представлениеПри добавлении на карту происходит следующее:
Контейнеры делятся на области:
ol-overlaycontainer-stopeventol-overlaycontainerol-controlОни обеспечивают корректное наложение UI поверх тайлов и геометрии.
OpenLayers использует CSS-классы для закрепления контролов в углах карты:
ol-top-leftol-top-rightol-bottom-leftol-bottom-rightКаждый контрол при создании может быть помещён в одну из этих зон
через параметр target или через управление коллекцией
контролов карты.
Пример логики:
Zoom) чаще располагается сверху слеваFullScreen) — сверху справаAttribution) — снизу справаScaleLine) — снизу слеваКлючевой механизм позиционирования — свойство
target.
Контрол может быть привязан не к стандартному контейнеру карты, а к произвольному DOM-элементу:
new Control({
element: myElement,
target: document.getElementById('sidebar')
});
В этом случае:
Это используется для:
Контролы хранятся в коллекции:
map.getControls()
Коллекция поддерживает операции:
push() — добавлениеremove() — удалениеclear() — очисткаПорядок в коллекции влияет на порядок DOM-элементов внутри контейнера, что косвенно влияет на визуальную компоновку (особенно при использовании flex или absolute-стилей).
OpenLayers поставляется с набором стандартных контролов:
Контрол масштабирования:
Позиционируется через CSS класс контейнера, обычно:
ol-zoomПереключает карту в полноэкранный режим:
document.fullscreenElementОтображает масштабную линейку:
Отображает копирайты и источники данных:
Контролы располагаются через абсолютное позиционирование внутри контейнера карты:
.ol-control {
position: absolute;
}
Каждый угол задаёт своё смещение:
.ol-top-left {
top: 0;
left: 0;
}
.ol-bottom-right {
bottom: 0;
right: 0;
}
Контролы внутри этих контейнеров выстраиваются вертикально или горизонтально в зависимости от CSS правил конкретного компонента.
Создание собственного контролла начинается с наследования:
import Control from 'ol/control/Control';
class MyControl extends Control {
constructor(opt_options) {
const button = document.createElement('button');
button.innerHTML = 'X';
const element = document.createElement('div');
element.className = 'my-control ol-unselectable ol-control';
element.appendChild(button);
super({
element: element,
target: opt_options.target
});
}
}
Позиционирование определяется:
ol-controltarget (если используется)Контролы подчиняются правилам:
z-index управляет перекрытием слоёвВажно учитывать:
pointer-events перехватывают
взаимодействиеol-overlaycontainer-stopevent блокирует события карты
под контроломКонтролы могут быть объединены в логические блоки:
Такое объединение достигается:
Позиционирование может изменяться во время выполнения:
top-left и top-righttargetПример логики:
Контролы получают доступ к карте через setMap:
moveend,
change:resolutionКонтейнер ol-overlaycontainer-stopevent предотвращает
распространение событий на карту, обеспечивая независимое взаимодействие
интерфейса.
При изменении размеров карты:
Это снижает нагрузку и позволяет использовать контролы в высокодинамичных интерфейсах (анимации, WebGL-слои, тайловая подгрузка).
Контролы могут быть скрыты без удаления:
display: noneopacity и
pointer-eventsТакой подход сохраняет состояние и позволяет мгновенно вернуть интерфейс без пересоздания элементов.