ShipmentRoute

Trasę pojazdu można podzielić wzdłuż 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 rozróżniamy:

  • „punktualne zdarzenia”, takie jak rozpoczęcie i zakończenie przejazdu pojazdu oraz rozpoczęcie i zakończenie każdej wizyty (czyli przyjazd i odjazd). Występują w określonej sekundzie.
  • „przedziały czasowe”, takie jak same wizyty i przejścia między nimi. Chociaż przedziały czasowe mogą czasami mieć zerowy czas trwania, tzn. zaczynać się i kończyć w tej samej sekundzie, często mają dodatni czas trwania.

Niezmienniki:

  • Jeśli jest n wizyt, występuje n+1 przejść.
  • Wizyta jest zawsze poprzedzona przejściem (o tym samym indeksie) i następuje po niej przejście (o indeksie + 1).
  • Po uruchomieniu pojazdu zawsze następuje przejście 0.
  • Zakończenie pojazdu jest zawsze poprzedzone przejściem nr n.

Przyjrzyjmy się bliżej, 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 przedstawiamy, jak można zorganizować PRZEJAZD, PRZERWY, OPÓŹNIENIE i OCZEKIWANIE podczas przejścia.

  • Nie nakładają się na siebie.
  • OPÓŹNIENIE jest unikalne i musi być ciągłym okresem czasu bezpośrednio przed kolejną wizytą (lub zakończeniem przejazdu). Wystarczy więc znać czas trwania opóźnienia, aby poznać jego czas rozpoczęcia i zakończenia.
  • PRZERWY to sąsiadujące ze sobą, niepokrywające się okresy. Odpowiedź określa czas rozpoczęcia i czas trwania każdej przerwy.
  • Stany TRAVEL i WAIT są „wywłaszczalne”: w trakcie przejścia mogą być wielokrotnie przerywane. Klienci mogą założyć, że podróż odbędzie się „jak najszybciej”, a „oczekiwanie” wypełni pozostały czas.

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)
  },
  "vehicleFullness": {
    object (VehicleFullness)
  },
  "routeCosts": {
    string: number,
    ...
  },
  "routeTotalCost": number
}
Pola
vehicleIndex

integer

Pojazd realizujący trasę, zidentyfikowany przez 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)

Godzina rozpoczęcia trasy przez pojazd.

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

vehicleEndTime

string (Timestamp format)

Godzina, o której pojazd kończy trasę.

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

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 uznawany za nieużywany.

transitions[]

object (Transition)

Uporządkowana lista przejść na trasie.

hasTrafficInfeasibilities

boolean

Gdy wartość OptimizeToursRequest.consider_road_traffic jest ustawiona na „true”, to pole wskazuje, że niespójności w czasach przejazdu są przewidywane na podstawie szacunków czasu podróży opartych na danych o ruchu. Może nie być wystarczająco dużo czasu na uwzględnienie podróży z uwzględnieniem natężenia ruchu, opóźnień i przerw między wizytami, przed pierwszą wizytą lub po ostatniej wizycie, przy jednoczesnym spełnieniu przedziałów czasowych wizyty i pojazdu. Na przykład

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

Przyjazd do next_visit prawdopodobnie nastąpi później niż w obecnym przedziale czasowym ze względu na zwiększone szacunkowe natężenie ruchu travelDuration(previous_visit, next_visit). Przerwa może też zostać wymuszona, aby pokrywała się z wizytą, z powodu wzrostu 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 OptimizeToursRequest.populate_polylines ma wartość Prawda.

breaks[]

object (Break)

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

metrics

object (AggregatedMetrics)

Czas trwania, odległość i wskaźniki obciążenia dla tej trasy. Pola AggregatedMetrics są sumowane we wszystkich ShipmentRoute.transitions lub ShipmentRoute.visits w zależności od kontekstu.

vehicleFullness

object (VehicleFullness)

VehicleFullness do obliczania, jak blisko są ograniczone dane do odpowiednich limitów pojazdów. Jego pola to współczynniki między polem danych objętych limitem (np. AggregatedMetrics.travel_distance_meters) a powiązanym limitem pojazdu (np. Vehicle.route_distance_limit).

Eksperymentalne: działanie lub istnienie tego pola może się w przyszłości zmienić.

