Динамические стили в HERE Maps API основаны на разделении данных и визуального представления. Карта строится как набор слоёв (layers), каждый из которых может быть переопределён во время выполнения без пересоздания самой карты. Такой подход позволяет изменять внешний вид карты в ответ на события интерфейса, изменения состояния приложения или внешние данные.
Ключевая особенность архитектуры заключается в использовании векторных тайлов и стилевых описаний, которые интерпретируются движком рендеринга в реальном времени.
В JavaScript API базовая карта создаётся через объект платформы и контейнер карты:
const platform = new H.service.Platform({
apikey: 'YOUR_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
}
);
Смена стиля базового слоя выполняется через замену layer:
map.setBaseLayer(defaultLayers.vector.hybrid.map);
Варианты стандартных слоёв обычно включают:
normal.map — стандартный стильsatellite.map — спутниковыйhybrid.map — гибридный режимterrain.map — рельефный слойДинамическая смена слоя происходит без пересоздания объекта карты, что обеспечивает плавность интерфейса.
Векторные стили HERE основаны на декларативных JSON-описаниях. Они могут быть изменены частично или полностью во время работы приложения.
Пример загрузки кастомного стиля:
const customStyle = new H.map.Style('style.json', 'https://assets.example.com/styles/');
const vectorLayer = platform.getOMVService().createLayer(customStyle);
map.setBaseLayer(vectorLayer);
Стиль может содержать определения для:
Изменение стиля в runtime возможно через подмену style instance:
const nightStyle = new H.map.Style('night-style.json');
vectorLayer.setStyle(nightStyle);
Одним из ключевых механизмов динамических стилей является стилизация на основе свойств объектов (feature properties).
Пример функции стиля:
const styleFunction = (data) => {
if (data.get('traffic') === 'heavy') {
return {
strokeColor: 'red',
lineWidth: 6
};
}
return {
strokeColor: 'green',
lineWidth: 3
};
};
Применение к слою:
const vectorLayer = new H.map.layer.ObjectLayer({
dataProvider: provider,
style: styleFunction
});
Такой подход позволяет:
Динамическая стилизация часто привязывается к уровню zoom, что позволяет адаптировать карту под читаемость.
const zoomStyleFunction = (zoom, feature) => {
if (zoom < 10) {
return {
visibility: false
};
}
if (zoom < 14) {
return {
lineWidth: 2
};
}
return {
lineWidth: 5,
strokeColor: '#3366ff'
};
};
Использование:
const layer = new H.map.layer.ObjectLayer({
style: zoomStyleFunction
});
Основные сценарии:
Векторные слои в HERE Maps API поддерживают динамическое обновление стиля без пересоздания данных.
const layer = platform.getOMVService().createLayer(defaultStyle);
map.addLayer(layer);
Изменение визуализации слоя:
layer.getProvider().setStyle(customStyle);
Также возможно переключение между несколькими стилевыми конфигурациями:
function switchTheme(theme) {
const style = theme === 'dark'
? new H.map.Style('dark.json')
: new H.map.Style('light.json');
layer.getProvider().setStyle(style);
}
Маркерные объекты поддерживают изменение стиля после добавления на карту.
const marker = new H.map.Marker({ lat: 52.52, lng: 13.405 });
map.addObject(marker);
Изменение внешнего вида:
marker.setIcon(new H.map.Icon('icon-red.png'));
Для объектов с геометрией:
polyline.setStyle({
strokeColor: '#ff0000',
lineWidth: 4
});
Динамические изменения часто применяются для:
Стили часто изменяются в ответ на пользовательские события.
map.addEventListener('tap', (evt) => {
const target = evt.target;
if (target instanceof H.map.Marker) {
target.setIcon(new H.map.Icon('selected.png'));
}
});
Изменение стиля при наведении:
map.addEventListener('pointermove', (evt) => {
const obj = map.getObjectAt(evt.currentPointer.viewportX, evt.currentPointer.viewportY);
if (obj) {
obj.setStyle({ strokeColor: '#00ff00' });
}
});
Типовые события:
Динамические стили часто связаны с потоковыми данными:
setInterval(() => {
trafficLayer.getProvider().setStyle((feature) => {
const speed = feature.get('speed');
if (speed < 20) {
return { strokeColor: 'red' };
}
if (speed < 60) {
return { strokeColor: 'orange' };
}
return { strokeColor: 'green' };
});
}, 5000);
Используется для:
При интенсивном обновлении стилей важна производительность рендеринга.
Основные практики:
let lastUpdate = 0;
function updateStyle(feature) {
const now = Date.now();
if (now - lastUpdate < 100) {
return;
}
lastUpdate = now;
return {
strokeColor: feature.get('status') === 'ok' ? 'green' : 'red'
};
}
Динамические стили часто строятся как комбинация базовой темы и наложенных слоёв:
const baseLayer = platform.createDefaultLayers().vector.normal.map;
map.setBaseLayer(baseLayer);
const overlay = new H.map.layer.ObjectLayer(customProvider);
map.addLayer(overlay);
Слои могут включать:
Каждый слой может иметь независимую систему стилей, которая обновляется отдельно.
Стили могут зависеть от глобального состояния интерфейса:
function setMode(mode) {
const style = new H.map.Style(
mode === 'analysis' ? 'analysis.json' : 'standard.json'
);
vectorLayer.getProvider().setStyle(style);
}
Используемые состояния:
Такой подход превращает карту в реактивный UI-компонент, где визуализация напрямую зависит от состояния приложения.