ShipmentRoute

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 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 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 (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 poruszającego się po tej trasie, 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 RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi 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 RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi 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ę. Wizyty[i] to i-te wizyty 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 brakować czasu na skoordynowanie podróży dostosowanej do natężenia ruchu, opóźnień i przerw między wizytami, przed pierwszą wizytą lub po ostatniej wizycie, a jednocześnie niezmiennie musi spełniać wymagania związane z wizytą i pojazdem. Na przykład

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

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 (travelDuration(previous_visit, next_visit)) ze względu na korki. Przerwa może też pokrywać się z wizytą ze względu na dłuższy szacowany czas podróży oraz ograniczenia przedziałów czasowych wizyty lub przerwy.

routePolyline

object (EncodedPolyline)

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

breaks[]

object (Break)

Przerwy zaplanowane dla pojazdu na tej trasie. Sekwencja breaks reprezentuje przedziały czasu. Każdy z nich rozpoczyna się o odpowiedniej wartości startTime i trwa duration s.

metrics

object (AggregatedMetrics)

Dane dotyczące czasu trwania, odległości i obciążenia na tej trasie. Pola AggregatedMetrics są sumowane dla wszystkich 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 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

number

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 (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 ona 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 pojawić się na miejscu wcześniej. Godziny 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))

Łączne obciążenie związane z wizytami jako suma dostawy i żądania wizyty loadDemands. Jeśli wizyta to dostawa, wartości są ujemne. Raportowane są żądania dotyczące tych samych typów co pole Transition.loads (patrz to pole).

detour

string (Duration format)

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ść:

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 trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „s”. Przykład: "3.5s".

shipmentLabel

string

Kopia odpowiedniego pola Shipment.label, jeśli określono ją w zasadzie Shipment.

visitLabel

string

Kopia odpowiedniego elementu VisitRequest.label, jeśli został on podany w elemencie 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 trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „s”. Przykład: "3.5s".

travelDistanceMeters

number

Odległość przebyta podczas przejścia.

trafficInfoUnavailable

boolean

Jeśli żądanie ruchu pochodzi z OptimizeToursRequest.consider_road_traffic i nie można pobrać informacji o ruchu dla Transition, ta wartość logiczna ma wartość Prawda. Może to być tymczasowe (rzadkie problemy z serwerami ruchu w czasie rzeczywistym) lub trwałe (brak danych dla tej lokalizacji).

delayDuration

string (Duration format)

Suma czasów opóźnienia zastosowanych do tego przejścia. Jeśli tak, opóźnienie zaczyna się dokładnie delayDuration sekundy przed następnym zdarzeniem (wizytą lub zakończeniem 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ółowe informacje o czasie rozpoczęcia i czasie trwania każdej przerwy są przechowywane w ShipmentRoute.breaks.

Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „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 zostać podzielony na kilka nieciągłych przedziałów czasu.

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

totalDuration

string (Duration format)

Całkowity czas trwania zmiany podany dla wygody użytkowników. Jest ona równa:

  • następna wizyta startTime (lub vehicleEndTime, jeśli jest to ostatnia zmiana) – startTime tej zmiany;
  • jeśli ShipmentRoute.has_traffic_infeasibilities ma wartość fałsz, dodatkowo zawiera: `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)

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: "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 populateTransitionPolylines ma wartość true (prawda).

routeToken

string

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 populateTransitionPolylines ma wartość true (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 reprezentujące wykonanie przerwy.

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

string (Timestamp format)

Czas rozpoczęcia przerwy.

Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "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".