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 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 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 ( |
| Pola | |
|---|---|
vehicleIndex |
Pojazd wykonujący trasę, zidentyfikowany przez indeks w źródle |
vehicleLabel |
Etykieta pojazdu wykonującego tę trasę, równa |
vehicleStartTime |
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: |
vehicleEndTime |
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: |
visits[] |
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[] |
Uporządkowana lista przejść na trasie. |
hasTrafficInfeasibilities |
Gdy wartość Przyjazd do next_visit prawdopodobnie nastąpi później niż w obecnym przedziale czasowym ze względu na zwiększone szacunkowe natężenie ruchu |
routePolyline |
Zakodowana polilinia reprezentująca trasę. To pole jest wypełniane tylko wtedy, gdy |
breaks[] |
Przerwy zaplanowane dla pojazdu, który pokonuje tę trasę. Ciąg |
metrics |
Dane dotyczące czasu trwania, odległości i obciążenia na tej trasie. Pola |
vehicleFullness |
Eksperymentalne: działanie lub istnienie tego pola może się w przyszłości zmienić. |
routeCosts |
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 |
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 ( |
| Pola | |
|---|---|
shipmentIndex |
Indeks pola |
isPickup |
Jeśli wartość to „true”, wizyta odpowiada odbiorowi |
visitRequestIndex |
Indeks |
startTime |
Godzina rozpoczęcia wizyty. Pamiętaj, że pojazd może dotrzeć do miejsca wizyty wcześniej. Godziny są zgodne z 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: |
loadDemands |
Łączne zapotrzebowanie na załadunek wizyty jako suma przesyłki i żądania wizyty |
detour |
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: W przeciwnym razie jest obliczana na podstawie wartości Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „ |
shipmentLabel |
Kopia odpowiedniego elementu |
visitLabel |
Kopia odpowiedniego elementu |
visitType |
Opcjonalnie. Określa typ wizyty. Zastępuje pole |
injectedSolutionLocationToken |
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ść 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 ( |
| Pola | |
|---|---|
travelDuration |
Czas trwania podróży podczas tego przejścia. Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „ |
travelDistanceMeters |
Odległość przebyta podczas przejścia. |
trafficInfoUnavailable |
Gdy ruch jest żądany za pomocą |
delayDuration |
Suma opóźnień zastosowanych w tym przejściu. Opóźnienie, jeśli występuje, zaczyna się dokładnie Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „ |
breakDuration |
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 Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „ |
waitDuration |
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 „ |
totalDuration |
Łączny czas trwania przejścia podany dla wygody. Jest ona równa:
Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „ |
startTime |
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: |
routePolyline |
Zakodowana polilinia reprezentująca trasę pokonaną podczas przejścia. To pole jest wypełniane tylko wtedy, gdy wartość |
routeToken |
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 |
vehicleLoads |
Ładunki pojazdu w okresie przejściowym dla każdego typu, który występuje w Ł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ą |
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 |
Ciąg znaków reprezentujący zakodowane punkty linii łamanej. |
Przerwa
Dane reprezentujące wykonanie przerwy.
| Zapis JSON |
|---|
{ "startTime": string, "duration": string } |
| Pola | |
|---|---|
startTime |
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: |
duration |
Czas trwania przerwy. Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „ |
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 |
Maksymalna wartość wszystkich pozostałych pól w tej wiadomości. |
distance |
Stosunek między |
travelDuration |
Stosunek między [AggregatedMetrics.travel_duration_seconds][] a |
activeDuration |
Stosunek między [AggregatedMetrics.total_duration_seconds][] a |
maxLoad |
Maksymalny współczynnik spośród wszystkich typów [AggregatedMetrics.max_load][] i odpowiednich wartości |
activeSpan |
Stosunek (vehicleEndTime – vehicleStartTime) / (latestVehicleEndTime – earliestVehicleStartTime) dla danego pojazdu. Jeśli mianownik nie występuje, zamiast niego używany jest stosunek ( |