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

В системе построения маршрутов Google Maps JavaScript API поддержка альтернативных маршрутов реализуется через сервис DirectionsService, который возвращает несколько вариантов пути между точками A и B при соответствующей настройке запроса. Эти альтернативы позволяют учитывать разные дорожные условия, расстояния и время в пути, а также дают возможность пользователю выбирать оптимальный маршрут.


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

Основной параметр, отвечающий за возврат нескольких маршрутов, — provideRouteAlternatives. При установке его в true сервис возвращает массив маршрутов вместо единственного результата.

const directionsService = new google.maps.DirectionsService();

const request = {
  origin: "Karaganda, Kazakhstan",
  destination: "Astana, Kazakhstan",
  travelMode: google.maps.TravelMode.DRIVING,
  provideRouteAlternatives: true
};

directionsService.route(request, (result, status) => {
  if (status === "OK") {
    console.log(result.routes);
  }
});

В объекте result.routes содержится массив маршрутов, где каждый элемент представляет отдельный вариант пути.


Структура альтернативных маршрутов

Каждый маршрут в массиве routes содержит набор ключевых структур:

  • legs — сегменты маршрута между точками (обычно один leg для простых маршрутов)
  • overview_path — упрощённая полилиния всего маршрута
  • summary — краткое описание маршрута (например, основные дороги)
  • bounds — географические границы маршрута
  • warnings — предупреждения (если есть)
  • fare — информация о стоимости (для общественного транспорта)

Пример доступа к данным:

result.routes.forEach((route, index) => {
  console.log("Маршрут:", index);
  console.log("Обзор:", route.summary);
  console.log("Длина legs:", route.legs.length);
});

Отображение нескольких маршрутов на карте

Для визуализации альтернативных маршрутов используется DirectionsRenderer. Однако по умолчанию он отображает только один маршрут, поэтому для работы с несколькими вариантами требуется создание нескольких рендереров или ручная отрисовка полилиний.

Вариант с несколькими DirectionsRenderer

const renderers = [];

result.routes.forEach((route) => {
  const renderer = new google.maps.DirectionsRenderer({
    map: map,
    directions: result,
    routeIndex: result.routes.indexOf(route),
    polylineOptions: {
      strokeColor: "#4285F4",
      strokeOpacity: 0.6,
      strokeWeight: 4
    }
  });

  renderers.push(renderer);
});

Каждый DirectionsRenderer отображает свой маршрут через параметр routeIndex.


Индивидуальная отрисовка маршрутов через Polylines

Более гибкий способ — ручное построение линий с использованием google.maps.Polyline. Это позволяет полностью контролировать внешний вид альтернативных маршрутов.

result.routes.forEach((route, index) => {
  const path = route.overview_path;

  const polyline = new google.maps.Polyline({
    path: path,
    geodesic: true,
    strokeColor: index === 0 ? "#1a73e8" : "#999999",
    strokeOpacity: 0.8,
    strokeWeight: index === 0 ? 6 : 4,
    map: map
  });
});

В этом подходе можно визуально выделять основной маршрут и второстепенные варианты.


Обработка выбора маршрута

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

function selectRoute(index) {
  directionsRenderer.setRouteIndex(index);
}

При использовании нескольких рендереров логика выбора может переключать видимость слоёв:

renderers.forEach((renderer, i) => {
  renderer.setMap(i === selectedIndex ? map : null);
});

Метаданные маршрутов и сравнение вариантов

Альтернативные маршруты отличаются по времени, расстоянию и дорожным условиям. Эти данные находятся внутри legs.

result.routes.forEach((route) => {
  const leg = route.legs[0];

  console.log("Дистанция:", leg.distance.text);
  console.log("Время:", leg.duration.text);
});

Сравнение маршрутов обычно строится на следующих параметрах:

  • duration — время в пути
  • distance — расстояние
  • traffic_duration — время с учётом трафика (при включённом trafficModel)
  • steps — детализация маршрута

Учет трафика при альтернативных маршрутах

При необходимости более реалистичного расчёта времени используется параметр trafficModel.

const request = {
  origin: "Karaganda",
  destination: "Almaty",
  travelMode: google.maps.TravelMode.DRIVING,
  provideRouteAlternatives: true,
  drivingOptions: {
    departureTime: new Date(),
    trafficModel: "bestguess"
  }
};

Доступные значения:

  • bestguess — наиболее вероятная оценка
  • pessimistic — худший сценарий
  • optimistic — оптимистичный сценарий

Фильтрация и выбор предпочтительных маршрутов

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

const fastestRoute = result.routes.reduce((best, route) => {
  const bestTime = best.legs[0].duration.value;
  const currentTime = route.legs[0].duration.value;

  return currentTime < bestTime ? route : best;
});

Работа с шагами маршрута (Steps)

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

const steps = result.routes[0].legs[0].steps;

steps.forEach((step) => {
  console.log(step.instructions);
});

Каждый шаг содержит:

  • instructions — текст маршрута
  • distance — длина шага
  • duration — время выполнения
  • path — геометрия шага

Сравнение визуальных характеристик маршрутов

Альтернативные маршруты могут значительно отличаться визуально: один проходит через магистрали, другой через городские улицы. Для улучшения UX применяются стилизация и интерактивность:

  • изменение цвета выбранного маршрута
  • затемнение неактивных маршрутов
  • динамическое масштабирование карты под выбранный путь
polyline.setOptions({
  strokeColor: "#FF0000",
  strokeWeight: 6,
  strokeOpacity: 1
});

Геометрия альтернативных маршрутов

Каждый маршрут содержит упрощённую линию overview_path, но также доступна детализированная геометрия через steps. Это позволяет:

  • строить точные анимации движения
  • анализировать сложные участки маршрута
  • интегрировать навигацию с внешними системами
const fullPath = [];

result.routes[0].legs[0].steps.forEach(step => {
  fullPath.push(...step.path);
});

Поведение альтернативных маршрутов при изменении параметров

Количество и качество альтернативных маршрутов зависит от входных параметров запроса:

  • изменение travelMode (DRIVING, WALKING, BICYCLING, TRANSIT)
  • добавление waypoints
  • включение avoidTolls, avoidHighways
  • изменение departureTime

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


Ограничения и особенности

При работе с альтернативными маршрутами следует учитывать:

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