Система отображения данных в карте строится на концепции слоёв, где каждый слой отвечает за отдельный тип визуализации или источник данных. Базовая карта (растровая или векторная) служит фундаментом, поверх которого накладываются пользовательские объекты, геометрии и динамические данные.
Слой в контексте HERE Maps API представляет собой управляемую коллекцию объектов, которые могут быть отрисованы, обновлены или удалены независимо от других визуальных элементов.
Основные категории слоёв:
Ключевой принцип заключается в разделении данных и визуального представления: слой управляет отображением, а источники данных могут изменяться независимо.
Объектный слой является наиболее часто используемым механизмом для
добавления пользовательских элементов на карту. Он хранит экземпляры
H.map.Object, включая маркеры, линии, полигоны и группы
объектов.
Создание слоя:
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
}
);
const objectLayer = new H.map.layer.ObjectLayer();
map.addLayer(objectLayer);
Добавление маркера:
const marker = new H.map.Marker({ lat: 52.52, lng: 13.405 });
objectLayer.addObject(marker);
Добавление полилинии:
const lineString = new H.geo.LineString();
lineString.pushPoint({ lat: 52.52, lng: 13.405 });
lineString.pushPoint({ lat: 52.50, lng: 13.40 });
const polyline = new H.map.Polyline(lineString, {
style: { strokeColor: 'blue', lineWidth: 3 }
});
objectLayer.addObject(polyline);
Объектный слой поддерживает группировку через
H.map.Group, что позволяет управлять наборами объектов как
единым целым.
Пользовательские слои часто строятся на основе собственных моделей данных. Это могут быть:
Пример группировки данных:
const group = new H.map.Group();
const pointA = new H.map.Marker({ lat: 52.51, lng: 13.39 });
const pointB = new H.map.Marker({ lat: 52.53, lng: 13.42 });
group.addObjects([pointA, pointB]);
objectLayer.addObject(group);
Группы позволяют применять события сразу ко множеству объектов:
group.addEventListener('tap', function (evt) {
console.log('Группа объектов активирована');
});
Одним из наиболее гибких способов построения слоёв является
использование GeoJSON. HERE Maps API предоставляет парсер через
H.data.geojson.Reader.
Загрузка GeoJSON:
const reader = new H.data.geojson.Reader('data/points.geojson');
reader.parse();
const geoLayer = reader.getLayer();
map.addLayer(geoLayer);
Пример GeoJSON структуры:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [13.405, 52.52]
},
"properties": {
"name": "Центр"
}
}
]
}
Слой GeoJSON автоматически преобразует геометрию в объекты карты и позволяет применять стили через свойства.
Стилизация объектов может быть задана на уровне слоя:
const reader = new H.data.geojson.Reader('data/areas.geojson', {
style: function (feature) {
if (feature.getProperty('type') === 'danger') {
return {
fillColor: 'red',
strokeColor: 'darkred',
lineWidth: 2
};
}
return {
fillColor: 'green',
strokeColor: 'darkgreen'
};
}
});
Такой подход позволяет реализовывать тематические карты без ручного создания объектов.
В случаях, когда требуется интеграция нестандартных источников данных
(например, собственные серверы тайлов), используется
H.map.provider.TileProvider.
Базовая структура кастомного тайлового слоя:
const provider = new H.map.provider.TileProvider({
getTile: function (x, y, zoom) {
const url = `https://example.com/tiles/${zoom}/${x}/${y}.png`;
return new Promise((resolve, reject) => {
const img = new Image();
img.onl oad = () => resolve(img);
img.oner ror = reject;
img.src = url;
});
}
});
const customLayer = new H.map.layer.TileLayer(provider);
map.addLayer(customLayer);
Этот механизм используется для:
При большом количестве точек производительность становится
критическим фактором. Решение — кластеризация через
H.clustering.Provider.
const dataPoints = [
{ lat: 52.52, lng: 13.40 },
{ lat: 52.53, lng: 13.41 },
{ lat: 52.54, lng: 13.42 }
];
const dataPointsObjects = dataPoints.map(
p => new H.map.Marker(p)
);
const clusteringProvider = new H.clustering.Provider(
dataPointsObjects,
{
clusteringOptions: {
eps: 32,
minWeight: 2
}
}
);
const clusteringLayer = new H.map.layer.ObjectLayer(clusteringProvider);
map.addLayer(clusteringLayer);
Кластеры автоматически пересчитываются при изменении масштаба карты, объединяя близкие точки в агрегированные объекты.
Слои в HERE Maps API могут обновляться в реальном времени. Это особенно важно для:
Пример обновления позиции объекта:
marker.setGeometry({ lat: 52.55, lng: 13.45 });
Для массовых обновлений используется пересоздание или обновление групп:
group.removeAll();
group.addObjects(newObjectsArray);
Каждый слой может быть включён или выключен без удаления данных:
map.removeLayer(objectLayer);
map.addLayer(objectLayer);
Альтернативно можно управлять видимостью объектов:
marker.setVisibility(false);
marker.setVisibility(true);
Такой подход используется при построении интерфейсов с переключаемыми слоями:
Объекты внутри слоёв поддерживают событийную модель:
marker.addEventListener('tap', function (evt) {
console.log('Маркер выбран');
});
События могут распространяться вверх по иерархии:
Это позволяет реализовывать сложные сценарии взаимодействия без прямого обращения к каждому элементу.
При работе с большими наборами данных критично учитывать:
Рекомендованная стратегия:
Пример проверки границ:
map.addEventListener('mapviewchangeend', function () {
const bounds = map.getViewModel().getLookAtData().bounds;
console.log(bounds);
});
Практические приложения редко используют один слой. Обычно применяется комбинация:
Приоритет слоёв определяется порядком их добавления:
map.addLayer(baseLayer);
map.addLayer(geoLayer);
map.addLayer(objectLayer);
map.addLayer(customLayer);
Каждый последующий слой визуально перекрывает предыдущий, сохраняя независимость логики данных.
Часто данные для слоёв поступают из внешних источников:
Пример обновления через WebSocket:
socket.onmess age = function (event) {
const data = JSON.parse(event.data);
marker.setGeometry({
lat: data.lat,
lng: data.lng
});
};
Такой подход превращает карту в интерактивную систему визуализации в реальном времени, где слои отражают актуальное состояние внешней системы.