HERE Technologies предоставляет в JavaScript API гибкую систему стилизации карт, где визуальные изменения могут быть не статичными, а плавно анимированными. Анимация стилей в HERE Maps строится на сочетании трёх механизмов: переходов свойств слоёв, интерполяции визуальных параметров и синхронизации со сценой карты (камерой и таймлайном отображения).
Стиль карты в HERE Maps API представляет собой набор правил, описывающих отображение векторных тайлов: дороги, здания, водные объекты, подписи и POI. Каждый элемент стиля может включать визуальные параметры:
Анимация появляется там, где эти параметры изменяются во времени, а не мгновенно.
В основе лежит концепция интерполируемых свойств — значений, которые могут плавно переходить из одного состояния в другое.
На уровне API смена стиля обычно происходит через
map.setStyle() или переключение схемы
(setBaseLayer, setScheme). Без дополнительных
механизмов это мгновенное обновление, но визуально оно может быть
сглажено через контролируемую анимацию.
Пример базового переключения стиля:
map.setStyle('https://custom-style-url/style.json');
Чтобы превратить это в анимацию, применяется подход с промежуточными состояниями:
Анимация в стиле чаще всего реализуется через линейную интерполяцию значений:
Общая модель интерполяции:
value(t) = start + (end - start) * t
где t изменяется от 0 до 1 во времени анимации.
Для кастомных эффектов используется
requestAnimationFrame, позволяющий синхронизировать
изменения со скоростью рендеринга браузера.
Пример плавного изменения прозрачности слоя:
function animateOpacity(layer, from, to, duration) {
const start = performance.now();
function frame(time) {
const t = Math.min((time - start) / duration, 1);
const opacity = from + (to - from) * t;
layer.setStyle({
opacity: opacity
});
if (t < 1) {
requestAnimationFrame(frame);
}
}
requestAnimationFrame(frame);
}
Этот подход используется для:
Отдельный класс анимаций связан не со стилем напрямую, а с положением камеры карты. Однако визуально они часто воспринимаются как стилизация сцены.
Ключевой метод:
map.getViewModel().setLookAtData({
position: { lat: 52.52, lng: 13.405 },
zoom: 12,
tilt: 45,
heading: 180
}, true);
Параметр true включает анимационный переход.
Связь со стилями проявляется в том, что:
Векторные стили поддерживают зависимость от zoom-уровня, что позволяет создавать псевдо-анимации без JavaScript.
Пример логики:
Хотя это не временная анимация, визуально это воспринимается как постепенное “раскрытие” карты.
Одним из самых заметных эффектов является смена темы карты (день/ночь, транспорт, спутник с наложением).
Плавность достигается через:
Пример кросс-фейда:
const oldLayer = map.getBaseLayer();
const newLayer = platform.getMapTileService().createTileLayer(...);
newLayer.setOpacity(0);
map.addLayer(newLayer);
animateOpacity(oldLayer, 1, 0, 800);
animateOpacity(newLayer, 0, 1, 800);
HERE Maps API позволяет изменять стиль отдельных объектов в runtime. Это используется для:
Пример:
mapObject.setStyle({
fillColor: 'rgba(255, 0, 0, 0.6)',
strokeColor: '#ff0000',
lineWidth: 4
});
При изменении этих параметров в цикле можно добиться эффекта пульсации или “дыхания” объекта.
Для создания эффектов активности используется периодическая анимация:
Пример пульсации:
function pulse(marker) {
let start = performance.now();
function animate(time) {
const t = (time - start) / 1000;
const scale = 1 + Math.sin(t * 3) * 0.3;
marker.setScale(scale);
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
}
При работе с движущимися объектами (например, транспортом или трекингом):
Пример зависимости стиля от скорости:
function getColor(speed) {
if (speed < 10) return '#888';
if (speed < 50) return '#2a7fff';
return '#ff3b3b';
}
Анимации в картографических приложениях критичны к производительности GPU.
Основные ограничения:
setStyle вызывают repaintОптимизационные подходы:
Максимальный визуальный эффект достигается при синхронизации:
Типичный сценарий — “погружение в карту”:
Сложные анимационные сцены строятся как последовательность таймлайнов:
Каждый этап реализуется через собственный интервал времени и независимые интерполяции, что позволяет избегать блокировок рендеринга и сохранять плавность интерфейса.