Запрос маршрута в Google Maps JavaScript API строится вокруг сервиса DirectionsService, который отвечает за вычисление маршрута между точками, и DirectionsRenderer, который визуализирует результат на карте. Архитектура разделяет вычисление маршрута и его отображение, что позволяет гибко управлять результатом и интеграцией в интерфейс.
Маршрутизация в Google Maps API опирается на два ключевых объекта:
Такое разделение позволяет использовать один и тот же маршрут в разных представлениях или модифицировать отображение без повторного запроса к сервису.
Перед построением маршрута создаётся карта и подключается слой отображения:
let map;
let directionsService;
let directionsRenderer;
function initMap() {
map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 40.748817, lng: -73.985428 },
zoom: 13,
});
directionsService = new google.maps.DirectionsService();
directionsRenderer = new google.maps.DirectionsRenderer({
map: map,
suppressMarkers: false,
});
}
DirectionsRenderer привязывается к объекту карты, после чего автоматически управляет отображением полилиний маршрута и маркеров.
Запрос маршрута выполняется методом route у DirectionsService. Основная структура запроса включает начальную точку, конечную точку и параметры маршрутизации.
function calculateRoute() {
const request = {
origin: "Times Square, New York, NY",
destination: "Central Park, New York, NY",
travelMode: google.maps.TravelMode.DRIVING,
};
directionsService.route(request, (result, status) => {
if (status === "OK") {
directionsRenderer.setDirections(result);
}
});
}
Ключевые поля объекта запроса:
Поддерживаются различные типы маршрутов:
DRIVING — автомобильный маршрутWALKING — пеший маршрутBICYCLING — велосипедный маршрутTRANSIT — маршрут общественного транспортаtravelMode: google.maps.TravelMode.WALKING
Режим влияет на доступные дороги, время в пути и структуру возвращаемого результата.
Промежуточные точки позволяют строить сложные маршруты с несколькими остановками.
const request = {
origin: "Berlin",
destination: "Munich",
travelMode: google.maps.TravelMode.DRIVING,
waypoints: [
{ location: "Leipzig", stopover: true },
{ location: "Nuremberg", stopover: true }
],
};
Каждый waypoint может быть отмечен как остановка (stopover), что влияет на перерасчёт маршрута.
При наличии нескольких промежуточных точек возможно автоматическое упорядочивание маршрута для минимизации времени или расстояния.
const request = {
origin: "City A",
destination: "City B",
waypoints: [
{ location: "Point 1" },
{ location: "Point 2" },
{ location: "Point 3" }
],
optimizeWaypoints: true,
travelMode: google.maps.TravelMode.DRIVING,
};
После выполнения запроса порядок точек в ответе может отличаться от исходного.
Ответ DirectionsService содержит структуру с маршрутами, сегментами и шагами движения.
directionsService.route(request, (result, status) => {
if (status === "OK") {
const route = result.routes[0];
const leg = route.legs[0];
console.log(leg.distance.text);
console.log(leg.duration.text);
directionsRenderer.setDirections(result);
}
});
Каждый leg соответствует сегменту между двумя точками маршрута.
Результат запроса сопровождается статусом:
OK — маршрут успешно построенNOT_FOUND — не найдена точка маршрутаZERO_RESULTS — маршрут невозможенMAX_WAYPOINTS_EXCEEDED — превышено количество
промежуточных точекINVALID_REQUEST — некорректный запросOVER_QUERY_LIMIT — превышен лимит запросовОбработка статусов критична для стабильной работы интерфейса.
DirectionsRenderer поддерживает настройку внешнего вида маршрута:
directionsRenderer = new google.maps.DirectionsRenderer({
map: map,
polylineOptions: {
strokeColor: "#1a73e8",
strokeOpacity: 0.8,
strokeWeight: 6,
},
suppressMarkers: true,
});
Возможные настройки:
Сервис способен возвращать несколько вариантов маршрута:
const request = {
origin: "A",
destination: "B",
travelMode: google.maps.TravelMode.DRIVING,
provideRouteAlternatives: true,
};
В ответе появляется несколько объектов routes, каждый из которых может быть отображён отдельно.
Каждый маршрут разбивается на шаги (steps), содержащие детальные инструкции:
const steps = result.routes[0].legs[0].steps;
steps.forEach(step => {
console.log(step.instructions);
console.log(step.distance.text);
});
Инструкции включают HTML-разметку, описывающую повороты, развязки и изменения направления.
Вместо строковых адресов могут использоваться координаты:
const request = {
origin: { lat: 55.7558, lng: 37.6173 },
destination: { lat: 59.9311, lng: 30.3609 },
travelMode: google.maps.TravelMode.DRIVING,
};
Такой подход уменьшает зависимость от геокодирования и повышает точность запроса.
Маршрут может пересчитываться при изменении входных данных, например при перетаскивании маркеров:
marker.addListener("dragend", () => {
calculateRoute();
});
Это позволяет строить интерактивные интерфейсы с обновлением маршрута в реальном времени.
Сервис DirectionsService имеет ряд ограничений:
Эти ограничения необходимо учитывать при проектировании приложений с высокой нагрузкой или сложной логикой маршрутов.