В MapLibre GL JS интерфейс управления картой построен вокруг
модульной системы контролов, которые добавляются в фиксированные зоны
контейнера карты. Каждый контрол реализует интерфейс
IControl и интегрируется в DOM карты через единый механизм
addControl.
Размещение контролов опирается на четырёхзонную модель позиционирования:
top-lefttop-rightbottom-leftbottom-rightКаждая зона представляет собой стек контейнеров, в который последовательно добавляются элементы управления. Позиция задаётся при подключении контрола и определяет его физическое расположение относительно viewport карты.
Ключевая особенность: система не использует абсолютные координаты или grid-раскладку. Вместо этого применяется предсказуемая композиция DOM-узлов с управляемым порядком вставки.
Основной механизм интеграции контролов реализуется через метод:
map.addControl(control, position)
Параметры:
control — объект, реализующий интерфейс
IControlposition — строка одной из четырёх допустимых зонПример размещения навигационного контрола:
map.addControl(new maplibregl.NavigationControl(), 'top-right');
Повторное добавление контролов в одну и ту же зону приводит к их вертикальному стеку в порядке регистрации.
Удаление выполняется через:
map.removeControl(control)
Контрол удаляется из DOM независимо от позиции, так как связь хранится на уровне экземпляра.
Каждая зона создаёт отдельный контейнер с классами:
maplibregl-ctrl-top-leftmaplibregl-ctrl-top-rightmaplibregl-ctrl-bottom-leftmaplibregl-ctrl-bottom-rightВнутри располагаются группы:
maplibregl-ctrl-group
Эта структура обеспечивает единообразие визуального стиля и позволяет применять глобальные CSS-правила без привязки к конкретным контролам.
Особенности поведения:
Контрол масштабирования и вращения карты. Обычно размещается в верхнем правом углу:
map.addControl(new maplibregl.NavigationControl(), 'top-right');
Функции:
Контрол геолокации пользователя:
map.addControl(new maplibregl.GeolocateControl(), 'top-right');
Часто группируется с навигацией, образуя единый стек интерактивных элементов.
Масштабная линейка чаще размещается в нижних зонах:
map.addControl(new maplibregl.ScaleControl(), 'bottom-left');
Причина размещения — минимизация визуального конфликта с основными элементами управления.
Контрол атрибуции источников данных по умолчанию добавляется автоматически, но может быть переопределён:
map.addControl(new maplibregl.AttributionControl(), 'bottom-right');
Также может быть отключён через параметры и заменён кастомной реализацией.
Контролы внутри одной зоны имеют строгую последовательность DOM-вставки:
Приоритеты визуального наложения определяются не z-index контролов напрямую, а структурой контейнера и CSS-контекстом карты.
Важно учитывать:
Некоторые контролы могут быть заданы при инициализации карты через опции:
const map = new maplibregl.Map({
container: 'map',
style: 'style.json',
attributionControl: false
});
Далее контрол добавляется вручную:
map.addControl(new maplibregl.AttributionControl(), 'bottom-right');
Это позволяет централизованно управлять интерфейсом без автоматических вставок.
Контролы в MapLibre GL JS не ограничены встроенными компонентами. Любой объект, реализующий интерфейс:
onAdd(map)onRemove()getDefaultPosition() (опционально)может быть интегрирован в систему позиционирования.
Пример структуры:
class CustomControl {
onAdd(map) {
this._map = map;
this._container = document.createElement('div');
this._container.className = 'maplibregl-ctrl maplibregl-ctrl-group';
this._container.textContent = 'Custom';
return this._container;
}
onRemove() {
this._container.parentNode.removeChild(this._container);
this._map = undefined;
}
}
Добавление:
map.addControl(new CustomControl(), 'top-left');
Система контролов опирается на набор базовых CSS-классов:
maplibregl-ctrlmaplibregl-ctrl-groupОсновные особенности:
При необходимости возможно переопределение:
.maplibregl-ctrl-top-right {
margin-top: 20px;
}
или изменение поведения групп:
.maplibregl-ctrl-group {
border-radius: 8px;
}
Практика группировки контролов в одной области используется для:
Пример:
map.addControl(new maplibregl.NavigationControl(), 'top-right');
map.addControl(new maplibregl.GeolocateControl(), 'top-right');
map.addControl(new maplibregl.FullscreenControl(), 'top-right');
Результат — вертикальный стек интерактивных элементов в одной зоне, управляемый порядком добавления.
Контрол может быть перемещён только через удаление и повторное добавление:
map.removeControl(control);
map.addControl(control, 'bottom-left');
Внутреннего метода setPosition не предусмотрено, что
делает модель предсказуемой и исключает побочные эффекты перерасчёта
DOM.
Система контролов имеет ряд архитектурных ограничений:
Эти ограничения компенсируются стабильностью DOM-структуры и предсказуемостью поведения интерфейса при изменении состояния карты.