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:

  • „zdarzenia punktowe”, takie jak rozpoczęcie i zakończenie przejazdu pojazdu oraz rozpoczęcie i zakończenie każdej wizyty (czyli przyjazd i odjazd). Odbywają się one w określonej sekundzie.
  • „przedziały czasowe”, takie jak wizyty i przejścia między wizytami. Chociaż przedziały czasowe mogą czasami mieć zerowy czas trwania, tzn. rozpoczynać 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 przejazdu jest zawsze poprzedzone numerem przejścia #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ć PRZEJAZD, PRZERWY, OPÓŹNIENIE i OCZEKIWANIE podczas przejścia.

  • Nie nakładają się na siebie.
  • Wartość DELAY jest unikalna i musi być ciągłym okresem czasu bezpośrednio przed kolejną wizytą (lub zakończeniem podróży pojazdu). Wystarczy więc znać czas trwania opóźnienia, aby poznać jego godzinę 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óż odbywa się „tak szybko, jak to możliwe”, a „oczekiwanie” wypełnia 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 wykonują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 podróży i ograniczeń dotyczących czasu wizyty lub przerwy.

routePolyline

object (EncodedPolyline)

Zakodowana polilinia 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 czasowe, 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 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 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 podczas trasy. Odpowiada ona 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ódłowym ShipmentModel.

isPickup

boolean

Jeśli wartość to „true”, 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 załadunek 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 (patrz to pole).

detour

string (Duration format)

Dodatkowy czas objazdu wynikający z odwiedzonych przesyłek na trasie przed wizytą i 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 wartości 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.

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

VisitType

Wskazuje, czy wizyta jest odbiorem, dostawą czy wizytą w Stop. Wizyty w Stop 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 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 tego przejścia.

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

travelDistanceMeters

number

Odległość przebyta 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 tej zmiany, jeśli takie występują. Szczegóły dotyczące czasu rozpoczęcia i 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 tej zmiany. Czas oczekiwania odpowiada czasowi bezczynności i nie obejmuje przerw. 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 „fałsz”, 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 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 polilinia reprezentująca trasę pokonaną podczas przejścia. To pole jest wypełniane tylko wtedy, gdy wartość populateTransitionPolylines to „true”.

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 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 trasy pojazdu. Następnie po każdej wizycie do ładunków następnego przejazdu dodawane lub odejmowane są loadDemands wizyty, w zależności od tego, czy była to wizyta 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)

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.

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

VehicleFullness

VehicleFullness to wskaźnik, który określa, 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 wartości 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, zamiast niego używany jest stosunek (ShipmentModel.global_end_time – ShipmentModel.global_start_time).