Построение маршрутов без учёта дорожной обстановки подходит только для статических сценариев, когда важна геометрическая длина пути или приблизительное время прибытия. В реальных условиях на продолжительность поездки влияют пробки, дорожные работы, перекрытия, аварии и временные ограничения движения.
Платформа HERE предоставляет возможность интеграции актуальной дорожной информации непосредственно в процесс маршрутизации. Благодаря этому приложение может рассчитывать маршрут с учётом текущей ситуации на дорогах и автоматически выбирать наиболее быстрый путь.
Основными преимуществами такого подхода являются:
Интеграция трафика в HERE состоит из нескольких компонентов:
Типичная последовательность работы выглядит следующим образом:
В HERE Routing API учёт дорожной ситуации активируется параметром режима маршрутизации.
Пример формирования запроса:
const router = platform.getRoutingService(null, 8);
router.calculateRoute(
{
routingMode: 'fast',
transportMode: 'car',
origin: '52.53086,13.38469',
destination: '52.52698,13.43864',
return: 'polyline,summary,actions,instructions'
},
onSuccess,
onError
);
Ключевые параметры:
| Параметр | Назначение |
|---|---|
| routingMode | Режим построения маршрута |
| transportMode | Тип транспорта |
| origin | Начальная точка |
| destination | Конечная точка |
| return | Набор возвращаемых данных |
Для автомобильной маршрутизации сервис автоматически использует дорожную информацию, если она доступна для выбранного региона.
Параметр routingMode оказывает значительное влияние на
расчёт маршрута.
Максимально быстрое прибытие.
routingMode: 'fast'
Алгоритм стремится минимизировать время поездки и активно использует данные о трафике.
Минимальное расстояние.
routingMode: 'short'
Даже если маршрут короче, он может оказаться медленнее из-за пробок.
Предположим:
Если на маршруте А образовалась серьёзная пробка, система может выбрать маршрут Б, поскольку итоговое время поездки окажется меньше.
После расчёта маршрута сервис возвращает подробную статистику.
Пример обработки результата:
function onSuccess(result)
{
const route = result.routes[0];
const section = route.sections[0];
console.log(
'Время в пути:',
section.summary.duration
);
console.log(
'Расстояние:',
section.summary.length
);
}
Типичный объект:
{
"summary": {
"duration": 1850,
"length": 15420
}
}
Значения:
duration — время поездки в секундах;length — длина маршрута в метрах.Если трафик влияет на движение, длительность уже включает это влияние.
ETA (Estimated Time of Arrival) — прогнозируемое время прибытия.
Пример вычисления:
const duration = section.summary.duration;
const eta = new Date(
Date.now() + duration * 1000
);
console.log(eta);
Форматированный вывод:
const etaString =
eta.toLocaleTimeString();
console.log(
'Прибытие:',
etaString
);
Подобный подход используется в навигационных приложениях и логистических системах.
Наличие нескольких вариантов позволяет выбирать между скоростью и расстоянием.
Пример:
router.calculateRoute(
{
transportMode: 'car',
routingMode: 'fast',
alternatives: 3,
origin: '52.53086,13.38469',
destination: '52.52698,13.43864',
return: 'polyline,summary'
},
onSuccess,
onError
);
Обработка результатов:
function onSuccess(result)
{
result.routes.forEach(
(route, index) =>
{
console.log(
'Маршрут',
index + 1
);
console.log(
route.sections[0].summary
);
}
);
}
В условиях загруженного города альтернативы особенно полезны, поскольку позволяют объехать проблемные участки.
HERE предоставляет специальный слой дорожной информации.
Создание слоя:
const trafficLayer =
platform
.getMapTileService()
.createTileLayer(
'traffic.flow'
);
Добавление на карту:
map.addLayer(trafficLayer);
После этого дороги начинают отображаться различными цветами.
Обычно используются следующие обозначения:
| Цвет | Состояние |
|---|---|
| Зелёный | Свободное движение |
| Жёлтый | Незначительное замедление |
| Оранжевый | Средняя загруженность |
| Красный | Сильная пробка |
| Тёмно-красный | Практически остановившееся движение |
Такая визуализация позволяет быстро оценить дорожную ситуацию.
Кроме плотности потока, HERE предоставляет данные о дорожных событиях.
Среди них:
Запрос может возвращать данные в виде географических объектов и метаданных.
Пример структуры:
{
"incidents": [
{
"id": "12345",
"type": "ACCIDENT",
"criticality": "major"
}
]
}
После получения данных можно создавать маркеры.
Пример:
const marker =
new H.map.Marker(
{
lat: incident.lat,
lng: incident.lng
});
map.addObject(marker);
Для повышения информативности можно использовать разные иконки для разных типов событий.
Нередко требуется определить, насколько пробки увеличивают продолжительность поездки.
Подход состоит из двух расчётов:
Затем сравниваются значения времени.
Пример:
const delay =
trafficDuration -
normalDuration;
console.log(
'Задержка:',
delay
);
Процент увеличения времени:
const percent =
(
delay /
normalDuration
) * 100;
console.log(percent);
Подобная аналитика активно используется в корпоративных транспортных системах.
Дорожная ситуация может меняться каждую минуту.
Поэтому многие приложения выполняют периодический пересчёт маршрута.
Пример таймера:
setInterval(
() =>
{
calculateRoute();
},
60000
);
В данном случае новый маршрут строится каждую минуту.
Постоянная перестройка может раздражать пользователей.
Поэтому обычно сравниваются:
Пример:
if (
newDuration -
currentDuration >
300
)
{
rebuildRoute();
}
Маршрут обновится только при задержке более пяти минут.
Маршрут может проходить через несколько промежуточных мест.
Пример:
router.calculateRoute(
{
transportMode: 'car',
origin: '52.53086,13.38469',
via: [
'52.52000,13.41000',
'52.51500,13.42000'
],
destination: '52.52698,13.43864',
routingMode: 'fast'
},
onSuccess,
onError
);
Трафик анализируется для каждого сегмента маршрута.
При наличии дорожных проблем может потребоваться исключение некоторых типов дорог.
Пример:
router.calculateRoute(
{
transportMode: 'car',
avoid:
{
features:
[
'tollRoad'
]
}
},
onSuccess,
onError
);
Возможные варианты:
Это помогает строить более подходящие маршруты в сложной дорожной обстановке.
Системы доставки активно используют HERE Traffic для:
При большом количестве автомобилей даже сокращение среднего времени поездки на несколько минут способно существенно снизить операционные расходы.
При работе с трафиком следует учитывать несколько рекомендаций.
Не выполнять повторный запрос для одинаковых координат.
const cache = new Map();
Избегать слишком частых запросов.
const UPDATE_INTERVAL =
120000;
При работе с инцидентами желательно загружать данные только для текущего участка карты.
const bounds =
map.getViewModel()
.getLookAtData()
.bounds;
Это значительно уменьшает объём передаваемых данных.
Наиболее эффективные решения объединяют:
Такая интеграция превращает обычную карту в полноценную навигационную систему, способную реагировать на изменения дорожной ситуации в режиме реального времени и обеспечивать максимально точную маршрутизацию.