Навигация внутри зданий в экосистеме картографических сервисов строится на разделении геопространства на уровни (floors), привязке объектов к внутренним координатам и использовании специализированных слоёв данных, которые описывают структуру помещений, переходы между этажами и точки интереса внутри здания. В рамках платформы HERE Technologies и её веб-стека HERE Maps API for JavaScript реализуется модель, в которой внешняя (outdoor) и внутренняя (indoor) навигация объединяются в единую карту с возможностью переключения контекста.
Ключевая особенность indoor-навигации заключается в том, что привычные географические координаты WGS84 дополняются логической структурой здания: уровни, зоны, коридоры, помещения, входы, лифты и лестницы становятся объектами графа маршрутизации.
Внутренние карты в HERE реализуются через концепцию venue map — структурированного описания здания, где каждый элемент имеет геометрию и метаданные.
Основные сущности:
Каждый объект имеет внутренние координаты, обычно нормализованные относительно плана здания, что позволяет избегать зависимости от глобальной системы координат при расчёте маршрутов внутри помещений.
В 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 представляет собой слой логики, который синхронизирует текущий отображаемый уровень карты с состоянием venue.
Основные операции:
Пример ручного переключения:
provider.setActiveLevel(2);
При этом визуализируются только объекты, принадлежащие выбранному этажу, остальные скрываются или приглушаются.
Indoor search отличается от стандартного геокодинга тем, что запрос ограничивается контекстом venue.
Пример логики:
venueService.searchInVenue('coffee', 'venue:12345', (result) => {
console.log(result);
});
Каждый результат содержит:
Indoor routing опирается на граф связности, где узлы — это помещения и переходы, а рёбра — допустимые пути перемещения.
Маршрут может включать:
Алгоритм маршрутизации учитывает:
Пример запроса маршрута:
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);
});
Внутренние координаты отличаются от глобальных тем, что используют локальную систему отсчёта.
Основные особенности:
Для интеграции наружной и внутренней навигации используется трансформация:
Внутреннее позиционирование не может полагаться на GPS, поэтому используются альтернативные источники:
В API позиция пользователя передаётся как обновляемое событие:
map.addEventListener('tap', (evt) => {
const coord = map.screenToGeo(evt.currentPointer.viewportX, evt.currentPointer.viewportY);
});
В реальных сценариях координаты обновляются внешней системой позиционирования и синхронизируются с indoor-слоем.
Маршрут внутри здания визуализируется как полилиния, привязанная к внутренним координатам.
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, который сопоставляет их с этажом и геометрией здания.
Внутренние карты генерируют события, связанные с изменением контекста:
Пример обработки события:
provider.addEventListener('levelchange', (event) => {
console.log('Активный этаж:', event.level);
});
Событийная модель критична для построения адаптивных интерфейсов навигации, где интерфейс подстраивается под текущую зону здания.
Одна из ключевых задач — плавный переход между внешней и внутренней навигацией. В архитектуре HERE Technologies это решается через связующие узлы:
Алгоритм маршрута:
Такой подход позволяет объединить разные уровни детализации в единую навигационную систему.
При работе с большими зданиями возникает необходимость оптимизации:
Также используется динамическая детализация:
Indoor-карты могут содержать зоны с ограниченным доступом. В модели данных такие зоны маркируются атрибутами:
Маршрутизация учитывает эти ограничения и исключает запрещённые пути из графа, если отсутствуют соответствующие права доступа.
HERE Maps API for JavaScript позволяет добавлять пользовательские слои поверх indoor-карт:
Пример добавления слоя:
const customLayer = new H.map.Group();
customLayer.addObject(new H.map.Marker({ lat: 0, lng: 0 }));
map.addObject(customLayer);
Такие расширения позволяют адаптировать карту под конкретные сценарии: торговые центры, аэропорты, выставочные комплексы и медицинские учреждения.