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:

  • „dokładne zdarzenia”, takie jak rozpoczęcie i zakończenie jazdy oraz rozpoczęcie i zakończenie 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ż 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, występują przejścia n+1.
  • Odwiedziny są zawsze otoczone przejściem przed nią (ten sam indeks) i przejściem 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.
  • PRZERWA to sąsiadujące ze sobą okresy, które nie nakładają się na siebie. Odpowiedź określa 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 (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 zakończenia trasy przez pojazd.

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ę. 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

Jeśli zasada OptimizeToursRequest.consider_road_traffic ma wartość Prawda, to pole wskazuje, że niespójności w czasie podróży są prognozowane na podstawie szacunków czasu podróży 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ż 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 reprezentacja trasy w postaci linii łamanej. To pole jest wypełniane tylko wtedy, gdy OptimizeToursRequest.populate_polylines ma wartość Prawda.

breaks[]

object (Break)

Przerwy zaplanowane dla pojazdu na tej trasie. Sekwencja breaks reprezentuje przedziały czasu, z których każdy zaczyna się w odpowiednim startTime i trwa duration sekund.

metrics

object (AggregatedMetrics)

Dane o czasie trwania, dystansie i obciążeniu tej trasy. 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. Inaczej mówiąc, koszt["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 przeprowadzona na trasie. Ta wizyta odpowiada odbiórowi 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 on dostawie.

visitRequestIndex

integer

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

startTime

string (Timestamp format)

Godzina rozpoczęcia wizyty. Pamiętaj, że pojazd może dotrzeć do miejsca wizyty 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" i "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 dotyczy dostawy, wartości są ujemne. Popyt jest raportowany w przypadku tych samych typów co 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 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 obliczany na podstawie pojazdu startLocation. Ma on wartość:

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 odpowiedniego pola Shipment.label, jeśli określono ją w zasadzie Shipment.

visitLabel

string

Kopia odpowiedniego pola VisitRequest.label, jeśli określono ją w zasadzie 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ć 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óły dotyczące czasu rozpoczęcia i długości 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 tej zmiany. 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ą „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 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ść 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ść 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.

Ładunki występujące podczas pierwszego przejścia to początkowe wczytywanie trasy pojazdu. Następnie, po każdej wizycie, loadDemands wizyty jest dodawane lub odejmowane, aby uzyskać obciążenie 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 złożonej.

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