車輛路線可沿著時間軸分解,如下所示 (假設有 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。
- 不會重疊。
- 延遲時間是唯一值,且必須在下次造訪 (或車輛結束) 之前,連續一段時間。因此,只要知道延遲時間長度,就能瞭解其開始和結束時間。
- BREAKS 是連續且不重疊的時間段落。回應會指定每個插播廣告的開始時間和時間長度。
- 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 ( |
欄位 | |
---|---|
vehicle |
執行路線的車輛,可透過來源 |
vehicle |
執行此路線的車輛標籤,等同於 |
vehicle |
車輛開始行駛的時間。 RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。例如 |
vehicle |
車輛完成路線的時間。 RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。例如 |
visits[] |
代表路線的排序造訪序列。visits[i] 是路線的第 i 次造訪。如果這個欄位為空白,系統會將車輛視為未使用。 |
transitions[] |
路線的轉場效果排序清單。 |
has |
如果
由於交通狀況,預估的到達時間 |
route |
路線的編碼折線表示法。只有在 |
breaks[] |
這條路線的車輛預定休息時間。 |
metrics |
此路線的時間長度、距離和載入指標。 |
route |
路線的費用,依費用相關要求欄位細分。鍵是相對於輸入 OptimizeToursRequest 的 proto 路徑,例如「model.shipments.pickups.cost」,而值則是相應費用欄位產生的總費用,並在整個路線上進行匯總。換句話說,costs["model.shipments.pickups.cost"] 是路線上所有提貨費用的總和。這裡會詳細列出模型中定義的所有費用,但 TransitionAttributes 相關費用除外,因為這類費用自 2022 年 1 月起只會以匯總方式呈報。 |
route |
路線的總費用。費用圖表中所有費用的總和。 |
前往
在路線中執行的造訪。這項拜訪對應至 Shipment
的取貨或送貨。
JSON 表示法 |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
欄位 | |
---|---|
shipment |
來源 |
is |
如果為 true,則表示該造訪對應至 |
visit |
|
start |
訪客開始造訪的時間。請注意,車輛可能會提早抵達造訪地點。時間與 RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。例如 |
load |
總訪客負載需求是出貨和訪客要求 |
detour |
由於在到達目的地前,路線上會經過其他貨件,因此產生額外的繞路時間,以及由於時間窗口而導致的潛在等待時間。如果是送貨行程,系統會從對應的接送行程計算繞路距離,計算方式如下:
否則,系統會根據車輛
時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
shipment |
如果 |
visit |
如果 |
轉移
在路徑上,兩個事件之間的轉換。請參閱 ShipmentRoute
的說明。
如果車輛沒有 startLocation
和/或 endLocation
,則對應的移動指標為 0。
JSON 表示法 |
---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
欄位 | |
---|---|
travel |
這段轉換期間的旅遊時間。 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
travel |
轉換期間移動的距離。 |
traffic |
當透過 |
delay |
套用至此轉場效果的延遲時間總和。如果有延遲時間,則會在下一個事件 (造訪或車輛結束) 之前的 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
break |
在這個轉換期間內發生的片段持續時間總和 (如有)。每個廣告插播的開始時間和持續時間詳細資料會儲存在 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
wait |
在轉換期間等待的時間。等待時間長度與閒置時間相對應,不包含休息時間。另請注意,這段等待時間可能會分為數個不連續的間隔。 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
total |
轉場效果的總時間長度 (僅供參考)。等於:
時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |
start |
此轉場效果的開始時間。 RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。例如 |
route |
轉換期間所遵循路線的編碼折線表示法。只有在 |
route |
僅供輸出。不透明權杖,可傳遞至 Navigation SDK,以便在導航期間重建路線,並在重新導航時,遵循建立路線時的原始意圖。將這個符記視為不透明 blob。請勿比較不同要求的值,因為即使服務傳回完全相同的路線,值也可能會有所變動。只有在 |
vehicle |
在這個轉換期間載入的車輛,每個類型都會顯示在該車輛的 在第一次轉換期間的負載,是車輛路線的起始負載。接著,在每次造訪後,系統會根據造訪是取件或送件,增加或減少造訪的 |
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 } |
欄位 | |
---|---|
start |
廣告插播的開始時間。 RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。例如 |
duration |
休息時間長度。 時間長度以秒為單位,最多可有 9 個小數位數,並應以「 |