Traffic-aware routing

Основы учета дорожной обстановки в маршрутизации

Traffic-aware routing представляет собой подход к построению маршрутов, при котором выбор пути и расчет времени в пути зависят не только от геометрической длины дорог, но и от текущей или прогнозируемой загруженности дорожной сети. В рамках экосистемы Mapbox данный функционал реализуется через сочетание маршрутизационных API и визуализации слоев трафика в векторных картах.

Ключевая идея заключается в том, что ребра графа дорожной сети получают динамические веса, отражающие скорость движения транспорта в конкретный момент времени. Эти веса регулярно обновляются на основе агрегированных данных о движении транспортных средств.


Источники данных о трафике и модель дорожного графа

Дорожная сеть в Mapbox представляется в виде графа, где:

  • узлы — перекрестки и соединения дорог;
  • ребра — сегменты дорог с атрибутами;
  • веса — время проезда, зависящее от скорости движения.

В traffic-aware модели базовая метрика расстояния заменяется функцией времени:

t =

где:

  • ( d ) — длина дорожного сегмента,
  • ( v_{traffic} ) — текущая скорость движения с учетом загруженности.

Источники данных включают:

  • анонимизированные GPS-треки;
  • данные мобильных устройств;
  • исторические паттерны движения;
  • события дорожной инфраструктуры (аварии, перекрытия);
  • данные от государственных и коммерческих поставщиков.

Роль Mapbox Directions API в traffic-aware маршрутизации

В основе построения маршрутов используется Mapbox Directions API, который поддерживает профиль driving-traffic.

Запрос маршрута с учетом трафика включает параметр профиля:

https://api.mapbox.com/directions/v5/mapbox/driving-traffic/{coordinates}

Особенности этого профиля:

  • использование актуальных скоростей движения;
  • учет исторической модели загруженности дорог;
  • динамическое изменение ETA;
  • перерасчет маршрутов при изменении условий.

Ответ API содержит геометрию маршрута в формате GeoJSON Polyline, а также метаданные по сегментам:

  • duration — время с учетом трафика;
  • distance — длина;
  • congestion — уровень загруженности;
  • weight — обобщенная стоимость маршрута.

Отображение traffic-aware маршрутов в Mapbox GL JS

В 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 систем является способность к обновлению маршрута в реальном времени.

Процесс включает:

  • получение новых данных о трафике;
  • пересчет маршрута через Directions API;
  • обновление GeoJSON источника;
  • перерисовку слоя без перезагрузки карты.
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)

где:

  • ( d(e) ) — длина ребра,
  • ( t_{traffic}(e) ) — время прохождения с учетом трафика,
  • ( , ) — коэффициенты приоритизации.

В зависимости от сценария использования коэффициенты могут изменяться:

  • минимизация расстояния;
  • минимизация времени;
  • баланс между временем и расстоянием.

Интерполяция скоростей и прогнозирование

Скорости движения на дорогах не являются фиксированными и моделируются как временные функции. В Mapbox применяется интерполяция на основе исторических данных.

Функция изменения скорости может быть представлена как:

v(t) = v_0 (1 - c(t))

где:

  • ( v_0 ) — базовая скорость,
  • ( c(t) ) — коэффициент загруженности в момент времени.

Такой подход позволяет учитывать суточные и недельные паттерны движения.


Работа с congestion-сегментами

Каждый сегмент маршрута может содержать атрибут congestion:

  • low;
  • moderate;
  • heavy;
  • severe.

Эти значения используются как:

  • входные данные для маршрутизации;
  • стилизация линий на карте;
  • фильтры при анализе дорожной сети.

В Mapbox GL JS выражения позволяют динамически адаптировать стиль:

'line-color': [
  'case',
  ['==', ['get', 'congestion'], 'heavy'], '#ff5c5c',
  ['==', ['get', 'congestion'], 'moderate'], '#ffa500',
  '#00c853'
]

Интеграция live traffic layers

Live traffic layers предоставляют потоковые данные о состоянии дорог. В Mapbox GL JS они подключаются как векторные тайлы.

Обновление происходит через tile-based streaming, где:

  • каждый тайл содержит сегменты дорог;
  • сегменты обновляются независимо;
  • карта изменяется без полной перерисовки.

Это обеспечивает масштабируемость при отображении больших городских агломераций.


Комбинация routing и rendering pipeline

Traffic-aware routing в Mapbox GL JS представляет собой связку:

  1. API построения маршрута (Directions API);
  2. слой визуализации маршрута;
  3. слой трафика;
  4. динамическая система обновления данных.

Рендеринг происходит через WebGL, что позволяет:

  • обрабатывать тысячи дорожных сегментов;
  • применять фильтры и стили в реальном времени;
  • минимизировать задержки при обновлении данных.

Геометрическая корректировка маршрутов под трафик

При изменении условий маршруты могут незначительно смещаться в пределах дорожного графа. Алгоритмы перерасчета используют эвристики:

  • Dijkstra с динамическими весами;
  • A* с эвристикой времени;
  • time-dependent shortest path.

Функция стоимости пути может быть обобщена как:

C(P) = _{e P} w(e)

где путь ( P ) состоит из набора ребер ( e ), каждое из которых имеет динамический вес.


Реакция карты на изменения трафика

Mapbox GL JS поддерживает реактивную модель обновления состояния карты:

  • изменение источника данных вызывает обновление слоя;
  • WebGL pipeline пересчитывает визуализацию;
  • взаимодействие пользователя сохраняется без прерывания.

Это особенно важно для систем навигации, где задержка обновления может влиять на качество маршрута.


Масштабирование traffic-aware систем

При увеличении нагрузки системы применяются следующие подходы:

  • кэширование маршрутов;
  • агрегация трафика по зонам;
  • упрощение геометрии на низких зумах;
  • предрасчет популярных маршрутов.

Такая архитектура позволяет поддерживать высокую производительность при глобальном покрытии дорожной сети.