Навигация внутри зданий

Навигация внутри зданий в экосистеме картографических сервисов строится на разделении геопространства на уровни (floors), привязке объектов к внутренним координатам и использовании специализированных слоёв данных, которые описывают структуру помещений, переходы между этажами и точки интереса внутри здания. В рамках платформы HERE Technologies и её веб-стека HERE Maps API for JavaScript реализуется модель, в которой внешняя (outdoor) и внутренняя (indoor) навигация объединяются в единую карту с возможностью переключения контекста.

Ключевая особенность indoor-навигации заключается в том, что привычные географические координаты WGS84 дополняются логической структурой здания: уровни, зоны, коридоры, помещения, входы, лифты и лестницы становятся объектами графа маршрутизации.


Модель данных внутренних пространств

Внутренние карты в HERE реализуются через концепцию venue map — структурированного описания здания, где каждый элемент имеет геометрию и метаданные.

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

  • Venue (здание) — контейнер всей структуры
  • Level (этаж) — логический слой с собственной системой координат
  • Space (пространство) — помещение или функциональная зона
  • Connectivity graph (граф связности) — описывает переходы между пространствами
  • POI (точка интереса) — магазины, выходы, стойки, сервисные зоны

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


Подключение indoor-слоёв в JavaScript API

В HERE Maps API for JavaScript работа с внутренними картами начинается с загрузки venue-слоёв и активации менеджера объектов карты.

Пример инициализации базовой карты:

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,
  {
    zoom: 18,
    center: { lat: 52.5200, lng: 13.4050 },
    pixelRatio: window.devicePixelRatio
  }
);

const beh * avior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));

Для работы с внутренними пространствами подключается сервис venue:

const service = platform.getVenueService();

const venueService = new H.venue.Service(service);
const provider = new H.venue.Provider();

map.addLayer(provider.getLayer());

После добавления слоя карта начинает поддерживать загрузку зданий с внутренней структурой.


Загрузка и отображение зданий

Каждое здание загружается по идентификатору venueId. После получения данных формируется объект, содержащий этажи и их геометрию.

venueService.requestVenueById('venue:12345', (venue) => {
  provider.addVenue(venue);
});

После добавления venue становится доступна:

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

Управление этажами (Floor Control)

Навигация внутри зданий невозможна без механизма переключения уровней. Floor Control представляет собой слой логики, который синхронизирует текущий отображаемый уровень карты с состоянием venue.

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

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

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

provider.setActiveLevel(2);

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


Поиск объектов внутри здания

Indoor search отличается от стандартного геокодинга тем, что запрос ограничивается контекстом venue.

Пример логики:

  • пользователь находится внутри торгового центра
  • поиск выполняется только среди POI этого здания
  • результат возвращает внутренние координаты и этаж
venueService.searchInVenue('coffee', 'venue:12345', (result) => {
  console.log(result);
});

Каждый результат содержит:

  • название объекта
  • уровень (floorId)
  • координаты внутри здания
  • тип объекта (магазин, кафе, сервис)

Построение маршрутов внутри зданий

Indoor routing опирается на граф связности, где узлы — это помещения и переходы, а рёбра — допустимые пути перемещения.

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

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

Алгоритм маршрутизации учитывает:

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

Пример запроса маршрута:

const router = platform.getRoutingService();

const routingParameters = {
  mode: 'indoor',
  origin: 'venue:12345;level=1;x=120;y=340',
  destination: 'venue:12345;level=3;x=500;y=100',
  routing: 'fastest'
};

router.calculateRoute(routingParameters, (result) => {
  console.log(result);
});

Координатные системы внутри зданий

Внутренние координаты отличаются от глобальных тем, что используют локальную систему отсчёта.

Основные особенности:

  • начало координат привязано к плану этажа
  • единицы измерения нормализованы (часто пиксели или метры плана)
  • преобразование в WGS84 происходит только на уровне входов/выходов

Для интеграции наружной и внутренней навигации используется трансформация:

  • GPS → entrance node
  • indoor graph traversal
  • exit node → GPS

Определение положения внутри здания

Внутреннее позиционирование не может полагаться на GPS, поэтому используются альтернативные источники:

  • Wi-Fi fingerprinting
  • Bluetooth Low Energy маяки
  • инерциальные датчики (IMU)
  • визуальные маркеры

В API позиция пользователя передаётся как обновляемое событие:

map.addEventListener('tap', (evt) => {
  const coord = map.screenToGeo(evt.currentPointer.viewportX, evt.currentPointer.viewportY);
});

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


Отрисовка пользовательской навигации внутри venue

Маршрут внутри здания визуализируется как полилиния, привязанная к внутренним координатам.

const lineString = new H.geo.LineString();

lineString.pushPoint({ lat: 0, lng: 0 });
lineString.pushPoint({ lat: 0, lng: 50 });
lineString.pushPoint({ lat: 30, lng: 80 });

const routeLine = new H.map.Polyline(lineString, {
  style: { strokeColor: 'blue', lineWidth: 3 }
});

map.addObject(routeLine);

В indoor-контексте координаты интерпретируются через provider, который сопоставляет их с этажом и геометрией здания.


Событийная модель взаимодействия с indoor-картой

Внутренние карты генерируют события, связанные с изменением контекста:

  • смена этажа
  • вход в зону POI
  • приближение к объекту
  • изменение маршрута

Пример обработки события:

provider.addEventListener('levelchange', (event) => {
  console.log('Активный этаж:', event.level);
});

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


Интеграция indoor и outdoor навигации

Одна из ключевых задач — плавный переход между внешней и внутренней навигацией. В архитектуре HERE Technologies это решается через связующие узлы:

  • entrance nodes (входы в здания)
  • exit nodes (выходы)
  • transfer nodes (переходные зоны)

Алгоритм маршрута:

  1. построение внешнего маршрута до входа
  2. переход в indoor-режим
  3. расчёт маршрута внутри venue
  4. возврат к outdoor при выходе

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


Оптимизация отображения внутренних карт

При работе с большими зданиями возникает необходимость оптимизации:

  • подгрузка этажей по требованию (lazy loading)
  • кэширование geometry tiles
  • отключение невидимых уровней
  • упрощение геометрии при зуме

Также используется динамическая детализация:

  • при низком зуме показываются только контуры здания
  • при среднем — этажи
  • при высоком — отдельные помещения и POI

Безопасность и ограничения доступа

Indoor-карты могут содержать зоны с ограниченным доступом. В модели данных такие зоны маркируются атрибутами:

  • restricted
  • staff-only
  • private

Маршрутизация учитывает эти ограничения и исключает запрещённые пути из графа, если отсутствуют соответствующие права доступа.


Расширение функциональности через пользовательские слои

HERE Maps API for JavaScript позволяет добавлять пользовательские слои поверх indoor-карт:

  • динамические указатели
  • подсказки навигации
  • визуализация очередей или потоков людей
  • интеграция с IoT-датчиками здания

Пример добавления слоя:

const customLayer = new H.map.Group();

customLayer.addObject(new H.map.Marker({ lat: 0, lng: 0 }));

map.addObject(customLayer);

Такие расширения позволяют адаптировать карту под конкретные сценарии: торговые центры, аэропорты, выставочные комплексы и медицинские учреждения.