ShipmentRoute

Die Route eines Fahrzeugs kann entlang der Zeitachse so zerlegt werden (wir gehen von n Besuchen aus):

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

Wir unterscheiden zwischen:

  • „Pünktliche Ereignisse“ wie Start und Ende des Fahrzeugs sowie Start und Ende jedes Besuchs (Ankunft und Abfahrt). Sie treten zu einem bestimmten Zeitpunkt auf.
  • „Zeitintervalle“ wie die Besuche selbst und der Übergang zwischen Besuchen. Zeitintervalle können manchmal eine Dauer von null haben, d. h. sie beginnen und enden in derselben Sekunde. Oft haben sie jedoch eine positive Dauer.

Invarianten:

  • Bei n Besuchen gibt es n+1 Übergänge.
  • Ein Besuch ist immer von einem Übergang davor (derselbe Index) und einem Übergang danach (Index + 1) umgeben.
  • Auf den Fahrzeugstart folgt immer Übergang 0.
  • Dem Fahrzeugende geht immer der Übergang #n voraus.

Hier sehen Sie, was bei einer Transition und einer Visit passiert:

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

So können TRAVEL, BREAKS, DELAY und WAIT während eines Übergangs angeordnet werden.

  • Sie überschneiden sich nicht.
  • Die DELAY ist eindeutig und muss ein zusammenhängender Zeitraum unmittelbar vor dem nächsten Besuch (oder dem Ende des Fahrzeugs) sein. Daher reicht es aus, die Verzögerungsdauer zu kennen, um die Start- und Endzeit zu ermitteln.
  • Die PAUSEN sind zusammenhängende, sich nicht überschneidende Zeiträume. In der Antwort werden die Startzeit und die Dauer jeder Pause angegeben.
  • TRAVEL und WAIT sind „unterbrechbar“: Sie können während dieses Übergangs mehrmals unterbrochen werden. Clients können davon ausgehen, dass die Reise „so schnell wie möglich“ stattfindet und dass die verbleibende Zeit mit „Warten“ ausgefüllt wird.

Ein komplexes Beispiel:

                               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     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
JSON-Darstellung
{
  "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
}
Felder
vehicleIndex

integer

Das Fahrzeug, das die Route fährt, identifiziert durch seinen Index in der Quell-ShipmentModel.

vehicleLabel

string

Label des Fahrzeugs, das diese Route fährt. Entspricht ShipmentModel.vehicles(vehicleIndex).label, falls angegeben.

vehicleStartTime

string (Timestamp format)

Uhrzeit, zu der das Fahrzeug seine Route beginnt.

Verwendet RFC 3339, wobei die generierte Ausgabe immer Z-normalisiert ist und 0, 3, 6 oder 9 Nachkommastellen verwendet. Andere Offsets als „Z“ werden ebenfalls akzeptiert. Beispiele: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" oder "2014-10-02T15:01:23+05:30".

vehicleEndTime

string (Timestamp format)

Uhrzeit, zu der das Fahrzeug seine Route beendet.

Verwendet RFC 3339, wobei die generierte Ausgabe immer Z-normalisiert ist und 0, 3, 6 oder 9 Nachkommastellen verwendet. Andere Offsets als „Z“ werden ebenfalls akzeptiert. Beispiele: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" oder "2014-10-02T15:01:23+05:30".

visits[]

object (Visit)

Geordnete Reihenfolge von Besuchen, die eine Route darstellen. „visits[i]“ ist der i-te Besuch auf der Route. Wenn dieses Feld leer ist, gilt das Fahrzeug als nicht verwendet.

transitions[]

object (Transition)

Geordnete Liste der Übergänge für die Route.

hasTrafficInfeasibilities

boolean

Wenn OptimizeToursRequest.consider_road_traffic auf „true“ gesetzt ist, wird in diesem Feld angegeben, dass Unstimmigkeiten bei Routenzeitangaben anhand von verkehrsabhängigen Schätzungen der Fahrtdauer vorhergesagt werden. Möglicherweise ist nicht genügend Zeit, um die fahrplanmäßigen Fahrten, Verzögerungen und Pausen zwischen den Besuchen vor dem ersten oder nach dem letzten Besuch zu berücksichtigen und gleichzeitig die Zeitfenster für Besuche und Fahrzeuge einzuhalten. Beispiel:

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

Die Ankunft am Zielort wird aufgrund der erhöhten geschätzten Reisezeit von travelDuration(previous_visit, next_visit) aufgrund des Verkehrsaufkommens wahrscheinlich später als im aktuellen Zeitfenster erfolgen. Außerdem kann es vorkommen, dass eine Pause mit einem Besuch überschneidet, weil die geschätzte Reisezeit länger geworden ist und es Einschränkungen beim Zeitfenster für Besuche oder Pausen gibt.

routePolyline

object (EncodedPolyline)

Die codierte Polylinien-Darstellung der Route. Dieses Feld wird nur ausgefüllt, wenn OptimizeToursRequest.populate_polylines auf „true“ gesetzt ist.

breaks[]

object (Break)

Pausen, die für das Fahrzeug auf dieser Route geplant sind. Die breaks-Sequenz stellt Zeitintervalle dar, die jeweils bei der entsprechenden startTime beginnen und duration Sekunden dauern.

metrics

object (AggregatedMetrics)

Messwerte für Dauer, Distanz und Belastung für diese Route. Die Felder von AggregatedMetrics werden je nach Kontext über alle ShipmentRoute.transitions oder ShipmentRoute.visits hinweg summiert.

vehicleFullness

object (VehicleFullness)

VehicleFullness-Feld, um zu berechnen, wie nah die gedeckelten Messwerte an den jeweiligen Fahrzeuglimits liegen. Die Felder sind Verhältnisse zwischen einem Messwertfeld mit Obergrenze (z.B. AggregatedMetrics.travel_distance_meters) und dem zugehörigen Fahrzeuglimit (z.B. Vehicle.route_distance_limit).

Testphase: Das Verhalten oder die Existenz dieses Felds kann sich in Zukunft ändern.

routeCosts

map (key: string, value: number)

Kosten der Route, aufgeschlüsselt nach kostenbezogenen Anfragefeldern. Die Schlüssel sind Protopfade relativ zum Eingabe-OptimizeToursRequest, z. B. „model.shipments.pickups.cost“. Die Werte sind die Gesamtkosten, die durch das entsprechende Kostenfeld generiert werden, aggregiert über die gesamte Route. Mit anderen Worten: costs["model.shipments.pickups.cost"] ist die Summe aller Abholkosten für die Route. Alle im Modell definierten Kosten werden hier detailliert aufgeführt. Ausgenommen sind Kosten im Zusammenhang mit TransitionAttributes, die seit Januar 2022 nur noch zusammengefasst angegeben werden.

routeTotalCost

number

Gesamtkosten der Route. Die Summe aller Kosten in der Kostenübersicht.

Aufrufen

Ein Besuch, der während einer Route durchgeführt wird. Dieser Besuch entspricht einer Abholung oder Lieferung eines Shipment.

JSON-Darstellung
{
  "shipmentIndex": integer,
  "isPickup": boolean,
  "visitRequestIndex": integer,
  "startTime": string,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "detour": string,
  "shipmentLabel": string,
  "visitLabel": string,
  "injectedSolutionLocationToken": integer
}
Felder
shipmentIndex

integer

Index des Felds shipments in der Quelle ShipmentModel.

isPickup

boolean

Wenn „true“, entspricht der Besuch der Abholung eines Shipment. Andernfalls entspricht sie einer Auslieferung.

visitRequestIndex

integer

Index von VisitRequest im Feld „Abholung“ oder „Lieferung“ von Shipment (siehe isPickup).

startTime

string (Timestamp format)

Uhrzeit, zu der der Besuch beginnt. Das Fahrzeug kann jedoch auch früher am Zielort eintreffen. Die Zeiten stimmen mit der ShipmentModel überein.

Verwendet RFC 3339, wobei die generierte Ausgabe immer Z-normalisiert ist und 0, 3, 6 oder 9 Nachkommastellen verwendet. Andere Offsets als „Z“ werden ebenfalls akzeptiert. Beispiele: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" oder "2014-10-02T15:01:23+05:30".

loadDemands

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

Die Gesamtnachfrage nach Besuchen als Summe der Versand- und der Besuchsanträge loadDemands. Die Werte sind negativ, wenn es sich bei dem Besuch um eine Lieferung handelt. Die Nachfrage wird für dieselben Typen wie Transition.loads gemeldet (siehe dieses Feld).

detour

string (Duration format)

Zusätzliche Umwegzeit aufgrund der Lieferungen, die auf der Route vor dem Besuch angefahren werden, und der potenziellen Wartezeit, die durch Zeitfenster entsteht. Wenn der Besuch eine Lieferung ist, wird der Umweg vom entsprechenden Abholbesuch aus berechnet und entspricht:

startTime(delivery) - startTime(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

Andernfalls wird sie aus dem Fahrzeug startLocation berechnet und entspricht:

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

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

shipmentLabel

string

Kopie der entsprechenden Shipment.label, falls in der Shipment angegeben.

visitLabel

string

Kopie der entsprechenden VisitRequest.label, falls in der VisitRequest angegeben.

injectedSolutionLocationToken

integer

Ein intransparentes Token, das Informationen zu einem besuchten Ort enthält.

Dieses Feld kann in den Besuchen der Ergebnisrouten ausgefüllt werden, wenn VisitRequest.avoid_u_turns für diesen Besuch auf „true“ gesetzt wurde oder wenn ShipmentModel.avoid_u_turns in der Anfrage OptimizeToursRequest auf „true“ gesetzt wurde.

Experimentell: Weitere Informationen finden Sie unter https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

Übergang

Übergang zwischen zwei Ereignissen auf der Route. Siehe Beschreibung von ShipmentRoute.

Wenn das Fahrzeug keine startLocation und/oder endLocation hat, sind die entsprechenden Fahrtenmesswerte 0.

JSON-Darstellung
{
  "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)
    },
    ...
  }
}
Felder
travelDuration

string (Duration format)

Reisedauer während dieser Übergangszeit.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

travelDistanceMeters

number

Zurückgelegte Strecke während des Übergangs.

trafficInfoUnavailable

boolean

Wenn Traffic über OptimizeToursRequest.consider_road_traffic angefordert wird und die Traffic-Informationen für ein Transition nicht abgerufen werden konnten, wird dieser boolesche Wert auf „true“ gesetzt. Das kann vorübergehend (seltene Störung auf den Echtzeit-Verkehrsservern) oder dauerhaft (keine Daten für diesen Ort) sein.

delayDuration

string (Duration format)

Summe der Verzögerungsdauern, die auf diesen Übergang angewendet werden. Falls vorhanden, beginnt die Verzögerung genau delayDuration Sekunden vor dem nächsten Ereignis (Besuch oder Ende der Fahrt). TransitionAttributes.delay ansehen.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

breakDuration

string (Duration format)

Summe der Dauer der Pausen, die während dieses Übergangs aufgetreten sind (falls vorhanden). Details zur Startzeit und Dauer der einzelnen Pausen werden in ShipmentRoute.breaks gespeichert.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

waitDuration

string (Duration format)

Die Wartezeit während dieser Umstellung. Die Wartezeit entspricht der Leerlaufzeit und umfasst keine Pausenzeit. Beachten Sie außerdem, dass diese Wartezeit in mehrere nicht zusammenhängende Intervalle unterteilt sein kann.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

totalDuration

string (Duration format)

Gesamtdauer der Umstellung (zur Übersicht). Das entspricht:

  • nächster Besuch startTime (oder vehicleEndTime, wenn dies die letzte Umstellung ist) – startTime dieser Umstellung;
  • Wenn ShipmentRoute.has_traffic_infeasibilities „false“ ist, gilt außerdem: „totalDuration = travelDuration + delayDuration“
  • breakDuration + waitDuration“.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

startTime

string (Timestamp format)

Startzeit dieses Übergangs.

Verwendet RFC 3339, wobei die generierte Ausgabe immer Z-normalisiert ist und 0, 3, 6 oder 9 Nachkommastellen verwendet. Andere Offsets als „Z“ werden ebenfalls akzeptiert. Beispiele: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" oder "2014-10-02T15:01:23+05:30".

routePolyline

object (EncodedPolyline)

Die codierte Polylinien-Darstellung der Route, die während der Übergangsphase gefahren wurde. Dieses Feld wird nur ausgefüllt, wenn populateTransitionPolylines auf „true“ gesetzt ist.

routeToken

string

Nur Ausgabe. Ein vertrauliches Token, das an das Navigation SDK übergeben werden kann, um die Route während der Navigation zu rekonstruieren und bei einer Umleitung die ursprüngliche Absicht beim Erstellen der Route zu berücksichtigen. Behandeln Sie dieses Token als intransparenten Blob. Vergleichen Sie den Wert nicht über Anfragen hinweg, da er sich ändern kann, auch wenn der Dienst genau dieselbe Route zurückgibt. Dieses Feld wird nur ausgefüllt, wenn populateTransitionPolylines auf „true“ gesetzt ist.

