ShipmentRoute

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

Pamiętaj, że:

  • „dokładne zdarzenia”, takie jak początek i koniec jazdy oraz początek i koniec każdej wizyty (czyli przyjazd i wyjazd). Mają miejsce w danej sekundzie.
  • „przedziały czasowe”, np. same wizyty i przejście między wizytami. 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ście.
  • 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 TransitionVisit:

---+-------------------------------------+-----------------------------+-->
   |           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 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 jego rozpoczęcia i zakończenia.
  • PRZERWY to ciągłe, niepokrywające się okresy czasu. 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ą założyć, że podróż odbywa się „jak najszybciej”, a pozostały czas wypełnia „czekanie”.

Przykład (skomplikowany):

                               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 (Visit)
    }
  ],
  "transitions": [
    {
      object (Transition)
    }
  ],
  "hasTrafficInfeasibilities": boolean,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "breaks": [
    {
      object (Break)
    }
  ],
  "metrics": {
    object (AggregatedMetrics)
  },
  "routeCosts": {
    string: number,
    ...
  },
  "routeTotalCost": number
}
Pola
vehicleIndex

integer

Pojazd wykonujący trasę, zidentyfikowany przez swój indeks w źródle ShipmentModel.

vehicleLabel

string

Etykieta pojazdu wykonującego tę trasę, równa ShipmentModel.vehicles(vehicleIndex).label, jeśli została określona.

vehicleStartTime

string (Timestamp format)

Czas rozpoczęcia przez pojazd trasy.

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: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

vehicleEndTime

string (Timestamp format)

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: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

visits[]

object (Visit)

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[]

object (Transition)

Uporządkowana lista przejść na trasie.

hasTrafficInfeasibilities

boolean

Gdy OptimizeToursRequest.consider_road_traffic jest ustawione na wartość true, to pole wskazuje, że niezgodności w czasie trwania trasy są przewidywane na podstawie szacunków czasu przejazdu na podstawie natężenia ruchu. Może nie wystarczyć czasu na przebycie trasy z uwzględnieniem natężenia ruchu, opóźnień i przestojów między wizytami przed pierwszą wizytą lub po ostatniej, przy zachowaniu limitów czasu wizyty i czasu pracy pojazdu. Na przykład

  startTime(previous_visit) + duration(previous_visit) +
  travelDuration(previous_visit, next_visit) > startTime(next_visit)

Przybycie do next_visit nastąpi prawdopodobnie później niż w obecnym oknie czasowym z powodu wydłużenia szacowanego czasu podróży travelDuration(previous_visit, next_visit) z powodu korków. Przerwa może też nakładać się na wizytę z powodu wydłużenia szacowanego czasu podróży oraz ograniczeń dotyczących czasu wizyty lub przerwy.

routePolyline

object (EncodedPolyline)

Zakodowana linia łamana reprezentująca trasę. To pole jest wypełniane tylko wtedy, gdy zasada OptimizeToursRequest.populate_polylines ma wartość Prawda.

breaks[]

object (Break)

Przerwy zaplanowane dla pojazdu wykonującego tę trasę. Sekwencja breaks reprezentuje przedziały czasu, z których każdy zaczyna się w odpowiednim startTime i trwa duration sekund.

metrics

object (AggregatedMetrics)

Dane dotyczące czasu trwania, odległości i obciążenia na tej trasie. Pola AggregatedMetrics są sumowane dla wszystkich elementów ShipmentRoute.transitions lub ShipmentRoute.visits, w zależności od kontekstu.

routeCosts

map (key: string, value: number)

Koszt trasy z podziałem na pola żądania związane z kosztami. Klucze to ścieżki proto, odnoszące się do wejścia OptimizeToursRequest, np. „model.shipments.pickups.cost”, a wartości to łączny koszt wygenerowany przez odpowiednie pole kosztu, zsumowany na całej trasie. 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.

routeTotalCost

number

Łączny koszt 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 (Load)
    },
    ...
  },
  "detour": string,
  "shipmentLabel": string,
  "visitLabel": string
}
Pola
shipmentIndex

integer

Indeks pola shipments w źródle ShipmentModel.

isPickup

boolean

Jeśli wartość to prawda, wizyta odpowiada odbiorowi Shipment. W przeciwnym razie odpowiada dostawie.

visitRequestIndex

integer

Indeks VisitRequest w polu odbioru lub dostawy w Shipment (patrz isPickup).

startTime

string (Timestamp format)

Czas rozpoczęcia wizyty. Pamiętaj, że pojazd może dotrzeć do miejsca wizyty wcześniej. Czasy są zgodne z ShipmentModel.

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: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

