車輛路線可沿著時間軸分解,如下所示 (假設有 n 次拜訪):
| | | | | 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
請注意,我們區分以下項目:
- 「準時事件」,例如車輛的開始和結束時間,以及每次拜訪的開始和結束時間 (即抵達和離開時間)。這些事件會在特定時間發生。
- 「時間間隔」,例如造訪本身,以及造訪之間的轉換。雖然時間間隔有時可能為零,也就是開始和結束時間相同,但通常會是正數。
不變量:
- 如有 n 次造訪,就會有 n+1 次轉換。
- 每次造訪前後都會有轉場效果 (索引相同和索引 + 1)。
- 車輛啟動後,一律會接著進行轉場 #0。
- 車輛尾端一律會標示為「轉場 #n」。
放大來看,Transition 和 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
最後,以下說明如何在轉場期間安排 TRAVEL、BREAKS、DELAY 和 WAIT。
- 不會重疊。
- DELAY 是獨一無二的,且必須是下一次造訪 (或車輛結束) 前的連續時間。因此,只要知道延遲時間長度,就能知道延遲的開始和結束時間。
- 中斷時間是連續且不重疊的時間範圍。回應會指定每個休息時間的開始時間和時長。
- 「TRAVEL」和「WAIT」是「可搶占」的:在這段轉換期間,這兩者可能會多次中斷。用戶端可以假設「TRAVEL」會「盡快」發生,而「WAIT」會填補剩餘時間。
複雜範例:
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 表示法 |
|---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
| 欄位 | |
|---|---|
vehicleIndex |
執行路線的車輛,由來源 |
vehicleLabel |
執行這條路線的車輛標籤,如果指定,則等於 |
vehicleStartTime |
車輛開始行駛路線的時間。 使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例: |
vehicleEndTime |
車輛完成路線的時間。 使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例: |
visits[] |
代表路線的造訪順序。visits[i] 是路線中的第 i 次造訪。如果這個欄位空白,表示車輛未使用。 |
transitions[] |
路徑的轉場效果排序清單。 |
hasTrafficInfeasibilities |
如果 由於交通狀況導致預估行程時間增加 |
routePolyline |
路線的編碼折線表示法。只有在 |
breaks[] |
這條路線的車輛排定休息時間。 |
metrics |
這條路線的時長、距離和負重指標。視情況而定, |
vehicleFullness |
實驗性:這個欄位的行為或存在狀態日後可能會變更。 |
routeCosts |
路線費用,依費用相關要求欄位細分。鍵是相對於輸入 OptimizeToursRequest 的 Proto 路徑,例如「model.shipments.pickups.cost」,值則是對應費用欄位產生的總費用,並在整條路線上匯總。換句話說,costs["model.shipments.pickups.cost"] 是路線上所有取貨費用的總和。模型中定義的所有費用都會在此詳細列出,但與 TransitionAttributes 相關的費用除外,這類費用自 2022 年 1 月起只會以匯總方式列出。 |
routeTotalCost |
路線的總費用,即費用地圖中所有費用的總和。 |
前往
在路線期間進行的拜訪。這項行程對應 Shipment 的取貨或送貨。
| JSON 表示法 |
|---|
{ "shipmentIndex": integer, "isPickup": boolean, "visitRequestIndex": integer, "startTime": string, "loadDemands": { string: { object ( |
| 欄位 | |
|---|---|
shipmentIndex |
來源 |
isPickup |
如果為 true,表示該趟行程是為了取貨 |
visitRequestIndex |
|
startTime |
開始拜訪的時間。請注意,車輛可能會提早抵達拜訪地點。時間與 使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例: |
loadDemands |
總訪客人數需求,也就是出貨量和訪客人數要求的總和 |
detour |
由於造訪地點前已拜訪其他地點,以及時間範圍可能導致等待時間,因此額外繞道時間。如果造訪地點是送貨地點,繞道時間會從對應的取貨地點計算,且等於: 否則,系統會根據車輛 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
shipmentLabel |
如果 |
visitLabel |
如果 |
visitType |
(選用步驟) 指定造訪類型。覆寫 |
injectedSolutionLocationToken |
代表造訪地點資訊的不透明權杖。 如果這個造訪的 實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request。 |
VisitType
指出造訪是取貨、送貨,還是造訪Stop。只有在啟用多模式最佳化時,才會使用造訪Stop。
| 列舉 | |
|---|---|
VISIT_TYPE_UNSPECIFIED |
未指定造訪類型。 |
PICKUP_SHIPMENT |
拜訪次數對應於取貨次數。 |
DELIVER_SHIPMENT |
訪視次數對應至出貨次數。 |
轉移
路徑上兩個事件之間的轉場效果。請參閱 ShipmentRoute 的說明。
如果車輛沒有 startLocation 和/或 endLocation,對應的行程指標為 0。
| JSON 表示法 |
|---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
| 欄位 | |
|---|---|
travelDuration |
這段期間的旅行時間。 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
travelDistanceMeters |
轉場期間的移動距離。 |
trafficInfoUnavailable |
透過 |
delayDuration |
套用至這項轉換的延遲時間總和。如有延遲,會在下一個事件 (到訪或車輛結束) 發生前 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
breakDuration |
這段轉場期間內發生的暫停時間總和 (如有)。每個休息時間的開始時間和時長詳細資料會儲存在 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
waitDuration |
這段期間的等待時間。等待時間對應的是閒置時間,不包含休息時間。另請注意,這段等待時間可能會分成幾個不連續的時間間隔。 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
totalDuration |
轉移作業的總時間長度 (僅供參考)。這等於:
時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
startTime |
這項轉換作業的開始時間。 使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例: |
routePolyline |
遷移期間所遵循路線的編碼折線表示法。只有在 |
routeToken |
僅供輸出。不透明權杖,可傳遞至 Navigation SDK,在導航期間重建路線,並在重新規劃路線時,遵守建立路線時的原始意圖。請將這個權杖視為不透明的 Blob。請勿比較不同要求中的值,因為即使服務傳回完全相同的路線,這個值也可能會變更。只有在 |
vehicleLoads |
在此轉換期間,車輛的負載量 (適用於出現在這輛車 第一次轉移期間的載重是車輛路線的起始載重。然後,每次拜訪後,系統會根據拜訪是取貨還是送貨,在下次轉移的載重中加入或扣除該次拜訪的 |
EncodedPolyline
折線的編碼表示法。如要進一步瞭解折線編碼,請參閱:https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding。
| JSON 表示法 |
|---|
{ "points": string } |
| 欄位 | |
|---|---|
points |
代表折線編碼點的字串。 |
休息時間
代表中斷執行的資料。
| JSON 表示法 |
|---|
{ "startTime": string, "duration": string } |
| 欄位 | |
|---|---|
startTime |
休息時間的開始時間。 使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例: |
duration |
休息時間長度。 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
VehicleFullness
VehicleFullness 是計算車輛裝載量的指標。每個 VehicleFullness 欄位的值介於 0 和 1 之間,計算方式為上限指標欄位 (例如 AggregatedMetrics.travel_distance_meters) 與相關車輛限制 (例如 Vehicle.route_distance_limit) 的比率 (如有)。否則,裝載量比率會維持未設定狀態。如果限制為 0,欄位會設為 1。注意:如果路線受到交通狀況影響而無法通行,部分原始裝載量比率可能會超過 1.0,例如車輛可能超過距離限制。在這些情況下,我們會將裝載量值設為 1.0。
| JSON 表示法 |
|---|
{ "maxFullness": number, "distance": number, "travelDuration": number, "activeDuration": number, "maxLoad": number, "activeSpan": number } |
| 欄位 | |
|---|---|
maxFullness |
這則訊息中所有其他欄位的最大值。 |
distance |
|
travelDuration |
[AggregatedMetrics.travel_duration_seconds][] 與 |
activeDuration |
[AggregatedMetrics.total_duration_seconds][] 與 |
maxLoad |
所有類型的 [AggregatedMetrics.max_load][] 和各自 |
activeSpan |
特定車輛的比率 (vehicleEndTime - vehicleStartTime) / (latestVehicleEndTime - earliestVehicleStartTime)。如果沒有分母,則會改用 ( |