Удаление и обновление маркеров

Работа с маркерами в 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 снижает количество операций рендеринга
  • массовое удаление группы выполняется за O(1)
  • обновление геометрии внутри группы не требует перерасчёта всего слоя

Оптимизационная модель строится на минимизации операций addObject и removeObject, заменяя их на setGeometry там, где это возможно.

Типовые ошибки при обновлении и удалении

Часто встречающиеся проблемы связаны не с API, а с управлением ссылками:

  • потеря ссылки на маркер после добавления
  • повторное добавление одного и того же объекта без удаления
  • удаление объекта без синхронизации с локальными структурами данных
  • попытка обновления геометрии после удаления

Корректная архитектура всегда предполагает централизованный реестр объектов, синхронизированный с состоянием карты.

Сценарии динамического обновления

В приложениях мониторинга и навигации маркеры обновляются в режиме реального времени. Основная схема:

  • получение новых координат
  • поиск существующего объекта
  • setGeometry при наличии
  • addObject при отсутствии
  • removeObject при устаревании данных

Такая модель обеспечивает консистентность визуального слоя и предсказуемое поведение интерфейса при непрерывных изменениях данных.