loadDemands

map (key: string, value: object (Load))

Łączna liczba wizyt, która jest sumą żądania dostawy i żądania wizyty loadDemands. Jeśli wizyta to dostawa, wartości są ujemne. Zapotrzebowania są raportowane w przypadku tych samych typów co Transition.loads (patrz to pole).

detour

string (Duration format)

Dodatkowy czas objazdu spowodowany wizytami 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:

startTime(delivery) - startTime(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

W przeciwnym razie jest obliczana na podstawie pojazdu startLocation i jest równa:

startTime - vehicleStartTime - travel duration from
the vehicle's `startLocation` to the visit.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

shipmentLabel

string

Kopia odpowiedniej wartości Shipment.label, jeśli została ona określona w elementach Shipment.

visitLabel

string

Kopia odpowiedniej wartości VisitRequest.label, jeśli została ona określona w elementach VisitRequest.

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 (EncodedPolyline)
  },
  "routeToken": string,
  "vehicleLoads": {
    string: {
      object (VehicleLoad)
    },
    ...
  }
}
Pola
travelDuration

string (Duration format)

Czas trwania podróży podczas tej zmiany.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

travelDistanceMeters

number

Odległość przebyta podczas przejścia.

trafficInfoUnavailable

boolean

Gdy żądanie ruchu jest wysyłane za pomocą OptimizeToursRequest.consider_road_traffic, a nie udało się pobrać informacji o ruchu dla Transition, ta wartość logiczna jest ustawiana na Prawda. Może to być problem tymczasowy (rzadki problem na serwerach ruchu w czasie rzeczywistym) lub trwały (brak danych o tej lokalizacji).

delayDuration

string (Duration format)

Suma czasów opóźnienia zastosowanych do tego przejścia. Opóźnienie rozpoczyna się dokładnie delayDuration sekund przed następnym zdarzeniem (końcem wizyty lub pojazdu). Zobacz TransitionAttributes.delay.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

breakDuration

string (Duration format)

Suma czasu trwania przerw, które wystąpiły podczas tego przejścia (jeśli wystąpiły). Szczegóły dotyczące czasu rozpoczęcia i długości przerwy są przechowywane w pliku ShipmentRoute.breaks.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

waitDuration

string (Duration format)

Czas oczekiwania podczas tego przejścia. Czas oczekiwania odpowiada czasowi bezczynności i nie obejmuje 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ą „s”. Przykład: "3.5s".

totalDuration

string (Duration format)

Łączny czas trwania przejścia, podany dla wygody. Jest równe:

  • następna wizyta startTime (lub vehicleEndTime, jeśli jest to ostatnia zmiana) – startTime tej zmiany;
  • Jeśli ShipmentRoute.has_traffic_infeasibilities jest fałszywe, dodatkowo zachodzi następująca zależność: `totalDuration = travelDuration + delayDuration
  • breakDuration + waitDuration`.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

startTime

string (Timestamp format)

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: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

routePolyline

object (EncodedPolyline)

Zakodowana linia łamana reprezentująca trasę przebytą podczas przemieszczania. To pole jest wypełniane tylko wtedy, gdy zasada populateTransitionPolylines ma wartość Prawda.

routeToken

string

Tylko dane wyjściowe. Nieprzezroczysty token, który można przekazać do Navigation SDK w celu odtworzenia trasy podczas nawigacji. W przypadku zmiany trasy token ten zachowuje pierwotny zamiar 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 zasada populateTransitionPolylines ma wartość Prawda.

vehicleLoads

map (key: string, value: object (VehicleLoad))

Ładunki pojazdu w trakcie tego przejścia dla każdego typu, który pojawia się w Vehicle.load_limits pojazdu lub ma niezerową wartość Shipment.load_demands w przypadku jakiejś przesyłki zrealizowanej na tej trasie.

Obciążenia podczas pierwszego przejścia to obciążenia początkowe trasy pojazdu. Następnie po każdej wizycie wartości loadDemands są dodawane lub odejmowane, aby uzyskać wartości ładunków dla następnego przejścia, w zależności od tego, czy wizyta była odbiorem czy dostawą.

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

string

Ciąg znaków reprezentujący zakodowane punkty linii łamanej.

Przerwa

Dane przedstawiające wykonanie przerwy.

Zapis JSON
{
  "startTime": string,
  "duration": string
}
Pola
startTime

string (Timestamp format)

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: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

duration

string (Duration format)

Czas trwania przerwy.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".