Контрольные элементы интерфейса в HERE Maps JavaScript API формируют
отдельный слой поверх карты и управляются через UI-фреймворк библиотеки.
Архитектура разделяет саму карту (H.Map) и интерфейс
управления (H.ui.UI), что позволяет независимо настраивать
поведение и расположение элементов управления без изменения геометрии
карты.
Система позиционирования UI базируется на логическом разбиении области отображения карты на фиксированные зоны. Каждая зона представляет собой якорную точку, к которой привязываются контролы: масштабирование, переключение слоёв, компас, информация о карте и пользовательские элементы.
В HERE Maps API позиционирование контролов реализовано через абстракцию компоновки (layout system). Каждый элемент интерфейса размещается относительно контейнера карты и может быть закреплён в одной из стандартных позиций.
Основные логические области размещения:
Эти позиции определяются перечислением
H.ui.LayoutAlignment, которое используется при настройке
UI-компонентов.
Встроенные контролы карты по умолчанию распределяются по стандартной схеме:
Такое распределение задаётся при инициализации через
H.ui.UI.createDefault, где используется набор стандартных
контролов и их дефолтное позиционирование.
Создание интерфейса управления картой связано с объектом UI, который привязывается к экземпляру карты:
const platform = new H.service.Platform({
apikey: 'API_KEY'
});
const defaultLayers = platform.createDefaultLayers();
const map = new H.Map(
document.getElementById('map'),
defaultLayers.vector.normal.map,
{
center: { lat: 52.52, lng: 13.405 },
zoom: 10,
pixelRatio: window.devicePixelRatio || 1
}
);
const ui = H.ui.UI.createDefault(map, defaultLayers);
После инициализации создаётся набор стандартных контролов, каждый из которых уже закреплён за определённой зоной интерфейса.
Перераспределение элементов осуществляется через изменение их alignment. Каждый UI-компонент может быть перемещён в одну из доступных зон.
const zoomControl = ui.getControl('zoom');
zoomControl.setAlignment(H.ui.LayoutAlignment.TOP_RIGHT);
Таким образом, элемент масштабирования переносится из стандартной позиции в правый верхний угол.
Используемые значения:
TOP_LEFTTOP_RIGHTBOTTOM_LEFTBOTTOM_RIGHTЭти значения формируют основу всей системы компоновки интерфейса.
Стандартные элементы UI доступны через идентификаторы, что позволяет изменять их расположение после создания интерфейса.
const mapSettingsControl = ui.getControl('mapsettings');
mapSettingsControl.setAlignment(H.ui.LayoutAlignment.BOTTOM_RIGHT);
Изменение позиции не требует пересоздания UI, поскольку каждый контрол является автономным компонентом, встроенным в систему управления компоновкой.
Некоторые элементы могут содержать внутренние подкомпоненты, которые наследуют позиционирование от родительского контейнера.
При размещении нескольких контролов в одной зоне используется механизм стекового расположения. Элементы выстраиваются в порядке добавления и автоматически смещаются внутри контейнера.
Порядок определяется:
При переполнении зоны элементы могут переноситься в соседние области либо изменять компактность отображения.
Помимо стандартных элементов, система поддерживает пользовательские
контролы, реализуемые через H.ui.Control.
Создание кастомного элемента включает определение DOM-структуры и привязку к UI-слою:
const customControl = new H.ui.Control();
customControl.addEventListener('tap', () => {
console.log('custom action');
});
customControl.setContent('<div class="custom-button">Action</div>');
ui.addControl('customControl', customControl);
customControl.setAlignment(H.ui.LayoutAlignment.TOP_LEFT);
Пользовательские элементы ведут себя аналогично встроенным: они участвуют в общей системе компоновки и подчиняются правилам распределения зон.
Контролы могут быть объединены в контейнеры, формируя составные UI-блоки. Это используется для создания логически связанных панелей инструментов.
Группировка позволяет:
Пример группового контейнера:
const container = new H.ui.Container();
container.addChild(ui.getControl('zoom'));
container.addChild(ui.getControl('mapsettings'));
container.setAlignment(H.ui.LayoutAlignment.TOP_LEFT);
ui.addControl('mainGroup', container);
Контейнер становится единым элементом layout-системы и перемещается как цельный блок.
Система UI поддерживает изменение позиции контролов в runtime без пересоздания карты или интерфейса. Это позволяет адаптировать интерфейс под состояние приложения.
Пример переключения позиции:
function toggleZoomPosition() {
const zoom = ui.getControl('zoom');
const current = zoom.getAlignment();
zoom.setAlignment(
current === H.ui.LayoutAlignment.TOP_LEFT
? H.ui.LayoutAlignment.BOTTOM_LEFT
: H.ui.LayoutAlignment.TOP_LEFT
);
}
Такой механизм часто используется для адаптивных интерфейсов, где расположение элементов зависит от состояния карты, масштаба или пользовательского режима.
Позиционирование UI-элементов зависит от размеров DOM-контейнера, в котором размещена карта. При изменении размеров контейнера происходит перерасчёт layout-системы.
Ключевые аспекты:
window.addEventListener('resize', () => {
map.getViewPort().resize();
});
Без обновления viewport возможны смещения элементов интерфейса относительно карты.
UI в HERE Maps работает поверх canvas-слоя карты и не влияет на географические данные. Каждый контрол размещается в отдельном DOM-слое, что обеспечивает независимость от отрисовки тайлов.
Слои разделяются следующим образом:
Позиционирование контролов относится исключительно к UI-слою и не влияет на координатную систему карты.
Контролы сохраняют фиксированное положение относительно контейнера независимо от перемещения карты. При изменении центра или масштаба карты UI остаётся статичным, так как не привязан к географическим координатам.
Это отличие от объектов карты (markers, bubbles), которые следуют за географической системой координат.
В сложных интерфейсах используется комбинирование нескольких стратегий:
Такая архитектура позволяет формировать многоуровневый интерфейс, где каждый слой UI отвечает за отдельный тип взаимодействия.
Позиционирование контролов может сочетаться с темами UI. В зависимости от выбранного стиля изменяются:
Несмотря на визуальные изменения, логика LayoutAlignment
остаётся неизменной, обеспечивая стабильность структуры интерфейса.