Загрузка планов помещений

В экосистеме HERE Technologies поддержка внутренних пространств реализуется через отдельный слой данных, который дополняет стандартную картографию. Планы помещений (indoor maps) представлены в виде структурированных объектов: зданий, уровней (этажей), зон, помещений и точек интереса внутри сооружений.

Ключевая особенность архитектуры заключается в разделении уличной и внутренней картографии. Уличная карта предоставляется базовыми тайлами, тогда как внутренние пространства загружаются динамически при активации конкретного объекта (venue).


Архитектура данных внутренних пространств

Внутренние карты в HERE Maps API основаны на следующих сущностях:

  • Venue (объект здания) — логическая единица, описывающая сооружение
  • Levels (этажи) — иерархические уровни внутри здания
  • Spaces (помещения) — комнаты, залы, коридоры
  • POI (Points of Interest) — магазины, офисы, сервисные точки
  • Geometry layers — геометрическое представление контуров помещений

Загрузка планов помещений происходит не как единый набор данных, а как набор слоёв, активируемых при попадании камеры карты в область здания или при программном выборе venue.


Инициализация карты HERE Maps JS API

Перед загрузкой внутренних планов необходимо создать базовую карту и подключить платформу HERE Maps JS API.

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

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

На этом этапе загружается только базовая карта. Внутренние планы ещё не активированы.


Подключение сервиса внутренних пространств

Для работы с планами помещений используется Venue Service, который управляет загрузкой и отображением indoor-слоёв.

const venueService = platform.getVenueService();

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

const venueLayer = new H.map.layer.TileLayer(provider);
map.addLayer(venueLayer);

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


Загрузка и активация плана помещения

Активация indoor-карты происходит через идентификацию venue. Сервис автоматически определяет доступные здания в текущем viewport или позволяет загрузить конкретный объект по ID.

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

  if (venue && venue.getState) {
    venue.setState(H.venue.Provider.State.ACTIVE);
  }
});

При активации:

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

Работа с этажами здания

Каждое здание содержит набор уровней, которые управляются через API состояния venue.

function setFloor(venue, floorIndex) {
  const levels = venue.getLevels();

  if (levels && levels[floorIndex]) {
    venue.setActiveLevel(levels[floorIndex]);
  }
}

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

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

При смене уровня автоматически обновляется геометрия помещений и POI.


Отображение и стилизация помещений

Геометрия внутренних пространств рендерится через векторные слои. Каждый тип объекта может иметь собственную стилизацию:

  • торговые зоны
  • технические помещения
  • коридоры
  • общественные пространства
const style = {
  fillColor: 'rgba(200, 200, 200, 0.4)',
  strokeColor: '#333',
  lineWidth: 1
};

provider.setStyle(style);

Стили применяются на уровне provider, что позволяет централизованно управлять визуальным представлением.


Обработка событий взаимодействия

Внутренние карты поддерживают события выбора объектов внутри здания.

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

  if (target instanceof H.map.Polygon) {
    const properties = target.getData();

    if (properties && properties.name) {
      console.log('Объект:', properties.name);
    }
  }
});

Типичные события:

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

Динамическая загрузка данных помещений

Загрузка планов помещений оптимизирована через ленивую подгрузку:

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

Механизм основан на tile-based streaming, где каждый уровень детализации загружается отдельно.


Кэширование и производительность

Для снижения нагрузки применяется многоуровневое кэширование:

  1. Tile cache — хранение загруженных фрагментов карты
  2. Venue cache — сохранение структуры зданий
  3. Geometry cache — повторное использование геометрии этажей

Оптимизационные практики:

  • ограничение количества активных venues
  • отключение неиспользуемых слоёв
  • контроль zoom-level перед загрузкой indoor-данных

Интеграция с поиском зданий

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

const geocodingService = platform.getSearchService();

geocodingService.geocode(
  { q: 'mall' },
  result => {
    const location = result.items[0].position;
    map.setCenter(location);
    map.setZoom(19);
  },
  error => console.error(error)
);

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


Обработка состояния загрузки

Состояние загрузки внутренних планов можно отслеживать через события provider:

provider.addEventListener('statechange', function (evt) {
  console.log('Состояние venue:', evt.state);
});

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

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

Типовые проблемы интеграции

При работе с indoor-картографией часто возникают следующие ограничения:

  • отсутствие venue-данных в конкретном регионе
  • несовпадение координат здания и тайлов карты
  • задержки при первой загрузке этажей
  • конфликт слоёв при наложении кастомных объектов

Корректная работа достигается при строгом разделении логики уличных и внутренних слоёв и контроле уровня зума перед активацией 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,
  {
    center: { lat: 48.8566, lng: 2.3522 },
    zoom: 18
  }
);

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

const venueService = platform.getVenueService();

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

const venueLayer = new H.map.layer.TileLayer(provider);

map.addLayer(venueLayer);

provider.addEventListener('tap', evt => {
  const venue = evt.target;

  if (venue) {
    venue.setState(H.venue.Provider.State.ACTIVE);
  }
});

provider.addEventListener('statechange', evt => {
  console.log('Venue state:', evt.state);
});