Работа с маркерами в HERE Maps API строится вокруг объектной модели карты, где каждый маркер является самостоятельным объектом сцены, добавляемым в контейнер карты и управляемым через API-методы слоя или самого объекта карты. В контексте динамических приложений ключевую роль играют операции обновления координат и удаления объектов без пересоздания карты, поскольку именно они обеспечивают производительность и предсказуемое состояние визуализации.
Каждый маркер в системе HERE Maps API представлен экземпляром
H.map.Marker. Он размещается внутри объекта карты
H.Map и управляется через коллекцию объектов сцены.
Базовая структура:
const marker = new H.map.Marker({ lat: 52.5, lng: 13.4 });
map.addObject(marker);
После добавления маркер становится частью внутреннего графа объектов карты. Ссылки на него сохраняются в памяти приложения, что позволяет выполнять операции обновления и удаления напрямую через сохранённый экземпляр.
Для корректного обновления и удаления маркеров необходимо сохранять их экземпляры:
const markers = [];
function addMarker(coords) {
const marker = new H.map.Marker(coords);
map.addObject(marker);
markers.push(marker);
}
Без сохранения ссылок доступ к объектам становится невозможным, и любые изменения требуют обхода всех объектов слоя карты.
Маркер не является статичным изображением. Его геометрия может быть
изменена без удаления и повторного добавления. Основной метод обновления
— setGeometry.
marker.setGeometry({ lat: 52.52, lng: 13.405 });
Этот вызов изменяет положение объекта внутри сцены, сохраняя его идентичность, стили и привязанные данные.
При частом обновлении координат (например, при трекинге объектов в
реальном времени) использование setGeometry значительно
эффективнее, чем удаление и повторное создание маркера.
function updatePosition(marker, path, index) {
marker.setGeometry(path[index]);
}
Подобная модель используется в задачах анимации движения транспорта и GPS-трекинга.
Удаление маркера осуществляется через метод карты
removeObject:
map.removeObject(marker);
После удаления объект перестаёт участвовать в рендеринге и освобождается из внутреннего списка сцены.
Важно учитывать, что удаление не очищает внешние ссылки. Если маркер хранится в массиве приложения, требуется дополнительная очистка:
map.removeObject(marker);
const index = markers.indexOf(marker);
if (index !== -1) {
markers.splice(index, 1);
}
При работе с большим количеством маркеров часто применяется групповая
структура H.map.Group.
const group = new H.map.Group();
const marker1 = new H.map.Marker({ lat: 52.1, lng: 13.1 });
const marker2 = new H.map.Marker({ lat: 52.2, lng: 13.2 });
group.addObjects([marker1, marker2]);
map.addObject(group);
Удаление всей группы:
map.removeObject(group);
Данный подход позволяет выполнять очистку сцены за одну операцию без итерации по каждому маркеру.
В некоторых сценариях изменение геометрии недостаточно, например при смене иконки или визуального состояния. Тогда применяется замена объекта:
const newMarker = new H.map.Marker(newCoords);
map.removeObject(oldMarker);
map.addObject(newMarker);
Такой подход используется при изменении типов объектов (например, изменение состояния “активен/неактивен”).
Маркер может содержать HTML-иконку или SVG-элемент. В этом случае
обновление происходит через изменение icon:
const icon = new H.map.Icon('new-icon.png');
marker.setIcon(icon);
Это позволяет обновлять визуальный стиль без пересоздания объекта и без изменения его геометрии.
dataКаждый маркер может хранить произвольные данные:
marker.setData({
id: 123,
type: 'vehicle'
});
Данные используются для поиска и обновления конкретных объектов:
function findMarkerById(id) {
return markers.find(m => m.getData().id === id);
}
После нахождения объект может быть обновлён или удалён стандартными методами.
При потоковом обновлении координат критично минимизировать операции удаления. Основной принцип — переиспользование объектов:
function updateOrCreateMarker(id, coords) {
let marker = findMarkerById(id);
if (!marker) {
marker = new H.map.Marker(coords);
marker.setData({ id });
map.addObject(marker);
markers.push(marker);
} else {
marker.setGeometry(coords);
}
}
Такой подход снижает нагрузку на рендерер и предотвращает фрагментацию объектов сцены.
При необходимости полного сброса используется итерация по объектам карты:
map.getObjects().forEach(obj => {
if (obj instanceof H.map.Marker) {
map.removeObject(obj);
}
});
Этот метод применяется в сценариях смены слоя данных или полной перезагрузки отображаемой информации.
При большом количестве маркеров прямое добавление в карту может быть менее эффективно, чем использование группировки:
H.map.Group снижает количество операций рендерингаОптимизационная модель строится на минимизации операций
addObject и removeObject, заменяя их на
setGeometry там, где это возможно.
Часто встречающиеся проблемы связаны не с API, а с управлением ссылками:
Корректная архитектура всегда предполагает централизованный реестр объектов, синхронизированный с состоянием карты.
В приложениях мониторинга и навигации маркеры обновляются в режиме реального времени. Основная схема:
setGeometry при наличииaddObject при отсутствииremoveObject при устаревании данныхТакая модель обеспечивает консистентность визуального слоя и предсказуемое поведение интерфейса при непрерывных изменениях данных.