HTML-маркеры

HTML-маркеры в HERE Maps API for JavaScript представляют собой механизм размещения на карте произвольных DOM-элементов, которые ведут себя как географические объекты и синхронизируются с координатами карты при масштабировании и перемещении. В отличие от стандартных графических маркеров, HTML-маркеры позволяют использовать полноценную разметку, стили CSS и JavaScript-логику внутри элемента, что делает их основным инструментом для создания интерактивных интерфейсных слоёв поверх карты.

В основе работы HTML-маркеров лежит привязка DOM-узла к географической координате. Карта выполняет преобразование координат в пиксельные значения и обновляет позицию элемента при каждом изменении viewport.

В HERE Technologies этот механизм реализован через слой взаимодействия между картографическим движком и DOM-рендерингом, где каждый HTML-маркер существует как объект с геопривязкой и визуальным представлением.

Ключевые компоненты:

  • географическая координата (latitude/longitude)
  • DOM-элемент (HTMLElement)
  • объект маркера (DomMarker)
  • опции поведения (захват событий, смещение, масштабирование)

Базовое создание HTML-маркера

HTML-маркер создаётся через H.map.DomMarker. В качестве содержимого используется DOM-элемент, который может быть сформирован динамически.

const container = document.createElement('div');
container.className = 'custom-marker';
container.innerHTML = `
  <div class="marker-content">
    <span class="title">Объект</span>
  </div>
`;

const domIcon = new H.map.DomIcon(container);

const marker = new H.map.DomMarker(
  { lat: 52.5, lng: 13.4 },
  { icon: domIcon }
);

map.addObject(marker);

HTML-маркер отличается тем, что его визуальная структура полностью определяется разработчиком, включая вложенные элементы, стили и события.

Стилизация DOM-элементов

Стилизация осуществляется через CSS, что позволяет создавать сложные визуальные компоненты: карточки, бейджи, индикаторы состояния.

.custom-marker {
  position: relative;
  transform: translate(-50%, -100%);
}

.marker-content {
  background: white;
  padding: 6px 10px;
  border-radius: 6px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.2);
  font-size: 12px;
  white-space: nowrap;
}

Ключевой момент заключается в необходимости корректировки точки привязки элемента. По умолчанию координата соответствует левому верхнему углу, поэтому часто применяется transform для центрирования относительно географической точки.

Управление событиями внутри HTML-маркеров

HTML-маркеры поддерживают стандартную систему DOM-событий. Это позволяет реализовывать интерактивные элементы без дополнительной обвязки картографического API.

container.addEventListener('click', () => {
  console.log('Маркер нажат');
});

При этом события могут конфликтовать с обработкой событий карты (панорамирование, зум), поэтому часто требуется контроль propagation.

container.addEventListener('click', (event) => {
  event.stopPropagation();
});

Поведение при масштабировании и перемещении карты

HTML-маркеры пересчитывают своё положение при каждом изменении состояния карты. Это включает:

  • изменение центра карты
  • изменение масштаба (zoom)
  • вращение карты (если поддерживается)

При большом количестве DOM-маркеров производительность становится критическим фактором, так как каждый элемент участвует в layout-пересчёте браузера.

Опции DomMarker

H.map.DomMarker поддерживает набор параметров, влияющих на поведение:

const marker = new H.map.DomMarker(
  { lat: 52.5, lng: 13.4 },
  {
    icon: domIcon,
    volatility: true
  }
);

Основные параметры:

  • icon — DOM-иконка
  • volatility — включение динамического поведения при drag
  • minZoom / maxZoom — ограничения видимости
  • zIndex — управление порядком наложения

Использование смещения (anchor point)

Для точного позиционирования применяется настройка смещения. Это особенно важно для кастомных UI-элементов.

const container = document.createElement('div');
container.style.transform = 'translate(-50%, -100%)';

Такое смещение позволяет закрепить нижнюю точку маркера на координате, что соответствует визуальной логике «указателя».

Динамические HTML-маркеры

HTML-маркеры могут изменять содержимое без пересоздания объекта. Это важно для отображения состояния объектов в реальном времени.

container.querySelector('.title').textContent = 'Обновлённый объект';

Также возможно полное обновление DOM:

marker.setIcon(new H.map.DomIcon(newContainer));

Интеграция с данными и состоянием приложения

HTML-маркеры часто используются как слой визуализации бизнес-логики:

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

При работе с потоковыми данными маркеры обновляются асинхронно, что требует оптимизации:

  • батчинг обновлений
  • использование requestAnimationFrame
  • ограничение частоты пересчёта

Производительность и ограничения

DOM-рендеринг является наиболее ресурсоёмким способом отображения объектов на карте. При большом количестве HTML-маркеров возникают ограничения:

  • рост нагрузки на layout engine браузера
  • увеличение времени repaint
  • снижение плавности перемещения карты

Для масштабных сцен используется гибридный подход:

  • HTML-маркеры для интерактивных объектов
  • стандартные векторные маркеры для массовых данных

Работа с z-index и слоями

Порядок отображения регулируется через zIndex:

const marker = new H.map.DomMarker(
  { lat: 52.5, lng: 13.4 },
  {
    icon: domIcon,
    zIndex: 10
  }
);

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

Взаимодействие с оверлеями карты

HTML-маркеры существуют в едином пространстве слоёв карты, но при необходимости могут быть объединены с дополнительными оверлейными системами:

  • пользовательские информационные панели
  • всплывающие окна
  • контейнеры фильтров

При этом важно учитывать синхронизацию координат и viewport, чтобы визуальные элементы оставались согласованными с картой.

Особенности удаления и очистки

Удаление маркера выполняется через карту:

map.removeObject(marker);

После удаления DOM-элементы становятся недоступными через карту, однако при сложных приложениях требуется также очистка собственных ссылок, чтобы избежать утечек памяти.

Масштабирование интерфейсов с HTML-маркерами

При разработке интерфейсов с большим количеством DOM-маркеров применяется стратегия адаптивной детализации:

  • на низком зуме отображаются агрегированные маркеры
  • на высоком зуме раскрываются детальные DOM-элементы

Такой подход снижает нагрузку и повышает читаемость карты.

Взаимодействие с drag-сценариями

HTML-маркеры могут быть перетаскиваемыми при включении соответствующих опций. В этом режиме координаты обновляются в реальном времени.

marker.setData({ draggable: true });

При перемещении необходимо синхронизировать новые координаты с внешними данными приложения, иначе возникает рассогласование состояния.

Кастомные шаблоны DOM

HTML-маркеры часто строятся на основе шаблонов, генерируемых функциями:

function createMarker(title, value) {
  const el = document.createElement('div');
  el.className = 'marker';

  el.innerHTML = `
    <strong>${title}</strong>
    <div>${value}</div>
  `;

  return new H.map.DomIcon(el);
}

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

Совместимость с мобильными устройствами

На мобильных устройствах HTML-маркеры требуют оптимизации:

  • уменьшение количества DOM-узлов
  • упрощение теней и анимаций
  • ограничение частоты обновлений

В противном случае возможно снижение FPS при взаимодействии с картой.

Обработка обновлений состояния карты

HTML-маркеры реагируют на события карты:

  • mapviewchange
  • zoomlevelchange
  • pointermove

Эти события используются для синхронизации внешней логики интерфейса с положением маркеров и их визуальным состоянием.