В библиотеке OpenLayers интерфейс карты строится как композиция независимых контролов (controls), каждый из которых отвечает за отдельную функциональность взаимодействия пользователя с картой. Контролы представляют собой DOM-элементы, связанные с экземпляром карты и интегрированные в её жизненный цикл через механизм управления состоянием.
Контролы реализуются как классы, наследующие базовую структуру
ol/control/Control, что обеспечивает единообразие
поведения, подключение к карте и управление позиционированием в
интерфейсе.
Контроль в OpenLayers состоит из трёх ключевых компонентов:
ol.MapКаждый контрол создаётся как независимая единица, но управляется
через коллекцию карты controls. Эта коллекция позволяет
добавлять, удалять и переопределять стандартные элементы интерфейса.
Базовая структура:
import Control from 'ol/control/Control';
class CustomControl extends Control {
constructor(options) {
const button = document.createElement('button');
button.innerHTML = 'C';
const element = document.createElement('div');
element.className = 'custom-control ol-unselectable ol-control';
element.appendChild(button);
super({
element: element,
target: options.target,
});
button.addEventListener('click', this.handleClick.bind(this), false);
}
handleClick() {
console.log('Control activated');
}
}
Контролы инкапсулируют поведение и не требуют прямого доступа к
внутреннему состоянию карты, взаимодействуя через API экземпляра
Map.
Контрол увеличения и уменьшения масштаба реализован в модуле
ol/control/Zoom. Он добавляет две кнопки: увеличение и
уменьшение масштаба карты.
import Zoom from 'ol/control/Zoom';
const map = new Map({
target: 'map',
controls: [
new Zoom()
],
view: new View({
center: [0, 0],
zoom: 2
})
});
Контрол использует методы view.setZoom() и
view.getZoom() для управления состоянием отображения.
Каждое нажатие изменяет значение на ±1.
Контрол поворота карты (ol/control/Rotate) предназначен
для управления ориентацией карты относительно северного направления.
import Rotate from 'ol/control/Rotate';
const rotateControl = new Rotate({
autoHide: false
});
const map = new Map({
controls: [rotateControl]
});
Контрол работает через свойство rotation объекта
View. Изменение угла происходит через:
view.setRotation(angleInRadians);
Особенность заключается в использовании радиан вместо градусов, что соответствует внутренней математической модели библиотеки.
Контрол ol/control/Attribution отображает информацию об
источниках данных карты.
import Attribution from 'ol/control/Attribution';
const map = new Map({
controls: [
new Attribution({
collapsible: true
})
]
});
Контрол анализирует все активные слои карты и собирает их
attributions. Эти данные могут поступать из:
Динамическое обновление происходит при изменении видимости слоёв.
Контрол ol/control/FullScreen управляет режимом
полноэкранного отображения карты.
import FullScreen from 'ol/control/FullScreen';
const fullScreenControl = new FullScreen();
const map = new Map({
controls: [fullScreenControl]
});
Контрол использует стандартный Web API:
element.requestFullscreen()document.exitFullscreen()Состояние синхронизируется с картой через события изменения режима отображения.
Контрол масштаба (ol/control/ScaleLine) отображает
линейный масштаб карты.
import ScaleLine from 'ol/control/ScaleLine';
const scaleLine = new ScaleLine({
units: 'metric'
});
const map = new Map({
controls: [scaleLine]
});
Поддерживаются следующие единицы:
Контрол вычисляет масштаб на основе:
Формула пересчёта учитывает нелинейность Web Mercator проекции.
Контрол ol/control/OverviewMap создаёт мини-карту,
отображающую текущую область основного окна.
import OverviewMap from 'ol/control/OverviewMap';
const overview = new OverviewMap({
collapsed: false
});
const map = new Map({
controls: [overview]
});
OverviewMap содержит отдельный экземпляр Map, который
синхронизируется с основным через события:
moveendchange:resolutionchange:centerТаким образом реализуется двусторонняя связь между картами.
Контрол ol/control/ZoomSlider представляет вертикальный
ползунок управления масштабом.
import ZoomSlider from 'ol/control/ZoomSlider';
const map = new Map({
controls: [
new ZoomSlider()
]
});
Ползунок отображает диапазон zoom уровней и преобразует координату положения в значение масштаба:
Коллекция контролов управляется через
map.getControls():
const controls = map.getControls();
Добавление нового контрола:
controls.push(new FullScreen());
Удаление:
controls.removeAt(index);
Полная переинициализация:
const map = new Map({
controls: defaultControls().extend([
new ScaleLine()
])
});
По умолчанию OpenLayers добавляет набор базовых контролов через
defaultControls().
Полное отключение:
import { defaults as defaultControls } from 'ol/control';
const map = new Map({
controls: []
});
Частичное переопределение:
const map = new Map({
controls: defaultControls({
zoom: false,
rotate: false
})
});
Контролы размещаются в DOM через CSS-классы и параметр
target.
Основные позиции:
ol-top-leftol-top-rightol-bottom-leftol-bottom-rightПример:
new FullScreen({
className: 'custom-fullscreen-control'
});
Контролы используют абсолютное позиционирование внутри контейнера карты.
Контролы подписываются на события карты:
clickpointermovemoveendchange:viewЭто обеспечивает синхронизацию состояния интерфейса с данными карты.
Пример подписки:
map.on('moveend', () => {
console.log('map moved');
});
Контролы могут как инициировать изменения состояния, так и реагировать на них.
Стандартные контролы служат шаблоном для построения расширений интерфейса.
Типовой паттерн включает:
ControlMap и ViewПример контролла переключения слоя:
class LayerToggleControl extends Control {
constructor(layer) {
const button = document.createElement('button');
button.innerText = 'Layer';
const element = document.createElement('div');
element.className = 'ol-control';
element.appendChild(button);
super({ element });
button.addEventListener('click', () => {
const visible = layer.getVisible();
layer.setVisible(!visible);
});
}
}
Такой подход позволяет интегрировать пользовательские элементы в общую архитектуру интерфейса без нарушения внутренней логики библиотеки.