Маршрут транспортного средства можно разложить по оси времени следующим образом (мы предполагаем, что имеется n посещений):
  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end
Обратите внимание, что мы делаем разницу между:
- «пунктуальные события», такие как начало и конец движения транспортного средства, а также начало и конец каждого посещения (также известные как прибытие и отъезд). Они происходят в данную секунду.
 - «временные интервалы», такие как сами посещения и переход между посещениями. Хотя временные интервалы иногда могут иметь нулевую длительность, т.е. начинаться и заканчиваться в одну и ту же секунду, они часто имеют положительную длительность.
 
Инварианты:
- Если имеется n посещений, существует n+1 переходов.
 - Посещение всегда окружено переходом перед ним (тот же индекс) и переходом после него (индекс + 1).
 - За запуском автомобиля всегда следует переход №0.
 - Концу транспортного средства всегда предшествует переход #n.
 
 При увеличении масштаба можно увидеть, что происходит во время Transition и Visit :
---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end
Наконец, вот как можно организовать ПУТЕШЕСТВИЕ, ПЕРЕРЫВ, ЗАДЕРЖКУ и ОЖИДАНИЕ во время перехода.
- Они не пересекаются.
 - ЗАДЕРЖКА уникальна и должна представлять собой непрерывный период времени непосредственно перед следующим посещением (или окончанием работы транспортного средства). Таким образом, достаточно знать длительность задержки, чтобы знать время ее начала и окончания.
 - ПЕРЕРЫВЫ — это непрерывные, непересекающиеся периоды времени. В ответе указывается время начала и продолжительность каждого перерыва.
 - TRAVEL и WAIT являются «вытесняемыми»: во время этого перехода их можно прерывать несколько раз. Клиенты могут предполагать, что путешествие произойдет «как можно скорее» и что оставшееся время будет заполнено «ожиданием».
 
(Сложный) пример:
                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
