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 dzieje się 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ć TRAVEL, BREAKS, DELAY i WAIT 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 ciągłe, niepokrywające się okresy. Odpowiedź określa czas rozpoczęcia i czas trwania każdej przerwy.
  • Stany TRAVEL i WAIT są „wywłaszczalne”: mogą być przerywane kilka razy podczas tego przejścia. Klienci mogą założyć, że podróż odbędzie się „tak szybko, jak to możliwe”, 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 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 wizyt i pojazdów. 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 dojazdu i 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 obsługującego 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)

Dane dotyczące czasu trwania, odległości i obciążenia na tej trasie. 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 od odpowiednich limitów pojazdu. Jego pola to stosunki 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 protokołu, względne w stosunku do wejściowego żądania 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ą tu szczegółowo raportowane, z wyjątkiem kosztów związanych z atrybutami przejścia, które od 2022 r. są raportowane 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,
  "injectedSolutionLocationToken": integer
}
Pola
shipmentIndex

integer

Indeks pola shipments w źródłowym 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)

Godzina rozpoczęcia wizyty. Pamiętaj, że pojazd może dotrzeć do miejsca wizyty wcześniej. Godziny są zgodne z 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 wizyty jako suma przesyłki i żądania wizyty loadDemands. Jeśli wizyta jest dostawą, wartości są ujemne. Dane o popycie są raportowane w przypadku tych samych typów co w przypadku pola Transition.loads.

detour

string (Duration format)

Dodatkowy czas objazdu wynikający z odwiedzonych przesyłek na trasie przed wizytą oraz potencjalny czas oczekiwania wynikający z przedziałów czasowych. 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.

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

shipmentLabel

string

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

visitLabel

string

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

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 wartość VisitRequest.avoid_u_turns została ustawiona na „true” lub gdy w żądaniu OptimizeToursRequest wartość ShipmentModel.avoid_u_turns została ustawiona na „true”.

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

Przejście

Przejście między 2 wydarzeniami 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 trwania podróży podczas tej zmiany.

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

travelDistanceMeters

number

Odległość pokonana 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. Opóźnienie, jeśli występuje, zaczyna się dokładnie delayDuration sekundy przed następnym zdarzeniem (wizytą lub zakończeniem przejazdu pojazdu). Zobacz TransitionAttributes.delay.

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

breakDuration

string (Duration format)

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

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

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.

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

totalDuration

string (Duration format)

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

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

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

startTime

string (Timestamp format)

Czas rozpoczęcia tej zmiany.

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 zasada 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 i w przypadku zmiany trasy uwzględnić pierwotny zamiar, gdy trasa została utworzona. Traktuj ten token jako nieprzejrzystą strukturę binarną. Nie porównuj jego wartości w różnych żądaniach, ponieważ może się ona zmieniać, nawet jeśli usługa zwraca 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 okresie przejściowym 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 zrealizowanych na tej trasie.

Ładunki podczas pierwszego przejazdu to ładunki początkowe na trasie 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 dotyczyła odbioru czy dostawy.

EncodedPolyline

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

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.

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

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 na trasie występują problemy 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_metersVehicle.route_distance_limit. Jeśli pole Vehicle.route_distance_limit nie jest ustawione, to pole również 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 również 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 również nie będzie ustawione.

maxLoad

number

Maksymalny współczynnik spośród wszystkich typów [AggregatedMetrics.max_load][] i odpowiednich Vehicle.load_limits. Jeśli wszystkie pola Vehicle.load_limits są nieustawione, to pole 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).