Map matching

Map matching представляет собой процесс сопоставления сырых GPS-координат с реальной дорожной сетью. В контексте веб-картографии и интерактивных приложений этот процесс используется для «прилипания» треков к дорогам, восстановления маршрутов движения и повышения точности визуализации геоданных.

В экосистеме Mapbox GL JS map matching тесно связан с использованием Mapbox APIs и встраивается в поток обработки геоданных, отображаемых на векторных картах.

Природа задачи map matching

Сырые координаты GPS почти всегда содержат шум:

  • отклонения из-за отражений сигнала
  • погрешности в плотной городской застройке
  • редкие или нерегулярные точки трека
  • скачки координат при потере сигнала

Если просто отрисовать такие точки как LineString, маршрут выглядит «рваным» и не соответствует дорожной сети.

Map matching решает задачу поиска наиболее вероятного пути на графе дорог, который объясняет последовательность наблюдаемых координат.

Ключевая идея:

  • вход: последовательность GPS-точек
  • выход: маршрут, «привязанный» к дорогам

Роль Mapbox в map matching

Mapbox предоставляет специализированный Map Matching API, который работает поверх дорожного графа OpenStreetMap-данных и собственных тайловых сервисов.

Mapbox GL JS сам по себе не выполняет сложный map matching, но используется для:

  • визуализации исходного GPS-трека
  • отображения скорректированного маршрута
  • наложения результатов Map Matching API
  • интерактивного анализа движения

Архитектура процесса

Типичный pipeline выглядит следующим образом:

  1. Сбор GPS-данных (устройство / мобильное приложение)
  2. Формирование массива координат
  3. Отправка в Mapbox Map Matching API
  4. Получение «snap-to-road» геометрии
  5. Отрисовка результата в Mapbox GL JS

Формат входных данных

Mapbox Map Matching API принимает координаты в виде массива:

lon,lat;lon,lat;lon,lat

Дополнительно могут передаваться:

  • timestamps (временные метки)
  • радиусы погрешности
  • профиль маршрута (driving, cycling, walking)

Пример запроса:

https://api.mapbox.com/matching/v5/mapbox/driving/
-122.42,37.78;-122.45,37.91;-122.48,37.73
?geometries=geojson
&access_token=YOUR_TOKEN

Результат map matching

Ответ API содержит:

  • скорректированную геометрию маршрута
  • сегменты дорог
  • индекс сопоставленных точек
  • confidence score
  • дополнительные атрибуты (например, манёвры)

Пример структуры:

{
  "matchings": [
    {
      "geometry": {
        "type": "LineString",
        "coordinates": [...]
      },
      "confidence": 0.85
    }
  ]
}

Интеграция с Mapbox GL JS

Mapbox GL JS работает с GeoJSON-источниками, что делает интеграцию прямолинейной.

Добавление исходного GPS-трека

map.addSource('raw-track', {
  type: 'geojson',
  data: {
    type: 'Feature',
    geometry: {
      type: 'LineString',
      coordinates: rawCoordinates
    }
  }
});

map.addLayer({
  id: 'raw-track-line',
  type: 'line',
  source: 'raw-track',
  paint: {
    'line-color': '#ff0000',
    'line-width': 3
  }
});

Добавление скорректированного маршрута

После получения данных из Map Matching API:

map.addSource('matched-track', {
  type: 'geojson',
  data: matchedGeoJSON
});

map.addLayer({
  id: 'matched-track-line',
  type: 'line',
  source: 'matched-track',
  paint: {
    'line-color': '#00ff00',
    'line-width': 4
  }
});

Разделение слоёв позволяет визуально сравнивать:

  • исходный шумный трек
  • скорректированный маршрут

Принцип работы алгоритма Map Matching

Хотя Mapbox скрывает внутреннюю реализацию, типовая модель основана на комбинации:

1. Hidden Markov Model (HMM)

Каждая GPS-точка рассматривается как наблюдение, а возможные дорожные сегменты — как скрытые состояния.

Вероятность определяется как:

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

2. Viterbi algorithm

Используется для поиска наиболее вероятной последовательности дорог.

Геометрическая обработка данных

Map matching включает несколько стадий нормализации:

Интерполяция

Если точки слишком редкие:

  • добавляются промежуточные координаты
  • учитываются временные интервалы

Map projection snapping

Каждая точка «проецируется» на ближайший сегмент дороги.

Сглаживание траектории

После сопоставления применяется сглаживание:

  • удаление резких углов
  • корректировка дрожания GPS

Использование в реальном времени

В навигационных приложениях map matching часто работает в потоковом режиме.

Особенности реализации:

  • буферизация последних N точек
  • отправка батчами
  • дебаунсинг запросов к API
  • обновление слоя на карте без перерисовки всей сцены
let buffer = [];

function addPoint(point) {
  buffer.push(point);

  if (buffer.length >= 5) {
    sendToMapMatching(buffer);
    buffer = [];
  }
}

Оптимизация запросов

Map Matching API чувствителен к качеству данных:

  • слишком редкие точки ухудшают точность
  • слишком частые увеличивают стоимость и нагрузку

Оптимальный подход:

  • 1 точка каждые 1–3 секунды (движение автомобиля)
  • 1 точка каждые 5–10 метров (пешеход)

Работа с ошибками и шумом GPS

Типовые проблемы:

Jumping effect

Резкие скачки координат устраняются:

  • фильтрацией по скорости
  • ограничением максимального расстояния между точками

Urban canyon effect

В плотной застройке:

  • увеличивается радиус погрешности
  • применяется историческая траектория

Визуальная аналитика в Mapbox GL JS

Mapbox GL JS позволяет расширить map matching визуализацию:

Heatmap движения

map.addLayer({
  id: 'movement-heat',
  type: 'heatmap',
  source: 'raw-track'
});

Анимация маршрута

Используется интерполяция координат и requestAnimationFrame.

Форматы геометрии

Map Matching API поддерживает:

  • GeoJSON
  • Polyline
  • encoded polyline (для оптимизации трафика)

GeoJSON предпочтителен при работе с Mapbox GL JS из-за нативной поддержки.

Точность и confidence score

Каждый результат содержит коэффициент уверенности:

  • 0.0–0.5: низкая достоверность
  • 0.5–0.8: средняя
  • 0.8–1.0: высокая

Этот параметр используется для:

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

Сценарии применения

Map matching применяется в:

  • навигационных системах
  • логистике и трекинге транспорта
  • анализе спортивных маршрутов
  • системах мониторинга доставки
  • аналитике городского трафика

Связь с векторными тайлами

Mapbox GL JS использует векторные тайлы для отображения дорог.

Map matching фактически работает на том же графе, что и визуализация:

  • дороги = graph edges
  • перекрёстки = nodes
  • GPS точки = noisy observations

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

Поток обработки данных в клиенте

Типовой клиентский pipeline:

  1. Получение GPS
  2. Предварительная фильтрация
  3. Отправка в Map Matching API
  4. Получение GeoJSON
  5. Обновление источника в Mapbox GL JS
  6. Перерисовка слоя маршрута

Производительность и ограничения

Основные ограничения:

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

Оптимизация достигается за счёт:

  • сокращения количества точек
  • использования кэширования
  • группировки маршрутов

Работа с несколькими маршрутами

Map Matching API может возвращать несколько альтернативных matching paths:

  • primary route (основной)
  • alternative routes (альтернативные)

В Mapbox GL JS это отображается через:

  • разные слои
  • прозрачность линий
  • интерактивный выбор маршрута