routeCosts

map (key: string, value: number)

Koszt trasy z podziałem na pola żądania związane z kosztami. Kluczami są ścieżki proto, względne w stosunku do wejściowego OptimizeToursRequest, np. „model.shipments.pickups.cost”, a wartościami są łączne koszty wygenerowane przez odpowiednie pole kosztu, zagregowane 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ą szczegółowo podane w tym miejscu, z wyjątkiem kosztów związanych z atrybutami przejścia, które od 2022 r. są podawane tylko w formie zagregowanej.

routeTotalCost

number

Całkowity koszt trasy. Suma wszystkich kosztów na mapie kosztów.

Odwiedź

Wizyta odbyta podczas 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,
  "visitType": enum (VisitType),
  "injectedSolutionLocationToken": integer
}
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 pliku 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 czasem ShipmentModel.

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

loadDemands

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

Łączne zapotrzebowanie na załadunek wizyty jako suma przesyłki i żądania wizyty loadDemands. Wartości są ujemne, jeśli wizyta jest dostawą. Dane o popycie są raportowane w przypadku tych samych typów co w przypadku pola Transition.loads (patrz to pole).

detour

string (Duration format)

Dodatkowy czas objazdu wynikający z odwiedzonych przed wizytą przesyłek na trasie oraz potencjalnego czasu oczekiwania spowodowanego przedziałami czasowymi. Jeśli wizyta dotyczy dostawy, objazd jest obliczany na podstawie odpowiedniej wizyty związanej z odbiorem 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 startLocation pojazdu i jest równa:

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

string

Kopia odpowiedniego elementu Shipment.label, jeśli został określony w elemencie Shipment.

visitLabel

string

Kopia odpowiedniego parametru VisitRequest.label, jeśli został określony w parametrze VisitRequest.

visitType

enum (VisitType)

Opcjonalnie: Określa typ wizyty. Zastępuje pole Visit.is_pickup.

injectedSolutionLocationToken

integer

Nieprzezroczysty token reprezentujący informacje o lokalizacji wizyty.

To pole może być wypełnione w przypadku wizyt na trasach wyników, gdy w przypadku tej wizyty pole VisitRequest.avoid_u_turns miało wartość true lub gdy w żądaniu OptimizeToursRequest pole ShipmentModel.avoid_u_turns miało wartość true.

Eksperymentalne: więcej informacji znajdziesz na stronie https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

VisitType

Wskazuje, czy wizyta jest odbiorem, dostawą czy wizytą w Stop. Wizyty w punkcie są używane tylko wtedy, gdy włączona jest optymalizacja multimodalna.

Wartości w polu enum
VISIT_TYPE_UNSPECIFIED Nieokreślony typ wizyty.
PICKUP_SHIPMENT Wizyta odpowiada odbiorowi przesyłki.
DELIVER_SHIPMENT Wizyta odpowiada dostawie przesyłki.

Przejście

Przejście między dwoma zdarzeniami na trasie. Zobacz opis ShipmentRoute.

Jeśli pojazd nie ma startLocation lub endLocation, odpowiednie dane dotyczące podróży wynoszą 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 podróży podczas tego przejścia.

travelDistanceMeters

number

dystans przebyty podczas przejścia;

trafficInfoUnavailable

boolean

Gdy ruch jest żądany za pomocą OptimizeToursRequest.consider_road_traffic, a informacji o ruchu nie można pobrać dla Transition, ta wartość logiczna jest ustawiona na „true”. Może to być problem tymczasowy (rzadkie zakłócenie działania serwerów ruchu w czasie rzeczywistym) lub trwały (brak danych o tej lokalizacji).

delayDuration

string (Duration format)

Suma opóźnień zastosowanych w tym przejściu. Jeśli występuje opóźnienie, zaczyna się ono dokładnie delayDuration sekund przed następnym zdarzeniem (wizytą lub zakończeniem jazdy). Zobacz TransitionAttributes.delay.

breakDuration

string (Duration format)

Suma czasu trwania przerw występujących podczas tej zmiany, jeśli takie występują. Szczegóły dotyczące godziny rozpoczęcia i czasu trwania każdej przerwy są przechowywane w ShipmentRoute.breaks.

waitDuration

string (Duration format)

