Режимы транспорта

В работе с интерактивными картами на базе Mapbox GL JS ключевую роль играет не только визуализация геоданных, но и моделирование способов перемещения между точками. Режимы транспорта определяют, каким образом строится маршрут, какие ограничения учитываются, какие дороги и тропы доступны, а также как интерпретируется время и расстояние.

В рамках платформы Mapbox транспортные режимы реализуются через Routing APIs (в первую очередь Directions API), которые интегрируются с картой и позволяют динамически переключать профиль маршрута без изменения логики отображения слоя карты.


Основные транспортные профили маршрутизации

В Mapbox Directions API и сопутствующих сервисах выделяются базовые профили, каждый из которых соответствует определённому способу передвижения.

Автомобильный режим (driving)

Автомобильный профиль используется для построения маршрутов с учётом дорожной сети, доступной для легкового транспорта.

Ключевые особенности:

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

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

https://api.mapbox.com/directions/v5/mapbox/driving/

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


Автомобильный режим с учётом трафика (driving-traffic)

Расширение стандартного автомобильного профиля, в котором учитываются реальные дорожные условия.

Особенности:

  • динамическая корректировка времени маршрута на основе текущего трафика;
  • использование исторических данных о загруженности дорог;
  • обновление ETA (Estimated Time of Arrival) в реальном времени;
  • поддержка альтернативных маршрутов с разными сценариями загруженности.

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


Пешеходный режим (walking)

Пешеходный профиль строит маршруты с учётом доступности территории для пешеходов.

Характерные черты:

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

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


Велосипедный режим (cycling)

Велосипедный профиль оптимизирует маршрут с учётом особенностей велосипедного движения.

Особенности:

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

В отличие от пешеходного режима, велосипедный маршрут допускает более длинные, но быстрые траектории.


Использование профилей в Mapbox GL JS

Mapbox GL JS не выполняет построение маршрутов самостоятельно, а служит визуальной оболочкой для отображения результатов API. Основная логика переключения режимов реализуется через взаимодействие с Directions API и последующую отрисовку GeoJSON-геометрии.

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

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

Динамическое переключение режимов

Переключение транспортного профиля обычно реализуется через изменение параметра URL запроса.

Пример логики:

function getRoute(profile, coordinates) {
  const baseUrl = "https://api.mapbox.com/directions/v5/mapbox/";
  const url = `${baseUrl}${profile}/${coordinates.join(';')}`;

  return fetch(url)
    .then(res => res.json())
    .then(data => data.routes[0].geometry);
}

Профиль передаётся как строка:

  • mapbox/driving
  • mapbox/driving-traffic
  • mapbox/walking
  • mapbox/cycling

При смене режима транспортировки достаточно повторно вызвать функцию и обновить источник данных на карте.


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

После получения геометрии маршрута он отображается через слой типа line.

Пример структуры слоя:

map.addSource('route', {
  type: 'geojson',
  data: {
    type: 'Feature',
    geometry: routeGeometry
  }
});

map.addLayer({
  id: 'route-line',
  type: 'line',
  source: 'route',
  paint: {
    'line-width': 4,
    'line-color': '#3b82f6'
  }
});

Визуализация маршрута не зависит от режима напрямую, однако часто используется различная стилизация для разных профилей:

  • автомобильный маршрут — насыщенный синий или фиолетовый;
  • пешеходный — зелёный;
  • велосипедный — оранжевый;
  • трафик-режим — градиенты в зависимости от скорости.

Альтернативные маршруты и режимы выбора

Многие профили поддерживают возврат нескольких альтернативных маршрутов.

Это позволяет:

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

Пример параметра:

alternatives=true

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


Комбинированные сценарии транспортировки

В сложных приложениях режимы транспорта используются не изолированно, а в комбинации.

Пример: мультимодальная логистика

  • пешком до станции;
  • общественный транспорт (внешняя система);
  • автомобиль на последнем участке.

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


Влияние режима на геометрию маршрута

Каждый транспортный профиль формирует различную геометрию пути:

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

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


Оптимизация производительности при работе с режимами

При частом переключении транспортных профилей важно учитывать:

Кэширование маршрутов

Повторные запросы с одинаковыми координатами и профилем можно кэшировать для снижения нагрузки на API.

Ограничение частоты запросов

При изменении режима в UI (например, переключатель вкладок) рекомендуется использовать debounce:

function debounce(fn, delay) {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => fn(...args), delay);
  };
}

Обновление источников без пересоздания слоя

В Mapbox GL JS предпочтительно обновлять source.setData, а не пересоздавать слой маршрута.


Географические ограничения режимов

Не все режимы одинаково доступны в каждой точке мира.

  • велосипедные маршруты могут отсутствовать в малых населённых пунктах;
  • пешеходные маршруты ограничены качеством OpenStreetMap-данных;
  • трафик-данные доступны только в регионах с поддержкой реального времени.

Это влияет на предсказуемость поведения интерфейса при переключении профилей.


Интерфейс переключения режимов

В прикладных решениях режимы транспорта часто представлены как UI-компоненты:

  • табы (car / walk / bike);
  • иконки транспорта;
  • выпадающие списки;
  • переключатели с визуальными индикаторами.

Каждое переключение связано с новым API-запросом и обновлением слоя маршрута на карте.


Работа с высотами и сложным рельефом

В велосипедном и пешеходном режимах может учитываться рельеф:

  • предпочтение маршрутов с меньшим набором высоты;
  • штраф за крутые подъёмы;
  • оптимизация по энергозатратам.

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


Связь с другими API маршрутизации

Транспортные режимы используются не только в Directions API, но и в:

  • Matrix API (расчёт времени между множеством точек);
  • Isochrone API (зоны достижимости);
  • Optimization API (задача коммивояжёра).

Во всех этих сервисах профиль транспорта влияет на форму графа доступности и итоговые расчёты.


Визуальная дифференциация режимов на карте

В интерфейсах на основе Mapbox GL JS часто применяется кодирование режимов цветом и стилем:

  • разные цвета линий;
  • пунктир для альтернативных маршрутов;
  • анимация движения вдоль линии;
  • градиенты для отображения скорости (в traffic-режиме).

Это позволяет пользователю интуитивно различать типы маршрутов без обращения к текстовым описаниям.


Поведение маршрутов при смене режима на лету

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

  • пересчёт геометрии;
  • возможное изменение стартовой и конечной точки маршрута (snap-to-road);
  • обновление ETA;
  • перерасчёт альтернатив.

В UI это обычно сопровождается временной индикацией загрузки и плавной анимацией замены линии маршрута.