Планирование туров в экосистеме HERE Technologies строится вокруг задач маршрутизации, оптимизации последовательности точек посещения и синхронизации геоданных с интерактивной картой. В JavaScript API этот процесс объединяет несколько уровней: отображение карты, работа с геокодированием, построение маршрутов и расчет оптимального порядка остановок.
Ключевая особенность заключается в том, что тур рассматривается не как один маршрут, а как совокупность сегментов с возможной оптимизацией порядка посещения точек, временными ограничениями и дополнительными параметрами транспорта.
Основой любого туристического маршрута выступает набор структурированных сущностей:
Пример логической модели:
const tour = {
start: "52.5200,13.4050",
end: "52.5200,13.4050",
waypoints: [
"52.5160,13.3779",
"52.5186,13.4081",
"52.5096,13.3760"
],
optimizeOrder: true
};
Отображение тура начинается с инициализации карты и подключения слоя маршрутов:
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.5200, lng: 13.4050 },
zoom: 13
}
);
Интерактивность обеспечивается через обработчики событий и систему объектов карты (Map Objects), позволяющую динамически добавлять точки маршрута.
Перед построением маршрута адреса преобразуются в координаты через геокодирование:
const geocoder = platform.getSearchService();
geocoder.geocode(
{ q: "Alexanderplatz Berlin" },
(result) => {
const location = result.items[0].position;
console.log(location);
},
(error) => {
console.error(error);
}
);
Геокодирование критично для туров, где пользователь задаёт не координаты, а текстовые описания мест.
Маршрутизация выполняется через Routing API. В турпланировании ключевым режимом является оптимизация последовательности точек.
const routingService = platform.getRoutingService(null, 8);
const routingParameters = {
routingMode: "fast",
transportMode: "car",
origin: "52.5200,13.4050",
destination: "52.5200,13.4050",
via: new H.service.Url.MultiValueQueryParameter([
"52.5160,13.3779",
"52.5186,13.4081",
"52.5096,13.3760"
]),
return: "polyline,summary"
};
Важная особенность туров — замкнутый маршрут, где старт и финиш совпадают, а промежуточные точки оптимизируются.
Оптимизация маршрута является центральной задачей Tour Planning. Алгоритм перестраивает порядок посещения точек для минимизации времени или расстояния.
routingParameters.optimizeWaypoints = true;
При включенной оптимизации система:
Для больших наборов точек используется расширенный запрос:
const request = {
origin: "52.5200,13.4050",
destination: "52.5200,13.4050",
via: "52.5160,13.3779;52.5186,13.4081;52.5096,13.3760",
return: "polyline,summary,actions",
transportMode: "car",
routingMode: "fast",
optimizeWaypoints: true
};
Сервер возвращает:
Полученная полилиния декодируется и добавляется на карту:
const lineString = H.geo.LineString.fromFlexiblePolyline(
response.routes[0].sections[0].polyline
);
const routeLine = new H.map.Polyline(lineString, {
style: { strokeColor: "blue", lineWidth: 4 }
});
map.addObject(routeLine);
Дополнительно добавляются маркеры остановок:
const marker = new H.map.Marker({ lat: 52.5160, lng: 13.3779 });
map.addObject(marker);
Сложные туры часто разбиваются на сегменты:
Каждый сегмент рассчитывается отдельно, затем объединяется логически.
const segments = [
{ start: A, stops: [B, C], end: D },
{ start: D, stops: [E, F], end: A }
];
Такой подход снижает вычислительную сложность и повышает управляемость маршрута.
Для сценариев с большим количеством точек используется Distance Matrix API:
const matrixParams = {
origins: ["52.5200,13.4050", "52.5160,13.3779"],
destinations: ["52.5186,13.4081", "52.5096,13.3760"],
transportMode: "car"
};
Результат представляет собой таблицу расстояний и времени между всеми парами точек, что используется для построения оптимального тура.
В реальных сценариях туры ограничиваются временем:
Логика обработки:
const constraints = {
timeWindows: [
{ start: "09:00", end: "11:00" },
{ start: "12:00", end: "15:00" }
]
};
При расчёте маршрута система учитывает невозможность прибытия в недоступные интервалы.
Тур может изменяться динамически:
Каждое изменение инициирует пересчет маршрута:
tour.waypoints.push("52.5210,13.4090");
recalculateRoute(tour);
Интерактивность обеспечивается пересозданием маршрута без перезагрузки карты.
Визуальная структура тура включает:
Нумерация точек добавляется через кастомные маркеры:
const icon = new H.map.Icon("number-icon.png");
const numberedMarker = new H.map.Marker(position, { icon });
При увеличении числа точек возникает необходимость оптимизации:
Особенно критично при количестве точек > 25, где задача становится вычислительно сложной.
Tour Planning часто связывается с UI-компонентами:
Изменение UI состояния напрямую влияет на пересчет маршрута через события:
ui.on("reorder", (newOrder) => {
tour.waypoints = newOrder;
recalculateRoute(tour);
});
Типичные ошибки:
Обработка выполняется через callback ошибки:
(error) => {
if (error) {
console.log("Route calculation failed");
}
};
Сложные применения включают:
В таких сценариях комбинируются несколько API: routing, geocoding, matrix, fleet optimization.
При росте количества точек применяется иерархическая модель:
Такой подход снижает нагрузку на Routing API и повышает стабильность вычислений.