Traffic-aware routing представляет собой подход к построению маршрутов, при котором выбор пути и расчет времени в пути зависят не только от геометрической длины дорог, но и от текущей или прогнозируемой загруженности дорожной сети. В рамках экосистемы Mapbox данный функционал реализуется через сочетание маршрутизационных API и визуализации слоев трафика в векторных картах.
Ключевая идея заключается в том, что ребра графа дорожной сети получают динамические веса, отражающие скорость движения транспорта в конкретный момент времени. Эти веса регулярно обновляются на основе агрегированных данных о движении транспортных средств.
Дорожная сеть в Mapbox представляется в виде графа, где:
В traffic-aware модели базовая метрика расстояния заменяется функцией времени:
t =
где:
Источники данных включают:
В основе построения маршрутов используется Mapbox Directions API,
который поддерживает профиль driving-traffic.
Запрос маршрута с учетом трафика включает параметр профиля:
https://api.mapbox.com/directions/v5/mapbox/driving-traffic/{coordinates}
Особенности этого профиля:
Ответ API содержит геометрию маршрута в формате GeoJSON Polyline, а также метаданные по сегментам:
duration — время с учетом трафика;distance — длина;congestion — уровень загруженности;weight — обобщенная стоимость маршрута.В Mapbox GL JS маршруты визуализируются через источники типа
geojson или vector.
Пример добавления маршрута:
map.on('load', () => {
map.addSource('route', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: routeGeometry
}
}
});
map.addLayer({
id: 'route-line',
type: 'line',
source: 'route',
layout: {
'line-join': 'round',
'line-cap': 'round'
},
paint: {
'line-color': '#3b9ddd',
'line-width': 6
}
});
});
Traffic-aware routing не ограничивается расчетом маршрута, но также включает визуальное отображение состояния дорог.
В Mapbox GL JS используется слой line с выражениями
match или interpolate, зависящими от уровня
загруженности:
map.addLayer({
id: 'traffic-layer',
type: 'line',
source: 'mapbox-traffic',
'source-layer': 'traffic',
paint: {
'line-color': [
'match',
['get', 'congestion'],
'low', '#2ecc71',
'moderate', '#f1c40f',
'heavy', '#e67e22',
'severe', '#e74c3c',
'#2ecc71'
],
'line-width': 2
}
});
Такой подход позволяет визуально разделять дорожную сеть по степени загруженности, создавая интерактивную карту транспортной ситуации.
Одним из ключевых элементов traffic-aware систем является способность к обновлению маршрута в реальном времени.
Процесс включает:
async function updateRoute(coordinates) {
const response = await fetch(directionsUrl(coordinates));
const data = await response.json();
const route = data.routes[0];
map.getSource('route').setData({
type: 'Feature',
geometry: route.geometry
});
}
Такой механизм позволяет поддерживать актуальность маршрута в условиях изменяющейся дорожной обстановки.
Traffic-aware routing использует взвешенный граф, где стоимость ребра определяется функцией:
w(e) = d(e) + t_{traffic}(e)
где:
В зависимости от сценария использования коэффициенты могут изменяться:
Скорости движения на дорогах не являются фиксированными и моделируются как временные функции. В Mapbox применяется интерполяция на основе исторических данных.
Функция изменения скорости может быть представлена как:
v(t) = v_0 (1 - c(t))
где:
Такой подход позволяет учитывать суточные и недельные паттерны движения.
Каждый сегмент маршрута может содержать атрибут congestion:
Эти значения используются как:
В Mapbox GL JS выражения позволяют динамически адаптировать стиль:
'line-color': [
'case',
['==', ['get', 'congestion'], 'heavy'], '#ff5c5c',
['==', ['get', 'congestion'], 'moderate'], '#ffa500',
'#00c853'
]
Live traffic layers предоставляют потоковые данные о состоянии дорог. В Mapbox GL JS они подключаются как векторные тайлы.
Обновление происходит через tile-based streaming, где:
Это обеспечивает масштабируемость при отображении больших городских агломераций.
Traffic-aware routing в Mapbox GL JS представляет собой связку:
Рендеринг происходит через WebGL, что позволяет:
При изменении условий маршруты могут незначительно смещаться в пределах дорожного графа. Алгоритмы перерасчета используют эвристики:
Функция стоимости пути может быть обобщена как:
C(P) = _{e P} w(e)
где путь ( P ) состоит из набора ребер ( e ), каждое из которых имеет динамический вес.
Mapbox GL JS поддерживает реактивную модель обновления состояния карты:
Это особенно важно для систем навигации, где задержка обновления может влиять на качество маршрута.
При увеличении нагрузки системы применяются следующие подходы:
Такая архитектура позволяет поддерживать высокую производительность при глобальном покрытии дорожной сети.