В экосистеме HERE Technologies карта представляет собой контейнер для набора слоёв, каждый из которых отвечает за отдельный тип пространственных данных. Слой может быть тайловым, векторным, растровым или пользовательским, а его содержимое обновляется независимо от других компонентов карты.
Базовая модель построена на трёх уровнях:
Динамическое обновление слоёв в этом контексте означает изменение содержимого provider’а, пересоздание тайлов, модификацию геометрии или переключение визуальных состояний без полного пересоздания карты.
Наиболее радикальный способ динамического обновления заключается в замене источника данных слоя:
const layer = new H.map.layer.TileLayer(
new H.map.provider.TileProvider({
min: 2,
max: 18,
getTile: function (x, y, z) {
return fetch(`/tiles/${z}/${x}/${y}.png`).then(r => r.blob());
}
})
);
map.addLayer(layer);
// Обновление источника данных
const newProvider = new H.map.provider.TileProvider({
min: 2,
max: 18,
getTile: function (x, y, z) {
return fetch(`/tiles-v2/${z}/${x}/${y}.png`).then(r => r.blob());
}
});
layer.setProvider(newProvider);
При такой схеме карта автоматически инициирует повторный запрос тайлов при следующем обращении к области видимости.
Более мягкий механизм основан на принудительном обновлении текущего provider без его замены.
tileProvider.refresh();
или через слой:
layer.getProvider().refresh();
Инвалидация приводит к повторному запросу только тех тайлов, которые попадают в текущий viewport. Это критично для производительности при частых обновлениях данных.
Для объектов, размещённых через H.map.Object, динамика
достигается изменением геометрии:
const line = new H.map.Polyline(
new H.geo.LineString(),
{ style: { strokeColor: 'blue', lineWidth: 4 } }
);
map.addObject(line);
// обновление координат
const geometry = line.getGeometry();
geometry.pushPoint({ lat: 52.5, lng: 13.4 });
geometry.pushPoint({ lat: 52.6, lng: 13.5 });
line.setGeometry(geometry);
Обновление геометрии не требует пересоздания объекта, но вызывает перерасчёт визуального представления слоя.
Векторные слои позволяют изменять данные на уровне feature без пересборки тайлов.
const provider = new H.map.provider.VectorTileProvider({
style: customStyle,
getTile: (x, y, z) => {
return fetch(`/vector/${z}/${x}/${y}.json`)
.then(r => r.json());
}
});
const layer = new H.map.layer.VectorLayer(provider);
map.addLayer(layer);
provider.setUrlTemplate('/vector-v2/{z}/{x}/{y}.json');
provider.refresh();
Такой подход используется при смене версий данных или переключении слоёв аналитики.
Система событий является ключевым механизмом синхронизации слоёв с внешними данными.
provider.addEventListener('tileload', (e) => {
console.log('Tile loaded:', e.tile.key);
});
Событийная модель позволяет внедрять потоковую актуализацию данных:
const socket = new WebSocket('wss://example.com/stream');
socket.onmess age = (event) => {
const data = JSON.parse(event.data);
data.points.forEach(p => {
const marker = markers.get(p.id);
if (marker) {
marker.setGeometry({ lat: p.lat, lng: p.lng });
}
});
};
Подобная схема используется в системах трекинга транспорта и IoT-платформах.
layer.getProvider().setStyle({
filter: (feature) => feature.properties.type === 'active'
});
Фильтрация позволяет динамически изменять видимость объектов без повторной загрузки данных.
layer.setVisibility(false);
layer.setVisibility(true);
Операция выполняется на уровне рендера и не затрагивает источник данных.
Динамическое обновление часто связано с изменением визуальной иерархии:
map.removeLayer(layer);
map.addLayer(layer);
или
map.setBaseLayer(baseLayer);
Порядок влияет на перекрытие тайлов и пользовательских объектов.
Система тайлового кеша в HERE Maps оптимизирована для минимизации сетевых запросов. Однако при динамических обновлениях требуется управление инвалидированием кеша.
Типовые стратегии:
'/tiles/v3/{z}/{x}/{y}.png'
Изменение версии автоматически сбрасывает кеш браузера и SDK.
provider.clearCache();
provider.refresh();
Используется при критических обновлениях данных, например при изменении дорожной ситуации.
Кластеризация часто является наиболее затратным компонентом слоя, поэтому обновление требует аккуратного подхода.
const clusteringProvider = new H.clustering.Provider(dataPoints, {
clusteringOptions: {
eps: 32,
minWeight: 2
}
});
clusteringProvider.addDataPoints(newPoints);
clusteringProvider.refresh();
При поступлении новых данных выполняется инкрементальное обновление, а не полная пересборка.
При высокочастотных изменениях данных ключевым становится контроль частоты обновлений слоя.
let timeout;
function updateLayer(data) {
clearTimeout(timeout);
timeout = setTimeout(() => {
provider.setData(data);
provider.refresh();
}, 200);
}
const batch = [];
function addUpdate(point) {
batch.push(point);
if (batch.length > 50) {
applyBatch();
}
}
function applyBatch() {
provider.addDataPoints(batch);
provider.refresh();
batch.length = 0;
}
Иногда требуется обновление только части карты, соответствующей текущему viewport:
const rect = map.getViewBounds();
provider.invalidateRect(rect);
Это снижает нагрузку и ограничивает перерисовку только активной зоной.
При комбинировании H.map.Object и tile-based layers
возникает необходимость синхронизации:
Пример согласованного обновления:
map.removeObjects(map.getObjects());
provider.refresh();
map.addObjects(newObjects);
Динамика может быть визуально сглажена через интерполяцию координат:
function animate(marker, from, to, steps) {
let i = 0;
const interval = setInterval(() => {
const lat = from.lat + (to.lat - from.lat) * (i / steps);
const lng = from.lng + (to.lng - from.lng) * (i / steps);
marker.setGeometry({ lat, lng });
i++;
if (i > steps) clearInterval(interval);
}, 16);
}
Такой подход применяется в системах реального времени, где резкие скачки объектов ухудшают визуальное восприятие.
При работе с несколькими слоями одновременно возникает необходимость координации обновлений:
Promise.all([
backgroundProvider.refresh(),
vectorProvider.refresh(),
overlayProvider.refresh()
]).then(() => {
map.getViewPort().resize();
});
Динамическое обновление включает не только изменение данных, но и корректное управление ресурсами:
map.removeLayer(layer);
layer.dispose();
Удаление слоя освобождает память и сетевые подписки, что критично при частой перестройке карты в SPA-приложениях.
Интеграция с внешними системами приводит к необходимости централизованного обновления:
function onFilterChange(filter) {
provider.setFilter(filter);
provider.refresh();
}
Динамическое обновление слоёв в HERE Maps API формируется как комбинация четырёх базовых механизмов:
Эта модель обеспечивает непрерывное обновление карты без полной её пересборки, сохраняя производительность при работе с большими потоками пространственной информации.