Trasa pojazdu można podzielić na osi czasu w następujący 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
Pamiętaj, ż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 określonej sekundzie.
- „przedziały czasu”, takie jak same odwiedziny i przejście między nimi. Chociaż czasami interwały czasowe mogą mieć zerową długość, czyli zaczynają się i kończą w tej samej sekundzie, często mają dodatnią długość.
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 przejściem #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 zobacz, jak można zorganizować podróże, przerwy, opóźnienie i oczekiwania w trakcie przejścia.
- Nie nakładają się.
- OPÓŹNIENIE jest unikalne i musi być ciągłym okresem czasu bezpośrednio przed następną wizytą (lub końcem okresu użytkowania pojazdu). Wystarczy więc znać czas opóźnienia, aby określić czas rozpoczęcia i zakończenia.
- Przerwy to ciągłe, niepokrywające się okresy czasu. Odpowiedź określa czas rozpoczęcia i czas trwania każdej przerwy.
- TRAVEL (TRAVEL) i WAIT (opóźnienia) są „wywłaszczeniowe” – w tym okresie mogą zostać kilkakrotnie przerwane. Klienci mogą założyć, że podróż odbywa się „jak najszybciej”, a pozostały czas wypełnia „czekanie”.
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 | 
 Czas rozpoczęcia przez pojazd trasy. 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 RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady:  | 
| visits[] | 
 Uporządkowana sekwencja wizyt reprezentująca trasę. Wizyty[i] to i-te wizyty 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 linia łamana reprezentująca trasę. 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ą uwzględnione w szczegółowym raporcie z wyjątkiem kosztów związanych z atrybutami przejścia, które od 2022 roku są raportowane tylko w postaci zbiorczej. | 
| routeTotalCost | 
 Całkowity koszt danej trasy. Suma wszystkich kosztów na mapie kosztów. | 
Odwiedź
Wizyta wykonana podczas tworzenia trasy. Ta wizyta odpowiada odbiorowi lub dostawie Shipment.
| Zapis JSON | 
|---|
| {
  "shipmentIndex": integer,
  "isPickup": boolean,
  "visitRequestIndex": integer,
  "startTime": string,
  "loadDemands": {
    string: {
      object ( | 
| Pola | |
|---|---|
| shipmentIndex | 
 Indeks pola  | 
| isPickup | 
 Jeśli wartość to prawda, wizyta odpowiada odbiorowi  | 
| visitRequestIndex | 
 Indeks  | 
| startTime | 
 Czas rozpoczęcia wizyty. Pamiętaj, że pojazd może pojawić się na miejscu wcześniej. Godziny są zgodne z  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:  | 
| loadDemands | 
 Łączne obciążenie związane z wizytami jako suma dostawy i żądania wizyty  | 
| 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 dotyczy dostawy, zmiana trasy jest obliczana na podstawie odpowiedniej wizyty z odbiorem i ma wartość: 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 pola  | 
| visitLabel | 
 Kopia odpowiedniego elementu  | 
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 trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „ | 
| 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, które wystąpiły podczas tego przejścia (jeśli wystąpiły). Szczegółowe informacje o czasie rozpoczęcia i czasie 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 obejmuje przerwy. Pamiętaj też, że czas oczekiwania może zostać podzielony na kilka nieciągłych przedziałów czasu. Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ | 
| totalDuration | 
 Całkowity czas trwania zmiany podany dla wygody użytkowników. Jest ona równa: 
 Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ | 
| startTime | 
 Godzina 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 linia łamana reprezentująca trasę przebytą podczas przemieszczania. To pole jest wypełniane tylko wtedy, gdy  | 
| routeToken | 
 Tylko dane wyjściowe. Nieprzezroczysty token, który można przekazać do Navigation SDK w celu odtworzenia trasy podczas nawigacji oraz, w przypadku zmiany trasy, zachowania pierwotnego zamiaru podczas tworzenia trasy. Traktuj ten token jako nieprzejrzysty blok danych. Nie porównuj wartości w różnych żądaniach, ponieważ może się ona zmieniać, nawet jeśli usługa zwróci dokładnie tę samą trasę. To pole jest wypełniane tylko wtedy, gdy  | 
| vehicleLoads | 
 Ładunki pojazdu w trakcie tego przejścia dla każdego typu, który pojawia się w  Obciążenia podczas pierwszego przejścia to obciążenia początkowe trasy pojazdu. Następnie po każdej wizycie wartości  | 
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 RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady:  | 
| duration | 
 Czas trwania przerwy. Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ |