Trasę pojazdu można rozłożyć na osi czasu w ten sposób (zakładamy, że jest n wizyt):
  |            |            |          |       |  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
Trzeba pamiętać, że:
- „zdarzenia punktowe”, takie jak początek i koniec podróży pojazdu, a także początek i koniec każdej wizyty (tj. przyjazd i odjazd). Mają miejsce w danej sekundzie.
- „przedziały czasu”, takie jak same odwiedziny i przejście między nimi. Chociaż przedziały czasowe mogą czasami mieć zerowy czas trwania, czyli np. początek i koniec w tej samej sekundzie, często mają dodatni czas trwania.
Niezmienniki:
- Jeśli jest n wizyt, to jest n + 1 przejść.
- Wizyta jest zawsze otoczona przez przejście poprzedzające ją (ten sam indeks) i przejście następujące po niej (indeks + 1).
- Po uruchomieniu pojazdu zawsze następuje przejście #0.
- Koniec pojazdu jest zawsze poprzedzony przez przejście #n.
Oto, co się dzieje podczas Transition i 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
Na koniec opisujemy, jak można ustawić elementy TRAVEL, BREAKS, DELAY i WAIT podczas przejścia.
- Nie nakładają się.
- OPÓŹNIENIE jest niepowtarzalne i musi przypadać w ciągłym okresie tuż przed kolejną wizytą (lub wyłączeniem pojazdu). Dzięki temu wystarczy znać czas trwania opóźnienia, aby poznać godzinę jego rozpoczęcia i zakończenia.
- PRZERWA to sąsiadujące ze sobą okresy, które nie nakładają się na siebie. Odpowiedź zawiera czas rozpoczęcia i czas trwania każdej przerwy.
- TRAVEL i WAIT są „wymienne”: mogą być przerywane kilka razy podczas tego przejścia. Klienci mogą zakładać, że podróże odbywają się „jak najszybciej”, a czas oczekiwania zostanie wydłużony.
Przykład A (złożony):
                               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     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
