Indoor Maps API

Indoor Maps в HERE Maps API for JavaScript представляют собой слой пространственных данных, позволяющий отображать внутренние пространства зданий с поддержкой этажности, помещений, объектов интереса и маршрутизации внутри помещений. Подсистема основана на данных платформы HERE Technologies и интегрируется с векторным рендерингом, системой слоёв и событийной моделью карты.


Внутренние карты в HERE реализуются как расширение стандартной картографической сцены. Базовая модель включает:

  • геометрию зданий (building footprints)
  • этажные структуры (levels/floors)
  • объекты внутри помещений (indoor POI)
  • связность пространств (graph connectivity)
  • метаданные помещений (категории, идентификаторы, назначения)

Indoor слой не является отдельной картой — он накладывается на стандартную карту, активируясь при достижении определённого уровня масштабирования и наличии данных о здании.

Ключевая особенность архитектуры заключается в разделении:

  • внешнего контекста (outdoor scene)
  • внутреннего контекста (indoor venue scene)

Переключение между ними происходит автоматически или через API-состояние venue.


Модель данных Venue Map

Indoor Map в HERE базируется на концепции Venue Map — структурированного описания здания.

Основные сущности:

  • Venue — здание или комплекс зданий
  • Level — этаж
  • Space — помещение (комната, зал, зона)
  • Connector — лестницы, лифты, переходы
  • Object — точечные объекты (магазины, стойки, сервисы)

Каждый элемент имеет уникальный идентификатор и набор атрибутов:

  • name
  • category
  • geometry
  • accessibility
  • routing nodes

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


Инициализация Indoor слоя

Indoor функциональность активируется через конфигурацию карты и подключение venue сервисов.

const platform = new H.service.Platform({
  apikey: 'YOUR_API_KEY'
});

const layers = platform.createDefaultLayers();

const map = new H.Map(
  document.getElementById('map'),
  layers.vector.normal.map,
  {
    zoom: 18,
    center: { lat: 48.8589, lng: 2.3469 },
    pixelRatio: window.devicePixelRatio
  }
);

const beh * avior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));
const ui = H.ui.UI.createDefault(map, layers);

Indoor слой начинает подгружаться автоматически при наличии данных Venue в текущем экстенте карты.


Работа с уровнями этажей

Многоуровневая структура реализуется через управление активным уровнем (active level). В каждом здании может быть несколько этажей, и только один или несколько отображаются одновременно.

Основные операции:

  • установка активного этажа
  • переключение между уровнями
  • получение списка доступных этажей
  • синхронизация уровня с зумом

Пример логики переключения:

venueService.addEventListener('statechange', (event) => {
  const venue = event.venue;

  const levels = venue.getLevels();
  const activeLevel = venue.getActiveLevel();

  console.log('Active level:', activeLevel.getName());
});

При изменении масштаба карта может автоматически переключать уровень, если включён режим auto-level.


Отображение помещений и объектов

Indoor rendering использует векторные тайлы с дополнительным семантическим слоем.

Отображаемые элементы:

  • контуры помещений
  • зоны аренды (например, магазины в ТЦ)
  • навигационные узлы
  • служебные зоны (ограниченные области)
  • маркеры POI

Каждый объект может иметь стилизацию в зависимости от категории. Стили задаются через тему карты (map theme) или через кастомные правила рендера.

Пример изменения визуализации POI:

map.addEventListener('tap', function (evt) {
  const target = evt.target;

  if (target instanceof H.map.Polygon) {
    console.log('Room ID:', target.getData());
  }
});

Интерактивность Indoor сцены

Indoor слой поддерживает полноценную событийную модель:

  • tap/click по помещениям
  • hover-подсветка
  • выбор POI
  • выделение маршрута внутри здания

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

Типичная схема взаимодействия:

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

Поиск и фильтрация внутри зданий

Indoor Maps поддерживают семантический поиск по объектам внутри venue.

Возможности:

  • поиск магазинов внутри торгового центра
  • фильтрация по категориям (еда, сервисы, офисы)
  • поиск по названию помещения
  • ранжирование по этажам

Алгоритм поиска учитывает:

  • текущий активный venue
  • уровень этажа
  • видимые слои

Результаты возвращаются как набор indoor POI с координатами внутри здания.


Indoor Routing

Маршрутизация внутри зданий строится на графе соединений:

  • узлы: двери, лифты, точки перехода
  • рёбра: допустимые переходы между узлами
  • веса: расстояние, время, ограничения доступа

Маршрут может включать:

  • переход с улицы в здание
  • перемещение между этажами
  • движение внутри помещения

Сценарий маршрутизации:

  • стартовая точка вне здания
  • вход через ближайший entrance node
  • переход на нужный этаж
  • достижение целевого POI

Indoor routing интегрируется с внешним routing, формируя единый путь end-to-end.


Управление видимостью Indoor слоя

Контроль отображения осуществляется через состояние venue и параметры слоя.

Основные режимы:

  • auto: автоматическое включение при zoom
  • manual: ручное переключение
  • disabled: полное отключение indoor данных

Дополнительно можно управлять:

  • видимостью этажей
  • подсветкой помещений
  • отображением POI категорий

Пример управления состоянием:

map.getLayers().forEach(layer => {
  console.log(layer.getProvider());
});

Производительность и оптимизация

Indoor Maps требуют оптимизации из-за высокой плотности объектов внутри зданий.

Основные стратегии:

  • загрузка данных по тайлам
  • lazy-loading этажей
  • кэширование venue объектов
  • упрощение геометрии на низких уровнях zoom
  • ограничение количества активных POI

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


Стилизация Indoor сцены

Стилизация выполняется через theme-based rendering.

Возможные уровни кастомизации:

  • цветовая схема этажей
  • выделение активного уровня
  • скрытие служебных зон
  • визуализация маршрута внутри здания

Стили могут зависеть от:

  • категории помещения
  • состояния (активное/неактивное)
  • принадлежности к маршруту

Событийная модель Indoor объектов

Каждый indoor объект может генерировать события:

  • pointer enter/leave
  • click/tap
  • selection change
  • level change

Пример обработки выбора объекта:

map.addEventListener('tap', (evt) => {
  const object = evt.target;

  if (object && object.getData) {
    const data = object.getData();
    console.log('Indoor object:', data);
  }
});

Интеграция с внешними системами

Indoor Maps часто интегрируются с:

  • системами управления зданиями (BMS)
  • навигационными мобильными приложениями
  • системами аналитики посещаемости
  • IoT-датчиками (позиционирование внутри помещений)

В таких сценариях indoor слой выступает визуальным интерфейсом для потоковых данных о пространстве.


Ограничения модели Indoor Maps

Несмотря на развитую функциональность, модель имеет структурные ограничения:

  • точность зависит от качества venue данных
  • динамические изменения помещений требуют обновления данных
  • сложность увеличивается при больших комплексах зданий
  • не все регионы имеют полное indoor покрытие

Indoor слой эффективен в сценариях с высокой плотностью POI и сложной этажной структурой, таких как аэропорты, торговые центры и бизнес-комплексы.