В системе построения маршрутов 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. Однако по умолчанию он отображает
только один маршрут, поэтому для работы с несколькими вариантами
требуется создание нескольких рендереров или ручная отрисовка
полилиний.
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.
Более гибкий способ — ручное построение линий с использованием
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);
});
Сравнение маршрутов обычно строится на следующих параметрах:
trafficModel)При необходимости более реалистичного расчёта времени используется
параметр 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. Это важно для построения навигационных
интерфейсов.
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)waypointsavoidTolls, avoidHighwaysdepartureTimeКаждое изменение может полностью перестроить набор доступных маршрутов, так как алгоритм маршрутизации пересчитывает граф дорог и ограничения.
При работе с альтернативными маршрутами следует учитывать: