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 Beginn 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 während 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 einer Übergangsphase angeordnet werden.

  • Sie überschneiden sich nicht.
  • Die VERZÖGERUNG ist eindeutig und muss ein zusammenhängender Zeitraum unmittelbar vor dem nächsten Besuch (oder dem Ende der Fahrzeugnutzung) sein. Daher reicht es aus, die Verzögerungsdauer zu kennen, um die Start- und Endzeit zu ermitteln.
  • Die PAUSEN sind zusammenhängende, 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 dieser Übergangsphase mehrmals unterbrochen werden. Kunden 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 Folge 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 ungenutzt.

transitions[]

object (Transition)

Sortierte 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 den Routenzeiten anhand von verkehrsabhängigen Schätzungen der Reisezeit vorhergesagt werden. Möglicherweise ist nicht genügend Zeit, um verkehrsbedingte Fahrten, Verzögerungen und Pausen zwischen 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 „next_visit“ erfolgt aufgrund der erhöhten geschätzten Reisezeit von travelDuration(previous_visit, next_visit) aufgrund des Verkehrsaufkommens wahrscheinlich später als im aktuellen Zeitfenster. Außerdem kann es vorkommen, dass eine Pause aufgrund von längeren geschätzten Reisezeiten und Einschränkungen des Zeitfensters für Besuche oder Pausen mit einem Besuch überschneidet.

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 geplant sind, das diese Route fährt. 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 summiert.

vehicleFullness

object (VehicleFullness)

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

Experimentell: 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, mit Ausnahme der Kosten für TransitionAttributes, die ab Januar 2022 nur noch aggregiert ausgewiesen 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,
  "visitType": enum (VisitType),
  "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 Lieferung.

visitRequestIndex

integer

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

startTime

string (Timestamp format)

Uhrzeit, zu der der Besuch beginnt. Hinweis: Das Fahrzeug kann früher als angegeben am Besuchsort 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 Gesamtlast der Besuche ergibt sich aus der Summe der Versand- und Besuchsanträge loadDemands. Die Werte sind negativ, wenn es sich beim 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 vor dem Besuch auf der Route angefahren werden, und der potenziellen Wartezeit, die durch Zeitfenster verursacht wird. Wenn es sich bei dem Besuch um eine Lieferung handelt, 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.
shipmentLabel

string

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

visitLabel

string

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

visitType

enum (VisitType)

Optional. Gibt den Typ des Besuchs an. Überschreibt das Feld Visit.is_pickup.

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.

VisitType

Gibt an, ob es sich um eine Abholung, eine Lieferung oder einen Besuch bei Stop handelt. Besuche an einem Stopp werden nur verwendet, wenn die multimodale Optimierung aktiviert ist.

Enums
VISIT_TYPE_UNSPECIFIED Nicht angegebener Besuchstyp.
PICKUP_SHIPMENT Ein Besuch entspricht einer Abholung.
DELIVER_SHIPMENT Ein Besuch entspricht einer Lieferung.

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

travelDistanceMeters

number

Zurückgelegte Strecke während des Übergangs.

trafficInfoUnavailable

boolean

Wenn der 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-Traffic-Servern) oder dauerhaft (keine Daten für diesen Ort) sein.

delayDuration

string (Duration format)

Summe der Verzögerungsdauern, die auf diese Umstellung angewendet wurden. Die Verzögerung beginnt genau delayDuration Sekunden vor dem nächsten Ereignis (Besuch oder Ende der Fahrt). TransitionAttributes.delay ansehen.

breakDuration

string (Duration format)

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

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.

totalDuration

string (Duration format)

Die Gesamtdauer der Umstellung wird zur Vereinfachung angegeben. 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“.
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 des Übergangs gefahren wurde. Dieses Feld wird nur ausgefüllt, wenn populateTransitionPolylines auf „true“ gesetzt ist.

routeToken

string

Nur Ausgabe. Ein undurchsichtiges 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 ungleich null vorliegt.

Die Lasten während des ersten Übergangs sind die Startlasten 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 handelte.

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.

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 die zulässige Entfernung ü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, ist auch 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, ist auch 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, ist auch dieses Feld nicht festgelegt.

maxLoad

number

Das maximale Verhältnis zwischen allen Arten von [AggregatedMetrics.max_load][] und dem jeweiligen 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.