| JSON-представление | 
|---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object (  | 
| Поля | |
|---|---|
 vehicleIndex |    Транспортное средство, выполняющее маршрут, идентифицированное его индексом в исходном   | 
 vehicleLabel |    Метка транспортного средства, выполняющего этот маршрут, равная   | 
 vehicleStartTime |   Время, в которое транспортное средство начинает свой маршрут.  Использует RFC 3339, где генерируемые выходные данные всегда будут нормализованы по Z и используют 0, 3, 6 или 9 дробных цифр. Также принимаются смещения, отличные от «Z». Примеры:   | 
 vehicleEndTime |   Время, в которое транспортное средство заканчивает свой маршрут.  Использует RFC 3339, где генерируемые выходные данные всегда будут нормализованы по Z и используют 0, 3, 6 или 9 дробных цифр. Также принимаются смещения, отличные от «Z». Примеры:   | 
 visits[] |   Упорядоченная последовательность посещений, представляющая маршрут. visits[i] — i-е посещение маршрута. Если это поле пустое, автомобиль считается неиспользованным.  | 
 transitions[] |   Упорядоченный список переходов по маршруту.  | 
 hasTrafficInfeasibilities |    Если   Прибытие в next_visit, скорее всего, произойдет позже текущего временного окна из-за увеличения оценки времени в пути   | 
 routePolyline |    Закодированное полилинейное представление маршрута. Это поле заполняется только в том случае, если   | 
 breaks[] |    Для транспортного средства, следующего по данному маршруту, запланированы перерывы. Последовательность   | 
 metrics |    Показатели продолжительности, расстояния и загрузки для этого маршрута. Поля   | 
 vehicleFullness |    Поле  Экспериментально: поведение или существование этого поля может измениться в будущем.  | 
 routeCosts |   Стоимость маршрута с разбивкой по полям запроса, связанным со стоимостью. Ключи — это пути прототипов относительно входных данных OptimizeToursRequest, например «model.shipments.pickups.cost», а значения — это общая стоимость, сгенерированная соответствующим полем стоимости, агрегированная по всему маршруту. Другими словами, Costs["model.shipments.pickups.cost"] — это сумма всех затрат на самовывоз по маршруту. Здесь подробно представлены все затраты, определенные в модели, за исключением затрат, связанных с TransitionAttributes, которые по состоянию на 2022/01 год сообщаются только в агрегированном виде.  | 
 routeTotalCost |   Общая стоимость маршрута. Сумма всех затрат на карте затрат.  | 
Посещать
 Посещение во время маршрута. Это посещение соответствует получению или доставке Shipment . 
| JSON-представление | 
|---|
{
  "shipmentIndex": integer,
  "isPickup": boolean,
  "visitRequestIndex": integer,
  "startTime": string,
  "loadDemands": {
    string: {
      object ( | 
| Поля | |
|---|---|
 shipmentIndex |    Индекс поля   | 
 isPickup |    Если это правда, посещение соответствует получению   | 
 visitRequestIndex |    Индекс   | 
 startTime |    Время начала визита. Обратите внимание, что транспортное средство может прибыть к месту посещения раньше этого времени. Время соответствует   Использует RFC 3339, где генерируемые выходные данные всегда будут нормализованы по Z и используют 0, 3, 6 или 9 дробных цифр. Также принимаются смещения, отличные от «Z». Примеры:   | 
 loadDemands |    Общая потребность в загрузке посещения как сумма отгрузки и запроса на посещение   | 
 detour |   Дополнительное время объезда из-за грузов, которые были посещены по маршруту до посещения, а также из-за потенциального времени ожидания, вызванного временными окнами. Если посещение является доставкой, обход рассчитывается на основе соответствующего посещения самовывоза и равен:  В противном случае оно вычисляется на основе   Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на «   | 
 shipmentLabel |    Копия соответствующей   | 
 visitLabel |    Копия соответствующей метки   | 
 injectedSolutionLocationToken |   Непрозрачный токен, представляющий информацию о месте посещения.  Это поле может быть заполнено при посещениях результирующих маршрутов, если для  Экспериментальный вариант: дополнительные сведения см. на странице https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request .  | 
Переход
 Переход между двумя событиями на маршруте. См. описание ShipmentRoute .
 Если у транспортного средства нет startLocation и/или endLocation , соответствующие показатели путешествия равны 0. 
| JSON-представление | 
|---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object (  | 
| Поля | |
|---|---|
 travelDuration |   Продолжительность путешествия во время этого перехода.  Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на «   | 
 travelDistanceMeters |   Расстояние, пройденное во время перехода.  | 
 trafficInfoUnavailable |    Когда трафик запрашивается через   | 
 delayDuration |    Сумма длительности задержки, примененной к этому переходу. Если таковые имеются, задержка начинается ровно в секундах   Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на «   | 
 breakDuration |    Сумма длительности перерывов, происходящих во время этого перехода, если таковые имеются. Подробная информация о времени начала и продолжительности каждого перерыва хранится в   Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на «   | 
 waitDuration |   Время, потраченное на ожидание во время этого перехода. Продолжительность ожидания соответствует времени простоя и не включает время перерыва. Также обратите внимание, что это время ожидания может быть разделено на несколько несмежных интервалов.  Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на «   | 
 totalDuration |   Общая продолжительность перехода указана для удобства. Оно равно: 
  Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на «   | 
 startTime |   Время начала этого перехода.  Использует RFC 3339, где генерируемые выходные данные всегда будут нормализованы по Z и используют 0, 3, 6 или 9 дробных цифр. Также принимаются смещения, отличные от «Z». Примеры:   | 
 routePolyline |    Закодированное полилинейное представление маршрута, пройденного во время перехода. Это поле заполняется только в том случае, если для   | 
 routeToken |    Только вывод. Непрозрачный токен, который можно передать в Navigation SDK для восстановления маршрута во время навигации и в случае изменения маршрута соблюдать исходное намерение при создании маршрута. Рассматривайте этот токен как непрозрачный объект. Не сравнивайте его значение в разных запросах, поскольку оно может измениться, даже если служба возвращает тот же маршрут. Это поле заполняется только в том случае, если для   | 
 vehicleLoads |    Транспортное средство загружается во время этого перехода для каждого типа, который либо появляется в   Нагрузки при первом переходе являются стартовыми нагрузками маршрута транспортного средства. Затем после каждого посещения   | 
Закодированнаяполилиния
Закодированное представление ломаной линии. Дополнительную информацию о кодировании полилиний можно найти здесь: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding .
| JSON-представление | 
|---|
{ "points": string }  | 
| Поля | |
|---|---|
 points |   Строка, представляющая закодированные точки полилинии.  | 
Перерыв
Данные, представляющие выполнение перерыва.
| JSON-представление | 
|---|
{ "startTime": string, "duration": string }  | 
| Поля | |
|---|---|
 startTime |   Время начала перерыва.  Использует RFC 3339, где генерируемые выходные данные всегда будут нормализованы по Z и используют 0, 3, 6 или 9 дробных цифр. Также принимаются смещения, отличные от «Z». Примеры:   | 
 duration |   Продолжительность перерыва.  Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на «   | 
Транспортное средствоПолнота
 VehicleFullness — это показатель, который определяет степень наполненности транспортного средства. Каждое поле VehicleFullness имеет значение от 0 до 1 и рассчитывается как соотношение между полем ограниченной метрики (например, AggregatedMetrics.travel_distance_meters ) и соответствующим пределом транспортного средства (например, Vehicle.route_distance_limit ), если оно существует. В противном случае коэффициент наполненности останется неустановленным. Если предел равен 0, в поле устанавливается значение 1. Примечание. Если маршрут подвержен невозможности дорожного движения, некоторые исходные коэффициенты наполненности могут превышать 1,0, например, транспортное средство может превысить ограничение по расстоянию. В этих случаях мы ограничиваем значения полноты значением 1,0. 
| JSON-представление | 
|---|
{ "maxFullness": number, "distance": number, "travelDuration": number, "activeDuration": number, "maxLoad": number, "activeSpan": number }  | 
| Поля | |
|---|---|
 maxFullness |   Максимум всех остальных полей в этом сообщении.  | 
 distance |    Соотношение между   | 
 travelDuration |    Соотношение между [AggregatedMetrics.travel_duration_секунды][] и   | 
 activeDuration |    Соотношение между [AggregatedMetrics.total_duration_секундs][] и   | 
 maxLoad |    Максимальное соотношение между всеми типами [AggregatedMetrics.max_load][] и их соответствующими   | 
 activeSpan |    Соотношение (vehicleEndTime – VehicleStartTime)/(latestVehicleEndTime – EarlyVehicleStartTime) для данного транспортного средства. Если знаменатель отсутствует, вместо него используется (   |