vehicleLoads

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

Fahrzeugladungen während dieser Umstellung für jeden Typ, der entweder in der Vehicle.load_limits dieses Fahrzeugs enthalten ist oder für den bei einer Sendung auf dieser Route ein Shipment.load_demands-Wert ungleich null vorhanden ist.

Die Ladungen während des ersten Übergangs sind die Startladungen der Fahrzeugroute. Nach jedem Besuch werden die loadDemands des Besuchs entweder addiert oder subtrahiert, um die Ladungen für den nächsten Übergang zu erhalten. Das hängt davon ab, ob es sich beim Besuch um eine Abholung oder eine Lieferung gehandelt hat.

EncodedPolyline

Die codierte Darstellung einer Polylinie. Weitere Informationen zur Polyline-Codierung finden Sie hier: https://developers.google.com/maps/documentation/utilities/polylinealgorithm und https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

JSON-Darstellung
{
  "points": string
}
Felder
points

string

String, der die codierten Punkte der Polylinie darstellt.

Pause

Daten, die die Ausführung einer Pause darstellen.

JSON-Darstellung
{
  "startTime": string,
  "duration": string
}
Felder
startTime

string (Timestamp format)

Startzeit einer Pause.

Verwendet RFC 3339, wobei die generierte Ausgabe immer Z-normalisiert ist und 0, 3, 6 oder 9 Nachkommastellen verwendet. Andere Offsets als „Z“ werden ebenfalls akzeptiert. Beispiele: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" oder "2014-10-02T15:01:23+05:30".

duration

string (Duration format)

Dauer einer Pause.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

VehicleFullness

VehicleFullness ist ein Messwert, der angibt, wie voll ein Fahrzeug ist. Jeder VehicleFullness-Wert liegt zwischen 0 und 1 und wird als Verhältnis zwischen einem Messwertfeld mit Obergrenze (z.B. AggregatedMetrics.travel_distance_meters) und dem zugehörigen Fahrzeuglimit (z.B. Vehicle.route_distance_limit) berechnet, sofern es vorhanden ist. Andernfalls bleibt das Füllverhältnis nicht festgelegt. Wenn das Limit 0 ist, wird das Feld auf 1 gesetzt. Hinweis: Wenn eine Route aufgrund von Verkehrsbedingungen nicht durchführbar ist, können einige Rohwerte für das Füllverhältnis 1,0 überschreiten, z. B. wenn das Fahrzeug das Distanzlimit überschreitet. In diesen Fällen begrenzen wir die Füllwerte auf 1, 0.

JSON-Darstellung
{
  "maxFullness": number,
  "distance": number,
  "travelDuration": number,
  "activeDuration": number,
  "maxLoad": number,
  "activeSpan": number
}
Felder
maxFullness

number

Maximum aller anderen Felder in dieser Nachricht.

distance

number

Das Verhältnis zwischen AggregatedMetrics.travel_distance_meters und Vehicle.route_distance_limit. Wenn Vehicle.route_distance_limit nicht festgelegt ist, wird dieses Feld nicht festgelegt.

travelDuration

number

Das Verhältnis zwischen [AggregatedMetrics.travel_duration_seconds][] und Vehicle.travel_duration_limit. Wenn Vehicle.travel_duration_limit nicht festgelegt ist, wird dieses Feld nicht festgelegt.

activeDuration

number

Das Verhältnis zwischen [AggregatedMetrics.total_duration_seconds][] und Vehicle.route_duration_limit. Wenn Vehicle.route_duration_limit nicht festgelegt ist, wird dieses Feld nicht festgelegt.

maxLoad

number

Das maximale Verhältnis zwischen allen Arten von [AggregatedMetrics.max_load][] und den entsprechenden Vehicle.load_limits. Wenn alle Vehicle.load_limits-Felder nicht festgelegt sind, ist dieses Feld nicht festgelegt.

activeSpan

number

Das Verhältnis (vehicleEndTime – vehicleStartTime) / (latestVehicleEndTime – earliestVehicleStartTime) für ein bestimmtes Fahrzeug. Wenn der Nenner nicht vorhanden ist, wird stattdessen (ShipmentModel.global_end_time – ShipmentModel.global_start_time) verwendet.