| Zapis JSON | 
|---|
| { "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( | 
| Pola | |
|---|---|
| vehicleIndex | 
 Pojazd wykonujący trasę, zidentyfikowany przez swój indeks w źródle  | 
| vehicleLabel | 
 Etykieta pojazdu poruszającego się po tej trasie, równa  | 
| vehicleStartTime | 
 Godzina, o której pojazd rozpoczyna trasę. Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady:  | 
| vehicleEndTime | 
 Czas, w którym pojazd kończy trasę. Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady:  | 
| visits[] | 
 Uporządkowana sekwencja wizyt reprezentująca trasę. visits[i] to i-ta wizyta na trasie. Jeśli to pole jest puste, pojazd jest uważany za nieużywany. | 
| transitions[] | 
 Uporządkowana lista przejść na trasie. | 
| hasTrafficInfeasibilities | 
 Gdy  Przyjazd na stronie next_visit prawdopodobnie nastąpi później niż w bieżącym oknie czasowym ze względu na zwiększony szacowany czas podróży ( | 
| routePolyline | 
 Zakodowana reprezentacja trasy w postaci linii łamanej. To pole jest wypełniane tylko wtedy, gdy  | 
| breaks[] | 
 Przerwy zaplanowane dla pojazdu na tej trasie. Sekwencja  | 
| metrics | 
 Dane dotyczące czasu trwania, odległości i obciążenia na tej trasie. Pola  | 
| routeCosts | 
 Koszt trasy z podziałem na pola żądania związane z kosztami. Klucze są ścieżkami proto w odniesieniu do danych wejściowych OptimizeToursRequest, np. „model.shipments.pickups.cost”, a ich wartości to łączny koszt wygenerowany przez odpowiednie pole kosztu, zsumowany dla całej trasy. Innymi słowy, costs["model.shipments.pickups.cost"] to suma wszystkich kosztów odbioru na trasie. Wszystkie koszty zdefiniowane w modelu są tutaj szczegółowo raportowane, z wyjątkiem kosztów związanych z atributem TransitionAttributes, które od 1 stycznia 2022 r. są raportowane tylko w sposób zagregowany. Obiekt zawierający listę par  | 
| routeTotalCost | 
 Łączny koszt trasy. Suma wszystkich kosztów na mapie kosztów. | 
Odwiedź
Wizyta przeprowadzona na trasie. Ta wizyta odpowiada odbiórowi lub dostawie: Shipment.
| Zapis JSON | 
|---|
| {
  "shipmentIndex": integer,
  "isPickup": boolean,
  "visitRequestIndex": integer,
  "startTime": string,
  "loadDemands": {
    string: {
      object ( | 
| Pola | |
|---|---|
| shipmentIndex | 
 Indeks pola  | 
| isPickup | 
 Jeśli ma wartość prawda, wizyta odpowiada odbiorze produktu  | 
| visitRequestIndex | 
 Indeks  | 
| startTime | 
 Godzina rozpoczęcia wizyty. Pamiętaj, że pojazd może pojawić się na miejscu wcześniej. Czasy są zgodne z  Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady:  | 
| loadDemands | 
 Łączne obciążenie związane z wizytami jako suma dostawy i żądania wizyty  Obiekt zawierający listę par  | 
| detour | 
 Dodatkowy czas objazdu ze względu na wizyty w miejscach na trasie przed wizytą oraz potencjalny czas oczekiwania spowodowany oknami czasowymi. Jeśli wizyta to dostawa, objazd jest obliczany na podstawie odpowiedniej wizyty odbioru i jest równy: W przeciwnym razie jest obliczana na podstawie pojazdu  Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „ | 
| shipmentLabel | 
 Kopia odpowiedniego elementu  | 
| visitLabel | 
 Kopia odpowiedniego pola  | 
| injectedSolutionLocationToken | 
 Nieprzejrzysty token reprezentujący informacje o lokalizacji wizyty. To pole może być wypełniane w przypadku wizyt na trasach wyników, gdy w przypadku tej wizyty pole  | 
Przejście
Przejście między 2 zdarzeniami na trasie. Zobacz opis ShipmentRoute.
Jeśli pojazd nie ma wartości startLocation ani endLocation, odpowiednie dane dotyczące podróży mają wartość 0.
| Zapis JSON | 
|---|
| { "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( | 
| Pola | |
|---|---|
| travelDuration | 
 Czas trwania podróży podczas tej zmiany. Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ | 
| travelDistanceMeters | 
 Odległość przebyta podczas przejścia. | 
| trafficInfoUnavailable | 
 Jeśli żądanie ruchu pochodzi z  | 
| delayDuration | 
 Suma czasów opóźnienia zastosowanych do tego przejścia. Jeśli tak, opóźnienie zaczyna się dokładnie  Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ | 
| breakDuration | 
 Suma czasu trwania przerw w trakcie tego przejścia (jeśli występują). Szczegóły dotyczące czasu rozpoczęcia i długości trwania każdej przerwy są przechowywane w  Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „ | 
| waitDuration | 
 Czas oczekiwania podczas tego przejścia. Czas oczekiwania odpowiada czasowi bezczynności i nie uwzględnia przerwy. Pamiętaj też, że czas oczekiwania może być podzielony na kilka nieciągłych przedziałów. Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ | 
| totalDuration | 
 Łączny czas trwania przejścia, podany dla wygody. Jest ona równa: 
 Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „ | 
| startTime | 
 Czas rozpoczęcia tego przejścia. Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady:  | 
| routePolyline | 
 Zakodowana reprezentacja linii łamanej trasy, która wystąpiła podczas przejścia. To pole jest wypełniane tylko wtedy, gdy  | 
| vehicleLoads | 
 Ładunki pojazdów w trakcie tej zmiany dotyczące każdego typu pojazdu, który pojawia się w klastrze  Ładunki występujące podczas pierwszego przejścia to początkowe wczytywanie trasy pojazdu. Następnie po każdej wizycie wartości  Obiekt zawierający listę par  | 
EncodedPolyline
Zakodowana reprezentacja linii złożonej. Więcej informacji o kodowaniu łańcucha znaków znajdziesz tutaj: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.
| Zapis JSON | 
|---|
| { "points": string } | 
| Pola | |
|---|---|
| points | 
 Ciąg znaków reprezentujący zakodowane punkty linii łamanej. | 
Przerwa
Dane reprezentujące wykonanie przerwy.
| Zapis JSON | 
|---|
| { "startTime": string, "duration": string } | 
| Pola | |
|---|---|
| startTime | 
 Czas rozpoczęcia przerwy. Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady:  | 
| duration | 
 Czas trwania przerwy. Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ |