Distance Matrix Service основы

Google Maps Distance Matrix Service представляет собой компонент, предназначенный для вычисления расстояний и времени в пути между множеством точек отправления и назначения. В отличие от простого маршрута между двумя точками, сервис оперирует матрицей значений, где каждая строка соответствует одному origin, а каждый столбец — одному destination. Это позволяет решать задачи логистики, распределения нагрузки, поиска ближайших объектов и анализа транспортной доступности на уровне набора координат.


Структура запроса Distance Matrix

Основная логика сервиса строится вокруг четырёх ключевых сущностей:

  • origins — массив точек отправления
  • destinations — массив точек назначения
  • travelMode — режим передвижения
  • unitSystem — система единиц измерения

Дополнительно могут использоваться параметры оптимизации маршрута и ограничения по времени.

Пример базовой структуры запроса:

const service = new google.maps.DistanceMatrixService();

service.getDistanceMatrix(
  {
    origins: [
      { lat: 43.238949, lng: 76.889709 },
      { lat: 43.25667, lng: 76.92861 }
    ],
    destinations: [
      { lat: 43.2220, lng: 76.8512 },
      { lat: 43.3017, lng: 76.9500 }
    ],
    travelMode: google.maps.TravelMode.DRIVING,
    unitSystem: google.maps.UnitSystem.METRIC,
    avoidHighways: false,
    avoidTolls: false
  },
  (response, status) => {
    console.log(response);
    console.log(status);
  }
);

Формат ответа Distance Matrix

Ответ сервиса имеет строго матричную структуру:

  • rows[] — соответствует каждому origin
  • elements[] — массив результатов для каждого destination

Каждый элемент содержит:

  • distance — расстояние (в метрах и текстовом виде)
  • duration — время в пути
  • status — статус конкретной пары origin-destination

Пример логической структуры:

Origin A → Destination 1: distance, duration
Origin A → Destination 2: distance, duration
Origin B → Destination 1: distance, duration
Origin B → Destination 2: distance, duration

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


Travel Modes и их влияние

Параметр travelMode определяет алгоритм расчёта маршрута. Поддерживаются следующие режимы:

  • DRIVING — автомобильный маршрут
  • WALKING — пеший маршрут
  • BICYCLING — велосипедный маршрут
  • TRANSIT — общественный транспорт

Каждый режим влияет не только на маршрут, но и на структуру ответа. Например, в режиме TRANSIT дополнительно могут появляться сведения о пересадках и расписаниях, тогда как в WALKING акцент делается на пешеходные дорожки и проходы.


Ограничения и правила формирования матрицы

Distance Matrix Service имеет строгие ограничения, которые напрямую влияют на архитектуру приложений:

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

Практическая формула количества вычислений:

N = origins × destinations

Если origins = 10, destinations = 10, итоговое количество вычислений равно 100.

Это значение критично для оптимизации запросов и контроля затрат.


Статусы элементов матрицы

Каждая ячейка результата содержит собственный статус, независимый от общего статуса запроса:

  • OK — маршрут успешно построен
  • NOT_FOUND — координаты не удалось сопоставить с дорожной сетью
  • ZERO_RESULTS — маршрут невозможен
  • MAX_ROUTE_LENGTH_EXCEEDED — превышена допустимая длина маршрута

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


Работа с Distance Matrix в асинхронной модели

API использует callback-модель, где результат передаётся через функцию обратного вызова. Однако архитектурно запрос асинхронный и не блокирует основной поток выполнения.

Типовой сценарий обработки:

service.getDistanceMatrix(request, (response, status) => {
  if (status !== "OK") {
    return;
  }

  const origins = response.originAddresses;
  const destinations = response.destinationAddresses;

  response.rows.forEach((row, i) => {
    row.elements.forEach((element, j) => {
      if (element.status === "OK") {
        console.log(
          origins[i],
          "→",
          destinations[j],
          element.distance.text,
          element.duration.text
        );
      }
    });
  });
});

Структура данных требует вложенной итерации: сначала по origins, затем по destinations.


Оптимизация количества запросов

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

Группировка данных

Разбиение больших массивов на блоки фиксированного размера снижает вероятность превышения лимитов.

Кэширование результатов

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

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

Для часто используемых точек (склады, офисы, хабы) целесообразно хранить заранее вычисленные значения.


Выбор системы единиц

Параметр unitSystem определяет формат отображения расстояний:

  • METRIC — километры, метры
  • IMPERIAL — мили, футы

Физически расчёт всегда выполняется на стороне сервиса, а единицы влияют только на представление данных.


Влияние параметров избегания маршрутов

Дополнительные параметры позволяют управлять логикой маршрутизации:

  • avoidHighways — исключение автомагистралей
  • avoidTolls — исключение платных дорог

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


Обработка ошибок и нестандартных ситуаций

При интеграции Distance Matrix Service необходимо учитывать следующие сценарии:

  • некорректные координаты
  • отсутствие маршрута между точками
  • превышение лимитов API
  • временные сбои сервиса

Рекомендуемая стратегия обработки:

  • проверка status на уровне запроса
  • проверка element.status на уровне ячеек
  • деградация функциональности при частичных ошибках

Пример расширенной матрицы с несколькими параметрами

const request = {
  origins: ["43.2,76.8", "43.3,76.9"],
  destinations: ["43.25,76.85", "43.31,76.95"],
  travelMode: google.maps.TravelMode.DRIVING,
  avoidTolls: true,
  avoidHighways: false,
  unitSystem: google.maps.UnitSystem.METRIC,
  drivingOptions: {
    departureTime: new Date(),
    trafficModel: "bestguess"
  }
};

Параметр drivingOptions особенно важен при учёте трафика, поскольку позволяет учитывать динамическую дорожную обстановку.


Архитектурные сценарии применения

Distance Matrix Service используется в системах, где требуется массовая оценка расстояний:

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

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


Производительность и масштабирование

При проектировании систем на основе Distance Matrix необходимо учитывать:

  • линейный рост стоимости с увеличением N×M
  • сетевые задержки при больших запросах
  • ограничение квот API

Практическая оптимизация включает:

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

Интерпретация временных значений

Поле duration может содержать:

  • базовое время без учета трафика
  • прогнозируемое время с учетом дорожной ситуации (при использовании traffic model)

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


Особенности работы с большими наборами координат

При увеличении количества точек матрица растёт квадратично. Например:

  • 5 origins × 5 destinations = 25 вычислений
  • 20 origins × 20 destinations = 400 вычислений

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


Итоговая модель данных Distance Matrix

С точки зрения структуры данных сервис формирует трёхуровневую модель:

  1. Общий ответ
  2. Строки origins
  3. Элементы destinations

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