Промежуточные точки маршрута

В маршрутизации Google Maps Platform промежуточные точки (waypoints) используются для построения маршрутов, проходящих через заранее заданные координаты или адреса между начальной и конечной точкой. Механизм реализован через сервис Google Directions API, доступный в JavaScript API как DirectionsService.

Промежуточные точки влияют на геометрию маршрута, но не изменяют его смысловую структуру: маршрут всегда начинается в origin и заканчивается в destination, а waypoints располагаются между ними в заданном или оптимизированном порядке.


Структура промежуточной точки

Каждая промежуточная точка задаётся объектом следующего вида:

{
  location: "Almaty, Kazakhstan" | LatLng,
  stopover: true
}

Поля:

  • location — адрес, название места или объект координат LatLng

  • stopover — логический флаг:

    • true — маршрут обязан остановиться в точке
    • false — точка используется как проходная без формирования отдельного сегмента остановки

Формирование маршрута с waypoint

Основная структура запроса выполняется через DirectionsService.route():

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

const request = {
  origin: "Karaganda, Kazakhstan",
  destination: "Astana, Kazakhstan",
  waypoints: [
    {
      location: "Temirtau, Kazakhstan",
      stopover: true
    },
    {
      location: "Balkhash, Kazakhstan",
      stopover: true
    }
  ],
  travelMode: google.maps.TravelMode.DRIVING
};

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

Каждая промежуточная точка добавляет отдельный сегмент (leg) в итоговый маршрут.


Влияние waypoints на структуру маршрута

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

  • origin → waypoint 1
  • waypoint 1 → waypoint 2
  • waypoint N → destination

Каждый сегмент содержит собственные метрики:

  • расстояние (distance)
  • длительность (duration)
  • полилинию (polyline)
  • манёвры (steps)

Эти данные доступны в объекте DirectionsResult.routes[0].legs.


Оптимизация порядка промежуточных точек

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

const request = {
  origin: "Karaganda",
  destination: "Astana",
  waypoints: [
    { location: "Balkhash", stopover: true },
    { location: "Karazhal", stopover: true },
    { location: "Satpayev", stopover: true }
  ],
  optimizeWaypoints: true,
  travelMode: google.maps.TravelMode.DRIVING
};

Параметр optimizeWaypoints: true позволяет сервису перестроить порядок точек для минимизации общего расстояния или времени маршрута.

Результат оптимизации возвращается в поле:

result.routes[0].waypoint_order

Массив содержит индексы исходных точек в новом порядке.


Ограничения промежуточных точек

Система накладывает ограничения на количество waypoint:

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

Также существуют функциональные ограничения:

  • нельзя использовать слишком сложные вложенные маршруты
  • некоторые комбинации travelMode и waypoint могут быть недоступны
  • проходные точки (stopover: false) не всегда учитываются в визуализации маршрута

Поведение stopover и проходных точек

Флаг stopover влияет на сегментацию маршрута:

  • true — создаётся отдельный leg
  • false — точка «проецируется» на ближайший сегмент маршрута

Пример:

waypoints: [
  { location: "Point A", stopover: false },
  { location: "Point B", stopover: true }
]

Первая точка не формирует остановку, но влияет на геометрию маршрута.


Работа с результатом маршрута

Результат запроса содержит структурированную модель:

const route = result.routes[0];

route.legs.forEach((leg, index) => {
  console.log("Сегмент:", index);
  console.log("Дистанция:", leg.distance.text);
  console.log("Время:", leg.duration.text);
});

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

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

route.overview_polyline

Динамическое формирование промежуточных точек

В реальных сценариях waypoints часто формируются динамически:

function buildWaypoints(points) {
  return points.map(p => ({
    location: new google.maps.LatLng(p.lat, p.lng),
    stopover: true
  }));
}

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

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

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

При интеграции с google.maps.Map промежуточные точки часто визуализируются маркерами:

const marker = new google.maps.Marker({
  position: { lat: 49.806, lng: 73.085 },
  map: map,
  title: "Waypoint"
});

Маркерная визуализация обычно синхронизируется с маршрутом через события изменения данных.


Особенности пересчёта маршрута

При изменении waypoint требуется повторный запрос к DirectionsService. API не поддерживает частичное обновление маршрута.

Типовой цикл обновления:

  1. изменение массива waypoints
  2. вызов route()
  3. перерисовка polyline на карте
  4. обновление UI маршрута

Типичные архитектурные паттерны

Буферизация точек маршрута

Используется для предотвращения частых запросов:

let timeout;

function updateRoute(points) {
  clearTimeout(timeout);
  timeout = setTimeout(() => {
    calculateRoute(points);
  }, 300);
}

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

Сохраняются комбинации origin + destination + waypoints для повторного использования без запроса к API.


Синхронизация с пользовательским вводом

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

  • drag-and-drop маркерами
  • автодополнением адресов (Places Autocomplete)
  • редактируемыми списками остановок

Изменение порядка точек напрямую влияет на waypoint_order и итоговую геометрию маршрута.


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

Рост числа waypoint приводит к:

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

Практически целесообразно ограничивать количество точек и группировать близкие координаты в один сегмент.