Czas oczekiwania podczas tego przejścia. Czas oczekiwania odpowiada czasowi bezczynności i nie obejmuje czasu przerwy. Pamiętaj też, że czas oczekiwania może być podzielony na kilka nieciągłych przedziałów.

totalDuration

string (Duration format)

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

  • kolejna wizyta startTime (lub vehicleEndTime, jeśli jest to ostatnia zmiana) – startTime tej zmiany;
  • Jeśli wartość ShipmentRoute.has_traffic_infeasibilities to „false”, obowiązuje też to: `totalDuration = travelDuration + delayDuration
  • breakDuration + waitDuration`.
startTime

string (Timestamp format)

Czas rozpoczęcia tego przejścia.

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

routePolyline

object (EncodedPolyline)

Zakodowana linia łamana reprezentująca trasę pokonaną podczas przejścia. 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, aby odtworzyć trasę podczas nawigacji, a w przypadku zmiany trasy uwzględnić pierwotny zamiar, gdy trasa została utworzona. Traktuj ten token jako nieprzezroczystą strukturę danych. Nie porównuj jego 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))

Obciążenia pojazdu podczas tego przejścia dla każdego typu, który występuje w Vehicle.load_limits tego pojazdu lub ma niezerową wartość Shipment.load_demands w przypadku niektórych przesyłek realizowanych na tej trasie.

Ładunki podczas pierwszego przejazdu są ładunkami początkowymi trasy pojazdu. Następnie po każdej wizycie loadDemands są dodawane lub odejmowane, aby uzyskać liczbę załadunków w kolejnym przejeździe, w zależności od tego, czy wizyta była odbiorem czy dostawą.

EncodedPolyline

Zakodowana reprezentacja linii łamanej. Więcej informacji o kodowaniu polilinii 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)

Godzina rozpoczęcia przerwy.

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

duration

string (Duration format)

Czas trwania przerwy.

VehicleFullness

VehicleFullness to dane, które określają, jak bardzo pojazd jest zapełniony. Każde pole VehicleFullness ma wartość od 0 do 1, obliczaną jako stosunek między polem danych z limitem (np. AggregatedMetrics.travel_distance_meters) a powiązanym limitem pojazdu (np. Vehicle.route_distance_limit), jeśli taki limit istnieje. W przeciwnym razie współczynnik wypełnienia pozostanie nieustawiony. Jeśli limit wynosi 0, pole przyjmuje wartość 1. Uwaga: gdy trasa jest objęta problemami z ruchem, niektóre surowe współczynniki wypełnienia mogą przekraczać 1,0, np. pojazd może przekroczyć limit odległości. W takich przypadkach ograniczamy wartości pełności do 1, 0.

Zapis JSON
{
  "maxFullness": number,
  "distance": number,
  "travelDuration": number,
  "activeDuration": number,
  "maxLoad": number,
  "activeSpan": number
}
Pola
maxFullness

number

Maksymalna wartość wszystkich pozostałych pól w tej wiadomości.

distance

number

Stosunek między AggregatedMetrics.travel_distance_meters a Vehicle.route_distance_limit. Jeśli pole Vehicle.route_distance_limit nie jest ustawione, to pole nie będzie ustawione.

travelDuration

number

Stosunek między [AggregatedMetrics.travel_duration_seconds][] a Vehicle.travel_duration_limit. Jeśli pole Vehicle.travel_duration_limit nie jest ustawione, to pole nie będzie ustawione.

activeDuration

number

Stosunek między [AggregatedMetrics.total_duration_seconds][] a Vehicle.route_duration_limit. Jeśli pole Vehicle.route_duration_limit nie jest ustawione, to pole nie będzie ustawione.

maxLoad

number

Maksymalny współczynnik spośród wszystkich typów [AggregatedMetrics.max_load][] i odpowiednich wartości Vehicle.load_limits. Jeśli wszystkie pola Vehicle.load_limits są nieustawione, to pole również będzie nieustawione.

activeSpan

number

Stosunek (vehicleEndTime - vehicleStartTime) / (latestVehicleEndTime - earliestVehicleStartTime) dla danego pojazdu. Jeśli mianownik nie występuje, używana jest wartość (ShipmentModel.global_end_time – ShipmentModel.global_start_time).