車輛路線可沿著時間軸分解,如下所示 (假設有 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」是「可搶占」的:在這段轉換期間,這兩者可能會中斷數次。用戶端可以假設行程「盡快」開始,而「等待」則填滿剩餘時間。
(複雜) 範例:
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 的原型路徑,例如「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 |
如果 |
injectedSolutionLocationToken |
不透明權杖,代表造訪地點的相關資訊。 如果這個造訪的 實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request。 |
轉移
路線上兩個事件之間的轉換。請參閱 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)。如果沒有分母,則會改用 ( |