В экосистеме HERE Technologies поддержка внутренних пространств реализуется через отдельный слой данных, который дополняет стандартную картографию. Планы помещений (indoor maps) представлены в виде структурированных объектов: зданий, уровней (этажей), зон, помещений и точек интереса внутри сооружений.
Ключевая особенность архитектуры заключается в разделении уличной и внутренней картографии. Уличная карта предоставляется базовыми тайлами, тогда как внутренние пространства загружаются динамически при активации конкретного объекта (venue).
Внутренние карты в HERE Maps API основаны на следующих сущностях:
Загрузка планов помещений происходит не как единый набор данных, а как набор слоёв, активируемых при попадании камеры карты в область здания или при программном выборе venue.
Перед загрузкой внутренних планов необходимо создать базовую карту и подключить платформу 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]);
}
}
Основные операции:
При смене уровня автоматически обновляется геометрия помещений и 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);
}
}
});
Типичные события:
Загрузка планов помещений оптимизирована через ленивую подгрузку:
Механизм основан на tile-based streaming, где каждый уровень детализации загружается отдельно.
Для снижения нагрузки применяется многоуровневое кэширование:
Оптимизационные практики:
Внутренние карты часто используются совместно с геокодингом:
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.
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);
});