Package google.maps.routeoptimization.v1

索引

RouteOptimization

用於改善車輛導覽的服務。

特定類型的欄位有效性:

  • google.protobuf.Timestamp
    • 時間以 Unix 時間表示:自 1970-01-01T00:00:00+00:00 起算的秒數。
    • 秒必須是 [0, 253402300799],例如 [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00]。
    • nanos 必須設為未設定或設為 0。
  • google.protobuf.Duration
    • 秒必須是 [0, 253402300799],例如 [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00]。
    • nanos 必須設為未設定或設為 0。
  • google.type.LatLng
    • 緯度必須介於 [-90.0, 90.0] 之間。
    • 經度必須是 [-180.0, 180.0]。
    • 至少其中一個緯度和經度必須不是零。
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

針對一或多個 OptimizeToursRequest 訊息,以批次方式為車輛導覽進行最佳化。

這個方法屬於長時間執行的作業 (LRO)。系統會以使用者指定的格式,讀取/寫入/寫出 Cloud Storage 中的最佳化輸入內容 (OptimizeToursRequest 訊息) 和輸出內容 (OptimizeToursResponse 訊息)。和 OptimizeTours 方法一樣,每個 OptimizeToursRequest 都包含 ShipmentModel,並會傳回包含 ShipmentRouteOptimizeToursResponse,這些也是車輛能將整體成本降至最低的一組路線。

使用者可以輪詢 operations.get 來查看 LRO 的狀態:

如果 LRO 的 done 欄位為 false,表示系統仍在處理至少一項要求。其他要求可能已順利完成,且結果可在 GCS 中取得。

如果 LRO 的 done 欄位為 true,表示所有要求都已處理完畢。所有成功處理的要求,結果都會顯示在 GCS 中。如果要求失敗,GCS 就不會顯示其結果。如果已設定 LRO 的 error 欄位,表示其中包含其中一個失敗要求的錯誤。

授權範圍

需要下列 OAuth 範圍:

  • https://www.googleapis.com/auth/cloud-platform
身分與存取權管理權限

必須具備 parent 資源的下列 IAM 權限:

  • routeoptimization.operations.create

詳情請參閱身分與存取權管理說明文件

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

傳送包含 ShipmentModelOptimizeToursRequest,並傳回內含 ShipmentRouteOptimizeToursResponse,也就是車輛將總成本降至最低的一組路線。

ShipmentModel 模型主要由需要執行的 Shipment 和可用於傳輸 ShipmentVehicle 組成。ShipmentRoute 會將 Shipment 指派給 Vehicle。具體來說,這些物件會為每個車輛指派一系列的 Visit,而 Visit 對應 VisitRequest (為 Shipment 的自取或外送服務)。

目標是將 ShipmentRoute 指派給 Vehicle,藉此盡可能降低 ShipmentModel 中定義多個元件的總費用。

授權範圍

需要下列 OAuth 範圍:

  • https://www.googleapis.com/auth/cloud-platform
身分與存取權管理權限

必須具備 parent 資源的下列 IAM 權限:

  • routeoptimization.locations.use

詳情請參閱身分與存取權管理說明文件

AggregatedMetrics

ShipmentRoute (針對所有 Transition 和/或 Visit (針對所有 ShipmentRoute 元素) 的 OptimizeToursResponse 匯總指標。

欄位
performed_shipment_count

int32

執行的出貨數量。請注意,自取和外送服務組合只會計算一次。

travel_duration

Duration

路線或解決方案的總交通時間。

wait_duration

Duration

路線或解決方案的總等待時間長度。

delay_duration

Duration

路線或解決方案的總延遲時間。

break_duration

Duration

路線或解決方案的總中斷時長。

visit_duration

Duration

路線或解決方案的總造訪時間長度。

total_duration

Duration

總時間長度應該等於上述所有時間長度的總和。針對路徑,這個符號也對應下列項目:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

路線或解決方案的總移動距離。

max_loads

map<string, VehicleLoad>

整條路線 (回應解決方案) 上達到的最大負載量,是這個路線 (回應解決方案) 上每個數量的負載上限,計算依據為所有 Transition.vehicle_loads (回應)ShipmentRoute.metrics.max_loads

BatchOptimizeToursMetadata

這個類型沒有任何欄位。

BatchOptimizeToursRequest 呼叫的作業中繼資料。

BatchOptimizeToursRequest

要求以非同步作業的方式批次最佳化導覽。每個輸入檔案都應包含一個 OptimizeToursRequest,而每個輸出檔案都會包含一個 OptimizeToursResponse。這項要求包含讀取/寫入及剖析檔案的資訊。所有輸入和輸出檔案都必須位於同一個專案中。

欄位
parent

string

必要欄位。指定專案和位置即可撥打電話。

格式:* projects/{project-id} * projects/{project-id}/locations/{location-id}

如未指定位置,系統會自動選擇區域。

model_configs[]

AsyncModelConfig

必要欄位。每個購買模型的輸入/輸出資訊,例如檔案路徑和資料格式。

AsyncModelConfig

以非同步方式解決一個最佳化模型的資訊。

欄位
display_name

string

選用設定。使用者定義的模型名稱;使用者可以透過這個名稱當做別名,持續追蹤模型。

input_config

InputConfig

必要欄位。輸入模型的相關資訊。

output_config

OutputConfig

必要欄位。所需的輸出位置資訊。

BatchOptimizeToursResponse

這個類型沒有任何欄位。

BatchOptimizeToursRequest 的回應。作業完成後,這個訂閱項目會在「長期執行的作業」中傳回。

BreakRule

產生車輛休息時間 (例如午休時間) 的規則。休息是指車輛在目前位置保持閒置狀態的連續期間,無法進行任何巡訪。下列情形可能會發生中斷:

  • 在兩次造訪之間的轉換時間 (包括造訪前或造訪後的時間,但不包括造訪期間),在這種情況下,系統會延長造訪之間的對應轉換時間,
  • 或是車輛啟動時 (車輛不得在休息中發動),在這種情況下,並不會影響車輛開始時間。
  • 或在車輛結束 (坐下與車輛結束時間) 後。
欄位
break_requests[]

BreakRequest

廣告插播序列。請參閱 BreakRequest 訊息。

frequency_constraints[]

FrequencyConstraint

可能會套用多個 FrequencyConstraint。這些值必須符合此 BreakRuleBreakRequest。詳情請參閱 FrequencyConstraint

BreakRequest

您必須事先得知每輛車的休息順序 (即數量和順序)。重複的 BreakRequest 會定義該序列的出現順序。客戶的時間範圍 (earliest_start_time / latest_start_time) 可能會重疊,但必須與訂單相容 (已勾選)。

欄位
earliest_start_time

Timestamp

必要欄位。廣告插播開始時的下限 (含)。

latest_start_time

Timestamp

必要欄位。廣告插播開始時的限制上限 (含)。

min_duration

Duration

必要欄位。插播時間長度下限。必須為正數。

FrequencyConstraint

其中一種做法是強制執行最小的廣告插播頻率 (例如「每 12 小時至少要有 1 小時」),限制上述廣告插播的頻率和時間長度。假設這個值可解讀為「在 12 小時的任何滑動時間範圍內,至少要有一個廣告插播時段至少一小時」,則範例會轉譯為下列 FrequencyConstraint

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

除了 BreakRequest 中已指定的時間區間和最短時間長度外,解決方案中的插播時間和插播時間長度都會遵循所有這類限制。

FrequencyConstraint 可能在練習時適用於不連續的休息時間。舉例來說,下列排程會套用「每 12 小時 1 小時」範例:

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
欄位
min_break_duration

Duration

必要欄位。這項限制的最短廣告插播長度。正數。請參閱 FrequencyConstraint 的說明。

max_inter_break_duration

Duration

必要欄位。路線中任何時間間隔的上限,至少不包含部分 duration >= min_break_duration 的中斷。必須為正數。

DataFormat

輸入和輸出檔案的資料格式。

列舉
DATA_FORMAT_UNSPECIFIED 值無效,格式不得為 UNSPECIFIED。
JSON JavaScript 物件標記法。
PROTO_TEXT 通訊協定緩衝區文字格式。請參閱 https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

用於定義可行駛距離上限。挑戰可以是困難或輕微。

如果已定義軟性限制,則必須定義 soft_max_meterscost_per_kilometer_above_soft_max,且不得為負數。

欄位
max_meters

int64

硬性限制,限制距離不得超過 max_meters。限制值不得為負數。

soft_max_meters

int64

軟性限制不會強制執行最大距離限制,但如果違反限制,則會產生費用,並與模型中定義的其他費用相加,單位相同。

定義的 soft_max_meters 必須小於 max_meters,且不得為負數。

cost_per_kilometer_below_soft_max

double

每公里產生的費用,最高可達 soft_max_meters,以下公式為:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

route_distance_limit 不支援這項費用。

cost_per_kilometer_above_soft_max

double

如果距離超過 soft_max_meters 限制,則每公里產生的費用。如果距離小於限制,額外費用會是 0,否則用於計算費用的公式如下:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

費用必須為正數。

GcsDestination

要寫入輸出檔案的 Google Cloud Storage 位置。

欄位
uri

string

必要欄位。Google Cloud Storage URI。

GcsSource

要讀取輸入檔案的 Google Cloud Storage 位置。

欄位
uri

string

必要欄位。Google Cloud Storage 物件的 URI,格式為 gs://bucket/path/to/object

InjectedSolutionConstraint

已在請求中插入的解決方案,包括哪些造訪設有限制以及限制方式。

欄位
routes[]

ShipmentRoute

插入解決方案的路徑。原始解決方案可能會省略部分路線。路線和略過運送作業必須符合 injected_first_solution_routes 所列的基本有效性假設。

skipped_shipments[]

SkippedShipment

略過解決方案的出貨作業。原始解決方案可能省略部分程式碼。請參閱 routes 欄位。

constraint_relaxations[]

ConstraintRelaxation

針對零或多個車輛群組,指定放寬限制條件的時機和程度。如果這個欄位空白,所有非空白的車輛路線都會完全受到限制。

ConstraintRelaxation

針對一組車輛,指定特定門檻限制的行駛限制和指示等級。skipped_shipment 欄位中列出的運送作業會遭到略過,也就是無法執行。

欄位
relaxations[]

Relaxation

所有造訪限制放寬項目,會套用至 vehicle_indices 中含有車輛的路線造訪。

vehicle_indices[]

int32

指定要套用造訪限制 relaxations 的車輛索引。如果為空白,系統會視為預設值,而 relaxations 適用於未在其他 constraint_relaxations 中指定的所有車輛。最多可以有一個預設值,也就是最多一個限制放寬欄位可以為空白 vehicle_indices。一個車輛指數只能列出一次,即使是在數個 constraint_relaxations 內也一樣。

如果 interpret_injected_solutions_using_labels 為 true,車輛索引會與 ShipmentRoute.vehicle_index 對應 (請參閱 fields 註解)。

休閒場所

如果 relaxations 空白,則 routes 上所有造訪的開始時間和序列都會完全受到限制,這些路線也無法插入或新增造訪記錄。此外,routes 中的車輛開始和結束時間也相當受限,除非車輛是空的 (也就是沒有行駛方向,且模型中的 used_if_route_is_empty 設為 false)。

relaxations(i).level 會指定套用至滿足 #j 的造訪限制放寬等級:

  • route.visits(j).start_time >= relaxations(i).threshold_time
  • j + 1 >= relaxations(i).threshold_visit_count

同樣地,如果符合下列條件,車輛起點會放寬至 relaxations(i).level

  • vehicle_start_time >= relaxations(i).threshold_time
  • 如果滿足以下條件,relaxations(i).threshold_visit_count == 0 和車輛終點會由 relaxations(i).level 放寬:
  • vehicle_end_time >= relaxations(i).threshold_time
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

如要在造訪符合 threshold_visit_count 時套用放寬層級,或是 threshold_time 新增兩個具有相同 levelrelaxations:一個只設定 threshold_visit_count,另一個只設定 threshold_time。如果一次造訪符合多個 relaxations 的條件,系統會套用最放鬆的層級。因此,從車輛開始行駛到行經路線,到車輛結束,放鬆等級就會變得更加放鬆:也就是說,隨著路線的進展,放鬆等級不會下降。

如果路線造訪的時間和順序不符合任何 relaxations 的門檻條件,就會完全受到限制,沒有任何造訪記錄。此外,如果車輛開始或結束不符合任何放鬆條件,則系統會固定進行該時間,除非車輛無內容。

欄位
level

Level

限制條件的放寬層級:適用於 threshold_time 或之後,且至少符合 threshold_visit_count 的條件。

threshold_time

Timestamp

可套用 level 放鬆的時間或之後的時間。

threshold_visit_count

int32

可以套用放寬 level 或之後的造訪次數。如果 threshold_visit_count 為 0 (或未設定),便可在車輛啟動時直接套用 level

如果為 route.visits_size() + 1,則 level 只能套用至車輛端。如果時間超過 route.visits_size() + 1,則不會為該路線套用 level

層級

表示不同的造訪限制放寬等級,適用於造訪,以及符合門檻條件時會遵循的限制層級。

下列列舉的順序是依放鬆程度排序。

列舉
LEVEL_UNSPECIFIED

隱含預設的放寬等級:沒有限制,也就是說所有造訪都完全受限。

這個值不得在 level 中明確使用。

RELAX_VISIT_TIMES_AFTER_THRESHOLD 系統會放寬造訪開始時間和車輛開始/結束時間,但每個造訪仍會綁定至同一輛車輛,且必須遵循造訪順序:在兩次造訪之間或之前,不得插入其他造訪。
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD RELAX_VISIT_TIMES_AFTER_THRESHOLD 相同,但訪問順序也較為寬鬆:訪問只能由此車輛執行,但可能不會執行。
RELAX_ALL_AFTER_THRESHOLD RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD 相同,但車輛也已放寬:在門檻時間點或之後,訪客可完全免費,且可能不會執行。

InputConfig

指定 [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours] 的輸入內容。

欄位
data_format

DataFormat

必要欄位。輸入的資料格式。

聯集欄位 source。必要欄位。source 只能是下列其中一項:
gcs_source

GcsSource

Google Cloud Storage 位置。必須是單一物件 (檔案)。

位置

包含位置 (地理位置和選用標題)。

欄位
lat_lng

LatLng

路線控點的地理座標。

heading

int32

與車流方向相關聯的指南針方向。這個值是用於指定道路的邊,供上車和下車地點使用。標題值可以介於 0 到 360 之間,其中 0 指定代表往北的方向、90 指定往東的方向等。

OptimizeToursRequest

提出要求至導覽最佳化解題工具,該解析器會定義要解決的運送模型和最佳化參數。

欄位
parent

string

必要欄位。指定專案或位置即可撥打電話。

格式:* projects/{project-id} * projects/{project-id}/locations/{location-id}

如未指定位置,系統會自動選擇區域。

timeout

Duration

如果設定了逾時,伺服器會在逾時期限或同步要求的伺服器期限已過 (以較早者為準) 之前傳回回應。

如果是非同步要求,伺服器會在逾時屆滿前 (如有) 產生解決方案。

model

ShipmentModel

要解決的運送模型。

solving_mode

SolvingMode

根據預設,解析模式為 DEFAULT_SOLVE (0)。

search_mode

SearchMode

用於解決要求的搜尋模式。

injected_first_solution_routes[]

ShipmentRoute

引導最佳化演算法,找出與先前解決方案相似的第一個解決方案。

建構第一個解決方案時,模型會受到限制。任何未依路徑執行的貨物運送,都會在第一個解決方案中默示略過,但也可能會在連續的解決方案中執行。

解決方案必須滿足一些基本的有效性假設:

  • 對於所有路徑,vehicle_index必須位於指定範圍內,且不能複製。
  • 對於所有造訪,shipment_indexvisit_request_index 都必須在範圍內。
  • 一筆出貨只能參照一條路徑。
  • 取貨/送貨運送服務的取貨作業必須在送貨前完成。
  • 同一運送的貨品只能有一個取貨替代服務或送貨方式。
  • 對於所有路線,時間都會增加 (也就是vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time)。
  • 您只能在允許的車輛上進行出貨。如果 Shipment.allowed_vehicle_indices 為空,或 Shipment.allowed_vehicle_indices 包含車輛的 vehicle_index,則允許刊登車輛。

如果插入的解決方案不可行,則不一定會傳回驗證錯誤,系統可能會改為傳回不可行的錯誤。

injected_solution_constraint

InjectedSolutionConstraint

限制最佳化演算法,找出類似先前的解決方案的最終解決方案。例如,此標記可用於凍結已完成或完成但不能修改的路徑部分。

如果插入的解決方案不可行,則不一定會傳回驗證錯誤,系統可能會改為傳回不可行的錯誤。

refresh_details_routes[]

ShipmentRoute

如果留空,系統就會重新整理指定路線,而不會修改行程的基礎造訪順序或交通時間:系統只會更新其他詳細資訊。這麼做無法解決模型問題,

截至 2020 年 11 月,這個方法只會填入非空路線的多邊形,且需要 populate_polylines 為 true。

傳入路徑的 route_polyline 欄位可能與路徑 transitions 不一致。

這個欄位不得與 injected_first_solution_routesinjected_solution_constraint 搭配使用。

Shipment.ignoreVehicle.ignore 對行為沒有任何影響。無論是否忽略相關的貨運或車輛,所有非空白路線的造訪點之間,仍會填入折線。

interpret_injected_solutions_using_labels

bool

如果是 true:

這項解讀方式適用於 injected_first_solution_routesinjected_solution_constraintrefresh_details_routes 欄位。如果要求中的運送或車輛索引在解決方案建立後有所變更,可以使用這項屬性,可能是因為運輸或車輛從要求中移除或新增至要求中。

如為 true,下列類別中的標籤最多只能出現一次:

如果插入的解決方案中的 vehicle_label 不符合要求車輛,系統會將對應的路線和造訪資料從解決方案中移除。如果插入解決方案中的 shipment_label 不符合要求運送要求,系統會將相應的造訪動作從解決方案中移除。如果插入解決方案中的 SkippedShipment.label 不符合要求運送要求,系統會將 SkippedShipment 從解決方案中移除。

從插入解決方案中移除路徑造訪或整條路線,可能會影響隱含的限制,進而影響解決方案、驗證錯誤或無法運作。

注意:呼叫端必須確保每個 Vehicle.label (因應Shipment.label) 可明確識別兩個相關要求中使用的車輛 (彈性運送) 實體:過去產生插入解決方案所用 OptimizeToursResponse 的要求,以及目前包含插入解決方案的要求。上述獨特性檢查不足以保證這項規定。

consider_road_traffic

bool

計算 ShipmentRoute 欄位 Transition.travel_durationVisit.start_timevehicle_end_time 時,請將流量估算納入考量;設定 ShipmentRoute.has_traffic_infeasibilities 欄位,以及計算 OptimizeToursResponse.total_cost 欄位。

populate_polylines

bool

如果為 true,回應 ShipmentRoute 會填入多邊形。

populate_transition_polylines

bool

如果為 true,則會在回應 ShipmentRoute.transitions 中填入折線。

allow_large_deadline_despite_interruption_risk

bool

如果設定了這個項目,該要求的期限 (請參閱 https://grpc.io/blog/deadlines) 最多可以有 60 分鐘。否則,最長期限為 30 分鐘。請注意,長時間的要求具有極大 (但仍然很小) 的干擾風險。

use_geodesic_distances

bool

如果設為 true,系統會使用測地線距離 (而非 Google 地圖距離) 計算移動距離,並使用 geodesic_meters_per_second 定義的測速距離以測地線距離計算行程時間。

label

string

可能會用來識別這項要求的標籤,並回報於 OptimizeToursResponse.request_label 中。

geodesic_meters_per_second

double

如果 use_geodesic_distances 為 true,就必須設定這個欄位,並定義計算交通時間時要套用的速度。這個值必須至少為 1.0 公尺/秒。

max_validation_errors

int32

截斷傳回的驗證錯誤數量。這些錯誤通常會以 BadRequest 錯誤詳細資料的形式附加至 INVALID_src 錯誤酬載 (https://cloud.google.com/apis/design/errors#error_details),除非 Resolve_mode=VALIDATE_ONLY:請參閱 OptimizeToursResponse.validation_errors 欄位。預設值為 100,上限是 10,000。

SearchMode

定義搜尋行為的模式,進行延遲與解決方案品質抵銷。在所有模式中,全域要求期限都是強制執行的。

列舉
SEARCH_MODE_UNSPECIFIED 未指定的搜尋模式,相當於 RETURN_FAST
RETURN_FAST 找到第一個可行解決方案後,請停止搜尋。
CONSUME_ALL_AVAILABLE_TIME 善用所有可用時間,尋求更有效的解決方案。

SolvingMode

定義解題工具應如何處理要求。在 VALIDATE_ONLY 以外的所有模式中,如果要求無效,您會收到 INVALID_REQUEST 錯誤。如需限制傳回的錯誤數量,請參閱 max_validation_errors

列舉
DEFAULT_SOLVE 解開模型。如要發出警告,請前往 [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors]。
VALIDATE_ONLY 只驗證模型,但不解決模型:盡可能填入 OptimizeToursResponse.validation_errors
DETECT_SOME_INFEASIBLE_SHIPMENTS

只填入 OptimizeToursResponse.validation_errorsOptimizeToursResponse.skipped_shipments,實際無法解決其餘要求 (回應中未設定 statusroutes)。如果偵測到 injected_solution_constraint 路線的不動情況,這些路線就會填入 OptimizeToursResponse.validation_errors 欄位,OptimizeToursResponse.skipped_shipments 則留空。

重要事項:部分無法出貨的貨物只會退回到這裡,但只會退回在預先處理期間偵測到無法交貨的商品。

OptimizeToursResponse

解決導覽最佳化問題後,系統會回應,其中包含每輛車的路線、遭略過的貨物,以及解決方案的總費用。

欄位
routes[]

ShipmentRoute

為每輛車輛計算的路線;第 i 條路線對應至模型中的第 i 輛車輛。

request_label

string

如果要求中已指定標籤,則 OptimizeToursRequest.label 的副本。

skipped_shipments[]

SkippedShipment

略過所有出貨的清單。

validation_errors[]

OptimizeToursValidationError

列出可獨立偵測的所有驗證錯誤。查看「多個錯誤」OptimizeToursValidationError 訊息的說明。在此情況下,當 solving_modeDEFAULT_SOLVE 時將含有警告,而非錯誤。

metrics

Metrics

這項解決方案的持續時間、距離和用量指標。

指標

所有路徑的匯總整體指標。

欄位
aggregated_route_metrics

AggregatedMetrics

按照路徑匯總。每個指標都是名稱所有 ShipmentRoute.metrics 欄位的總和 (或負載上限)。

skipped_mandatory_shipment_count

int32

略過的強制貨件數量。

used_vehicle_count

int32

使用的車輛數量。注意:如果車輛路徑為空白,且 Vehicle.used_if_route_is_empty 為 true,系統會視為車輛使用。

earliest_vehicle_start_time

Timestamp

二手車的最早開始時間,計算依據為 ShipmentRoute.vehicle_start_time 的所有二手車輛的最小值。

latest_vehicle_end_time

Timestamp

二手車的最新結束時間,計算方式為 ShipmentRoute.vehicle_end_time 中所有二手車的最大值。

costs

map<string, double>

解決方案的費用,按費用相關要求欄位細分。這些鍵是 proto 路徑,相對於輸入的 OptimizeToursRequest,例如:「model.shipments.pickups.cost」和「模型」的值則為對應費用欄位產生的總費用,並匯總為整個解決方案。換句話說,成本 ["model.shipments.pickups.cost"] 是解決方案中所有取貨費用的總和。這裡詳細列出模型中定義的所有費用,但 TransitionAttributes 的相關費用除外。這些費用只以 2022 年 1 月的匯總方式呈現。

total_cost

double

解決方案的總費用。費用對應中所有值的總和。

OptimizeToursValidationError

說明驗證 OptimizeToursRequest 時出現的錯誤或警告。

欄位
code

int32

驗證錯誤是由一律存在的組合 (codedisplay_name) 定義。

其他欄位 (請見下方) 提供更多與錯誤相關的資訊。

MULTIPLE ERRORS:如果發生多項錯誤,驗證程序會嘗試輸出其中幾項。與編譯器類似,這個程序不完美。部分驗證錯誤屬於「嚴重」錯誤,也就是說,這類錯誤會停止整個驗證程序。以上就是 display_name="UNSPECIFIED" 錯誤等等。有些錯誤可能會導致驗證程序略過其他錯誤。

STabilitycodedisplay_name 應非常穩定。不過,新的代碼和顯示名稱可能會隨著時間而出現,這可能導致指定的 (無效) 要求產生不同的組合 (codedisplay_name),因為新的錯誤會隱藏舊一組錯誤 (請參閱「MULTIPLE ERRORS」)。

REFERENCE:所有 (代碼、名稱) 組合的清單:

  • UNSPECIFIED = 0;
  • VALIDATION_TIMEOUT_ERROR = 10;無法在期限內完成驗證。
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_second_TOO_SMALL = 1205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ENABLED_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004 年;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_AFTER_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2819;
    • TIME_WINDOW_SOFT_END_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2820;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3000;
    • TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_實際連結網址 = 3006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
    • DISTANCE_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3603;
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3803;
    • DURATION_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOUR = 3807;
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811;
    • DURATION_LIMIT_DIFF_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_MINIMUM_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
    • PRECEDENCE_RULE_MISSING_FIRST_INDEX = 4600;
    • PRECEDENCE_RULE_MISSING_second_INDEX = 4601;
    • PRECEDENCE_RULE_FIRST_INDEX_OUT_OF_BOUNDS = 4602;
    • PRECEDENCE_RULE_second_INDEX_OUT_OF_BOUNDS = 4603;
    • PRECEDENCE_RULE_DUPLICATE_INDEX = 4604;
    • PRECEDENCE_RULE_INEXISTENT_FIRST_VISIT_REQUEST = 4605;
    • PRECEDENCE_RULE_INEXISTENT_second_VISIT_REQUEST = 4606;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804;= 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
    • BREAK_REQUEST_LATEST_END_TIME_AFTER_GLOBAL_END_TIME = 4807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
  • 警告 = 9;
    • WARNING_INJECTED_FIRST_SOLUTION = 90;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_SHIPMENTS_REMOVED = 9000;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 9001;
display_name

string

錯誤顯示名稱。

fields[]

FieldReference

錯誤內容可能包含 0、1 (大多數時間) 或多個欄位。舉例來說,如要參照車輛 #4 和貨件 #2 的首次取件,可以執行以下操作:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

不過請注意,特定錯誤代碼不會變更 fields 的基數。

error_message

string

使用者容易理解的錯誤說明字串。codeerror_message (代碼 !=「UNSPECIFIED」) 之間有 1:1 的對應關係。

STABILITY:不穩定:與指定 code 相關聯的錯誤訊息可能會隨時間改變 (希望釐清情況)。請改用 display_namecode

offending_values

string

可能包含欄位的值。您不一定每次都能使用這個代碼。因此,建議您不要仰賴此演算法,並僅用於手動模型偵錯。

欄位參照

指定驗證錯誤的內容。FieldReference 一律會參照此檔案中的特定欄位,並遵循相同的階層結構。舉例來說,您可以透過以下程式碼,指定車輛 #5 的 start_time_windows 元素 #2:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

但我們會省略頂層實體 (例如 OptimizeToursRequestShipmentModel),避免訊息聚集。

欄位
name

string

欄位名稱,例如「車輛」。

sub_field

FieldReference

視需要以遞迴方式建立子欄位。

聯集欄位 index_or_key

index_or_key 只能是下列其中一項:

index

int32

欄位的索引 (如果重複)。

key

string

如果欄位是對應,則傳回 鍵。

OutputConfig

指定 [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours] 結果的目的地。

欄位
data_format

DataFormat

必要欄位。輸出資料格式。

聯集欄位 destination。必要欄位。destination 只能是下列其中一項:
gcs_destination

GcsDestination

要寫入輸出內容的 Google Cloud Storage 位置。

RouteModifiers

封裝計算車輛路線時要滿足的一組選用條件。這與 Google 地圖平台 Routes Preferred API 中的 RouteModifiers 類似。請參閱:https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers

欄位
avoid_tolls

bool

指定是否要在合理情況下避開收費道路。系統會優先遵循不含收費路段的路線。僅適用於機動交通方式。

avoid_highways

bool

指定是否在合理情況下避開高速公路。針對不含高速公路的路線,我們會優先處理。僅適用於機動交通方式。

avoid_ferries

bool

指定是否要在合理情況下避開渡輪。針對不含渡輪的行經路線,系統會優先採用。僅適用於機動交通方式。

avoid_indoor

bool

選用設定。指定是否要避免在合理範圍內導航。系統會優先採用不含室內導航的路線。僅適用於 WALKING 行程模式。

運送地址

單一商品的運送作業,從其中一個提貨地點到其中一個送達地點。每輛車都必須前往其中一個上車地點 (並視情況調降空間) 至貨運地點,才能順利將貨物視為出貨。

欄位
display_name

string

使用者定義的運送顯示名稱。長度上限為 63 個半形字元,可以使用 UTF-8 字元。

pickups[]

VisitRequest

與出貨相關的取貨替代選項組合。如未指定,車輛只需造訪與配送項目對應的地點。

deliveries[]

VisitRequest

與出貨相關的提交替代方案。如未指定,車輛只需造訪與上車地點對應的地點。

load_demands

map<string, Load>

貨物負載 (例如重量、體積、棧板數量等)。圖中的鍵應為用來說明對應負載類型的 ID,最好也包含單位。例如:「weight_kg」、「volume_gallons」、「pallet_count」等。如果指定鍵未顯示在地圖上,則相應的載入項目會視為空值。

allowed_vehicle_indices[]

int32

可能提供這項運送作業的車輛組合。如果留空,所有車輛都可以執行這項作業。車輛會以 ShipmentModelvehicles 清單中的索引提供。

costs_per_vehicle[]

double

指定每輛車出貨時的運費。指定的變數必須包含 EITHER:

  • 等同 costs_per_vehicle_indices 的元素數量。costs_per_vehicle[i] 對應模型的車輛 costs_per_vehicle_indices[i]
  • 與模型中車輛數量相同的元素數量i-th 元素會對應至模型的車輛 #i。

這些費用的單位必須與「penalty_cost」相同,且不得為負數。如果沒有這類費用,請將這個欄位留白。

costs_per_vehicle_indices[]

int32

costs_per_vehicle 適用的車輛索引。如果為非空白,則元素數量必須與 costs_per_vehicle 相同。車輛索引只能指定一次。如果從costs_per_vehicle_indices中排除車輛,費用為零。

pickup_to_delivery_absolute_detour_limit

Duration

指定相較於從上車地點到送達地點的最短路徑,最多可繞行的絕對時間。若有指定,其必須為非負數,且運送必須包含至少一項取貨和送貨服務。

舉例來說,如果從選定的取貨替代服務直接改為配送至所選配送方式,最早需要多久時間才能處理完畢。接著設定 pickup_to_delivery_absolute_detour_limit 會強制執行:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

如果同一運送屬性同時指定了相對和絕對限制,則每個取貨/外送組合使用的限制越多。截至 2017 年 10 月 10 日為止,只有交通時間不需乘車時,系統才會支援繞道時間。

pickup_to_delivery_time_limit

Duration

指定從開始取貨到出貨到貨之間的最長時間。若有指定,其必須為非負數,且運送必須包含至少一項取貨和送貨服務。這不會影響取貨方式,取決於你選擇的取貨和外送替代地點,以及車輛速度。您可以與最大繞道限制一起指定這項設定:解決方案將遵循兩種規格。

shipment_type

string

指定「類型」的非空白字串。這項功能可用於定義 shipment_types 之間的不相容或需求 (請參閱 ShipmentModel 中的 shipment_type_incompatibilitiesshipment_type_requirements)。

與單次造訪指定的 visit_types 不同:同一運送的所有取貨/配送都共用相同的 shipment_type

label

string

指定此貨品的標籤。這個標籤會在對應 ShipmentRoute.Visitshipment_label 回應中回報。

ignore

bool

如果為 true,請略過此出貨作業,但不套用 penalty_cost

如果模型中沒有任何 shipment_type_requirements,則忽略運送會導致驗證錯誤。

我們允許忽略在 injected_first_solution_routesinjected_solution_constraint 執行的運送;解析器會從作業路徑中移除相關的上車/外送造訪記錄。如果 precedence_rules 參照遭到忽略的運送,也會遭到忽略。

penalty_cost

double

如果貨運未完成,則罰金會計入路線總額。如果消費者造訪指定的取件和外送替代品,系統會將出貨視為已完成。費用可用與模型中所有其他費用相關欄位相同的單位表示,且必須為正數。

重要事項:如未指明這項處分,將視為無限期,也就是必須完成出貨。

pickup_to_delivery_relative_detour_limit

double

指定從自取到貨品送達的最短路徑出發時間的最長相對繞路時間。若有指定,其必須為非負數,且運送必須包含至少一項取貨和送貨服務。

舉例來說,如果從選定的取貨替代服務直接改為配送至所選配送方式,最早需要多久時間才能處理完畢。接著設定 pickup_to_delivery_relative_detour_limit 會強制執行:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

如果同一運送屬性同時指定了相對和絕對限制,則每個取貨/外送組合使用的限制越多。截至 2017 年 10 月 10 日為止,只有交通時間不需乘車時,系統才會支援繞道時間。

載入

進行訪問時,如果是接送,系統可能會在車輛負載中加上預先定義的金額;如果是送貨,則會從車輛負載中扣除該金額。此訊息定義了這類金額。詳情請參閱《load_demands》。

欄位
amount

int64

執行相應造訪記錄的車輛負載量有所不同。由於為整數,建議使用者選擇適當的單位,以免喪失精確度。必須大於 0。

VisitRequest

可透過車輛完成的訪問要求:包含一個或兩個地理位置 (請參閱下方說明)、以時間窗口表示的開始和結束時間,以及服務時間長度 (車輛抵達取貨或送貨地點所需的時間)。

欄位
arrival_location

LatLng

執行這個 VisitRequest 時,車輛抵達的地理位置。如果運送模型包含持續時間距離矩陣,則不得指定 arrival_location

arrival_waypoint

Waypoint

執行這個 VisitRequest 時,車輛抵達的路線點。如果運送模型包含持續時間距離矩陣,則不得指定 arrival_waypoint

departure_location

LatLng

完成這個 VisitRequest 後車輛出發的地理位置。如果與 arrival_location 相同,則可省略。如果運送模型包含持續時間距離矩陣,則不得指定 departure_location

departure_waypoint

Waypoint

完成這個 VisitRequest 後車輛出發的路線點。如果與 arrival_waypoint 相同,可以省略。如果運送模型包含持續時間距離矩陣,則不得指定 departure_waypoint

tags[]

string

指定造訪要求中附加的標記。字串不得留空或重複。

time_windows[]

TimeWindow

限製造訪時的抵達時間的時間範圍。請注意,車輛可能會於抵達時間之外出發,也就是說,抵達時間 + 所需時間不一定要在時間範圍之內。如果車輛在 TimeWindow.start_time 之前抵達,乘客可能會等待一段時間。

缺少 TimeWindow 表示車輛可隨時執行這項造訪。

時段不得不連貫,也就是說,時間範圍不得與其他時段重疊或相鄰,而且必須依遞增順序排列。

只有單一時段才能設定 cost_per_hour_after_soft_end_timesoft_end_time

duration

Duration

造訪所需時間,例如車輛抵達和離開之間經過的時間 (可計入可能的等待時間;請參閱 time_windows)。

cost

double

在車輛路線上處理這項拜訪要求的費用。這可以用來針對每次取貨或配送的替代品項支付不同的費用。這個費用的單位必須與「Shipment.penalty_cost」相同,且不得為負數。

load_demands

map<string, Load>

這項造訪要求的載入要求。這與 Shipment.load_demands 欄位類似,差別在於其只會套用至這個 VisitRequest,而非整個 Shipment。這裡列出的請求會加入 Shipment.load_demands 中列出的請求。

visit_types[]

string

指定造訪的類型,這可分配車輛完成這項造訪所需的時間 (請參閱 Vehicle.extra_visit_duration_for_visit_type)。

一個類型只能出現一次。

label

string

指定這個「VisitRequest」的標籤。在回覆中,這個標籤會在對應的 ShipmentRoute.Visit 中回報為 visit_label

ShipmentModel

運送模型包含一組必須由一組車輛行駛的貨運,並盡可能降低整體成本,亦即以下各項的總和:

  • 車輛路線的費用 (所有車輛的總時間費用、每趟行程費用和固定費用總和)。
  • 導致貨物延遲情形
  • 運送作業的全球持續時間成本
欄位
shipments[]

Shipment

必須在模型中執行的一組貨運組合。

vehicles[]

Vehicle

可用來進行造訪的車輛組合。

global_start_time

Timestamp

模型的全球開始時間和結束時間:超出範圍的時間一律視為有效。

模型的時間範圍必須少於一年,即 global_end_timeglobal_start_time 彼此不得超過 31536000 秒。

使用 cost_per_*hour 欄位時,建議您將這個時間範圍設為較短的間隔,藉此提升成效 (例如,如果為一天建立作業,請將全域時間限制設為該日)。如未設定,1970 年 1 月 1 日 00:00:00 (世界標準時間) 將預設為 0,nanos: 0。

global_end_time

Timestamp

如未設定,1971 年 1 月 1 日世界標準時間 00:00:00 (也就是秒數:31536000,nanos: 0) 會做為預設值。

global_duration_cost_per_hour

double

「全球時間長度」是指所有車輛最早生效開始時間與最晚有效結束時間之間的差距。使用者可以為該數量指派每小時成本,以便盡早完成工作。這個費用的單位必須與 Shipment.penalty_cost 相同。

duration_distance_matrices[]

DurationDistanceMatrix

指定模型中使用的持續時間和距離矩陣。如果這個欄位空白,系統會根據 use_geodesic_distances 欄位的值,改用 Google 地圖或測地距離。如果留空,use_geodesic_distances 不得為 true,duration_distance_matrix_src_tagsduration_distance_matrix_dst_tags 都不得留空。

使用範例:

  • 其中有兩個位置:locA 和 locB。
  • 1 輛車輛的路線起點和終點皆為 locA。
  • 1 個位於 locB 的取件造訪要求。
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • 其中有三個位置:locA、locB 和 locC。
  • 1 輛車透過「快速」矩陣,從 locA 開始行駛路線,並於 locB 結束。
  • 1 輛車輛從 locB 開始路線,並在 locB 結束,使用矩陣「slow」。
  • 1 輛車輛從 locB 開始路線,並在 locB 結束,使用矩陣「fast」。
  • 1 個位於 locC 的取貨要求。
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

定義時間長度和距離矩陣來源的標記;duration_distance_matrices(i).rows(j) 會在矩陣 i 中,定義從代碼 duration_distance_matrix_src_tags(j) 到其他造訪地點的持續時間和距離。

標記會對應至 VisitRequest.tagsVehicle.start_tags。指定的 VisitRequestVehicle 必須與這個欄位中的一個標記完全相符。請注意,Vehicle 的來源、目的地和矩陣標記可能相同;VisitRequest 的來源和目的地標記也可能相同。所有標記都必須不同,且不得為空字串。如果這個欄位非空白,則 duration_distance_matrices 不得留空。

duration_distance_matrix_dst_tags[]

string

定義時間長度和距離矩陣目的地的標記;duration_distance_matrices(i).rows(j).durations(k) (回覆duration_distance_matrices(i).rows(j).meters(k)) 矩陣 i. 使用標記 duration_distance_matrix_src_tags(j),以標記 duration_distance_matrix_dst_tags(k) 的方式,指出行程從造訪到造訪的持續時間 (以距離為準)。

標記會對應至 VisitRequest.tagsVehicle.start_tags。給定的 VisitRequestVehicle 必須與這個欄位中的一個標記完全相符。請注意,Vehicle 的來源、目的地和矩陣標記可能相同;同樣地,VisitRequest 的來源和目的地標記也可能相同。所有標記都必須不同,且不得為空白字串。如果這個欄位非空白,則 duration_distance_matrices 不得留空。

transition_attributes[]

TransitionAttributes

已新增至模型的轉場屬性。

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

不相容的 shipping_types 組合 (請參閱 ShipmentTypeIncompatibility)。

shipment_type_requirements[]

ShipmentTypeRequirement

一組 shipment_type 要求 (請參閱 ShipmentTypeRequirement)。

precedence_rules[]

PrecedenceRule

模型中必須強制執行的優先順序規則集。

max_active_vehicles

int32

限制可運作的車輛數量上限。如果路線至少執行一次貨運,表示車輛正在行駛中。當車隊少於車輛,且車隊屬於異質時,這項功能可用來限制路線數量。最佳化功能會選擇最適合使用的車輛組合。必須是正數。

DurationDistanceMatrix

指定從造訪、車輛開始地點和車輛終點位置之間的持續時間和距離矩陣。

欄位
rows[]

Row

指定時間長度和距離矩陣的資料列。必須包含與 ShipmentModel.duration_distance_matrix_src_tags 一樣的元素數量。

vehicle_start_tag

string

定義這個持續時間和距離矩陣適用的車輛的標記。如果為空白,表示適用於所有車輛,且只能有一個矩陣。

每輛車起點都必須與一個矩陣相符,也就是說,只有其中一個 start_tags 欄位必須與矩陣的 vehicle_start_tag (且僅限該矩陣) 相符。

所有矩陣都必須有不同的 vehicle_start_tag

指定時間長度和距離矩陣的資料列。

欄位
durations[]

Duration

指定資料列的持續時間值。必須包含與 ShipmentModel.duration_distance_matrix_dst_tags 一樣的元素數量。

meters[]

double

特定資料列的距離值。如果沒有費用或限制是指模型中的距離,則可留空;否則,其元素數量必須與 durations 一樣多。

PrecedenceRule

兩個事件之間的優先順序規則 (每個事件均為取貨或貨件交付):「第二個」事件的開始日期至少要在「第一個」後 offset_duration已開始。

不過,有些優先順序可代表相同 (或相關) 事件,例如:「B 送貨後取貨」和「C 從 取件 B 發生」的情況

此外,只有在兩項運送作業都發生時,優先順序才會套用,其他作業則遭到忽略。

欄位
first_is_delivery

bool

表示是否為「第一個」就是一項外送服務

second_is_delivery

bool

表示是否為「秒」就是一項外送服務

offset_duration

Duration

「第一個」值之間的偏移和「second」活動。可以是負值。

first_index

int32

「第一個」的運送索引活動。必須指定此欄位。

second_index

int32

「第二」的運送索引活動。必須指定此欄位。

ShipmentRoute

車輛的路線可以沿著即時軸解,如下所示 (假設有 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。

放大,以下是 TransitionVisit 期間會發生的情況:

---+-------------------------------------+-----------------------------+-->
   |           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 和 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     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
欄位
vehicle_index

int32

執行路線的車輛,由來源 ShipmentModel 中的索引識別。

vehicle_label

string

執行這條路線的車輛標籤,等於 ShipmentModel.vehicles(vehicle_index).label (如有指定)。

vehicle_start_time

Timestamp

車輛開始行駛的時間。

vehicle_end_time

Timestamp

車輛完成路線的時間。

visits[]

Visit

代表路線的已排序造訪序列。Visit [i] 是路線中的第 i 次造訪。如果這個欄位空白,系統會將車輛視為未使用。

transitions[]

Transition

路線的轉換已排序清單。

has_traffic_infeasibilities

bool

如果將 OptimizeToursRequest.consider_road_traffic 設為 true,這個欄位表示路線時間不一致,是根據路況估算的交通時間來預測。無論是第一次造訪前後、首次造訪前或上次造訪後,時間都可能不足以完成按照車流量調整的交通、延誤和休息時間,但這仍會滿足親臨門市需求和車輛的時效。例如:

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

因為路況的關係,預估的交通時間增加 travel_duration(previous_visit, next_visit),因此抵達 next_visit 的機率可能會晚於目前的時間範圍。此外,交通時間預估值和造訪/休息時間限制都增加,可能因而必須導致休息時間與造訪時間重疊。

route_polyline

EncodedPolyline

路線的編碼折線表示法。只有在 OptimizeToursRequest.populate_polylines 設為 True 時,系統才會填入這個欄位。

breaks[]

Break

這條路線的車輛預定休息時間。breaks 序列代表時間間隔,每個時間間隔從對應的 start_time 開始,持續 duration 秒。

metrics

AggregatedMetrics

這條路線的時長、距離和載入指標。系統會根據結構定義,為所有 ShipmentRoute.transitionsShipmentRoute.visits 欄位加總 AggregatedMetrics 的欄位。

route_costs

map<string, double>

路線費用,按照費用相關要求欄位細分。這些鍵是 proto 路徑,相對於輸入的 OptimizeToursRequest,例如:「model.shipments.pickups.cost」和「模型」的值則為相對應費用欄位產生的總費用,並匯總在整條路線上。換句話說,成本 ["model.shipments.pickups.cost"] 是路線上所有取貨費用的總和。這裡詳細列出模型中定義的所有費用,但 TransitionAttributes 的相關費用除外。這些費用只以 2022 年 1 月的匯總方式呈現。

route_total_cost

double

路線的總費用。費用對應中所有費用的總和。

休息時間

代表廣告插播執行的資料。

欄位
start_time

Timestamp

休息的開始時間。

duration

Duration

休息時間長度。

EncodedPolyline

折線的編碼表示法。如要進一步瞭解多邊形編碼,請參閱以下網頁:https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding

欄位
points

string

代表折線已編碼點的字串。

轉移

路線上的兩個事件之間轉換。請參閱 ShipmentRoute 的說明。

如果車輛沒有 start_location 和/或 end_location,則相應的旅遊指標為 0。

欄位
travel_duration

Duration

轉換期間的交通時間。

travel_distance_meters

double

在過渡期間移動的距離。

traffic_info_unavailable

bool

如果透過 OptimizeToursRequest.consider_road_traffic 要求流量,且無法擷取 Transition 的流量資訊,該布林值會設為 true。這可能是暫時性問題 (即時交通流量伺服器偶爾發生故障),也可能是永久性問題 (這個位置沒有資料)。

delay_duration

Duration

套用至這個轉換作業的延遲時間長度總和。如有這種情況,延遲時間剛好是發生下一個事件 (造訪或車輛結束) 的 delay_duration 秒前。查看《TransitionAttributes.delay》。

break_duration

Duration

本次移轉期間的廣告插播時間長度總和 (如果有的話)。每個休息時間的開始時間和時間長度詳細資料會儲存在 ShipmentRoute.breaks 中。

wait_duration

Duration

轉換期間的等待時間。等待時間長度對應至閒置時間,且不包含休息時間。另請注意,這個等待時間可能會分成幾個不連續的間隔。

total_duration

Duration

轉換總時間 (為了方便起見)。等於:

  • 下次造訪 start_time (如果是最後一次轉換,則為 vehicle_end_time) - 這個轉換是 start_time
  • 如果 ShipmentRoute.has_traffic_infeasibilities 為 false,則還有以下考量項目:`total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`。
start_time

Timestamp

這項轉換作業的開始時間。

route_polyline

EncodedPolyline

轉換期間路徑的編碼折線表示法。只有在 populate_transition_polylines 設為 True 時,才會填入這個欄位。

vehicle_loads

map<string, VehicleLoad>

在此轉場期間,車輛會載入該車輛 Vehicle.load_limits 中顯示的每種類型,或是在這條路線上的部分貨運設有非零 Shipment.load_demands

第一個轉場期間的載入是車輛路線的起始載入。接著,視該次造訪是自取或外送,每次造訪後,都會將造訪的 load_demands 相加或減去,以獲得下次轉換的載入。

VehicleLoad

回報特定類型在路線沿途某個點的實際負載 (請參閱 Transition.vehicle_loads)。

欄位
amount

int64

特定車輛類型的負載量。載入單位通常以類型表示。詳情請參閱《Transition.vehicle_loads》。

前往

在路線中執行的造訪。本次造訪對應的是取貨或送貨 Shipment

欄位
shipment_index

int32

來源 ShipmentModel 中的 shipments 欄位索引。

is_pickup

bool

如果造訪為 true,則造訪對應至 Shipment 的取貨。否則對應項目會對應提交內容。

visit_request_index

int32

Shipment 的自取或外送欄位中的 VisitRequest 索引 (請參閱 is_pickup)。

start_time

Timestamp

造訪開始的時間。請注意,車輛可能會在造訪地點之前抵達。時間與 ShipmentModel 一致。

load_demands

map<string, Load>

總造訪載入需求是出貨總和與造訪要求 load_demands。如果造訪是運送,這個值會是負值。系統會針對與 Transition.loads 相同的類型回報要求 (請參見這個欄位)。

detour

Duration

由於商家抵達前路線上的貨物運送,且所需時間會因此導致的可能等待時間,因此需要額外的往返時間。如果是外送服務,則系統會根據對應的上車地點計算行程,並等於:

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

否則,它是從車輛 start_location 計算而得,等於:

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

對應的 Shipment.label 副本 (如果在 Shipment 中指定)。

visit_label

string

對應的 VisitRequest.label 副本 (如果在 VisitRequest 中指定)。

ShipmentTypeIncompatibility

根據 shipping_type,指定運送項目間的不相容問題。系統會依據不相容模式,限制同一條路線上不相容的運送方式。

欄位
types[]

string

不相容類型的清單。兩件出貨各有不同的 shipment_types 為「不相容」。

incompatibility_mode

IncompatibilityMode

模式套用至不相容。

IncompatibilityMode

定義同一條路線上不相容貨運外觀的限制方式。

列舉
INCOMPATIBILITY_MODE_UNSPECIFIED 未指定相容模式。請一律不要使用這個值。
NOT_PERFORMED_BY_SAME_VEHICLE 在此模式下,如果兩件不相容的運送類型不相容,就無法同一輛車共用。
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

針對兩種不相容的類型隨附 NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY 不相容模式:

  • 如果兩者均為「只能自取 (無法外送) 或外送」(不提供取貨服務),就無法共乘同一輛車。
  • 如果其中一項貨品已出貨,另一個則由使用者自行取件,只要雙方先出貨再收到第二件貨品,雙方就可以共乘。

ShipmentTypeRequirement

根據運送類型指定運送資訊的規定。需求的具體內容則由需求模式定義。

欄位
required_shipment_type_alternatives[]

string

dependent_shipment_types 要求的替代運送類型清單。

dependent_shipment_types[]

string

凡是 dependent_shipment_types 欄位中具有類型的運送商品,都必須在同一條路線上運送至少一項 required_shipment_type_alternatives 類型的貨品。

注意:系統不允許要求鏈結,例如 shipment_type 依附自身。

requirement_mode

RequirementMode

為需求套用的模式。

RequirementMode

定義路線上依附運送的顯示方式。

列舉
REQUIREMENT_MODE_UNSPECIFIED 未指定需求模式。請一律不要使用這個值。
PERFORMED_BY_SAME_VEHICLE 在這個模式下,所有「相依」貨運項目必須至少與一項「必要」同一輛車共用出貨。
IN_SAME_VEHICLE_AT_PICKUP_TIME

使用 IN_SAME_VEHICLE_AT_PICKUP_TIME 模式時,所有「相依」出貨商品至少須有一項「必填」屬性商品於取貨時出貨。

因此,「依附」貨件取件必須具備下列其中一種條件:

  • 在路線後方,或
  • 在路線上先行取件的「必要」貨件,如果「必要」貨件有配送服務,則必須在「從屬」貨件取件後執行這項配送服務。
IN_SAME_VEHICLE_AT_DELIVERY_TIME 與以往相同,但「相依」運送項目必須具備「必填」屬性商品在交貨時出貨。

SkippedShipment

指定解決方案中未執行出貨作業的詳細資料。對於簡單的情況和/或我們能夠找出跳過的原因,我們會在此處回報原因。

欄位
index

int32

這個索引對應到來源 ShipmentModel 中的運送索引。

label

string

對應的 Shipment.label 副本 (如果在 Shipment 中指定)。

reasons[]

Reason

說明略過出貨的原因。請參閱 Reason 上方的註解。如果我們無法瞭解出貨作業遭到略過的原因,就不會設定原因。

原因

如果我們可以說明略過出貨的原因,即可在此處列出原因。如果所有車輛的原因都不相同,則 reason 會有 1 個以上的元素。略過出貨的程序不得重複,亦即除了 example_vehicle_index 以外,所有欄位皆相同。範例:

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

略過的貨件與所有車輛皆不相容。以每輛車來說,原因可能都不同,但至少一部車的「蘋果」會超出 1 輛車 (含第 1 輛車),但至少要有一輛車的「梨子」將超出上限 (包括車輛 3),且至少將超出一輛車的距離限制 (包括車輛 1)。

欄位
code

Code

請參閱程式碼的註解。

example_exceeded_capacity_type

string

如果原因代碼為 DEMAND_EXCEEDS_VEHICLE_CAPACITY,表示已超過一種容量類型。

example_vehicle_index

int32

如果原因與出貨車輛不相容有關,這個欄位會提供相關車輛的索引。

程式碼

指出原因類型的代碼。這裡的順序沒有任何意義。特別是,如果兩者都適用,它不會指出在解決方案中,某個原因會出現在另一個原因之前。

列舉
CODE_UNSPECIFIED 請勿使用此值。
NO_VEHICLE 這個模特兒沒有車輛導致所有商品無法運送。
DEMAND_EXCEEDS_VEHICLE_CAPACITY 運送需求超過車輛對某些容量類型的上限,例如 example_exceeded_capacity_type
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

執行這項出貨作業所需的最短距離,亦即從車輛的 start_location 到貨運的上車和/或送貨地點,以及車輛終點位置超過車輛的 route_distance_limit

請注意,我們進行這項運算時會使用測地距離。

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

執行這項送貨作業所需的最短時間,包括交通時間、等待時間和服務時間超過車輛的 route_duration_limit

注意:系統會以最佳情況計算行程時間,也就是以測地線距離 x 36 公尺/秒 (約 130 公里/小時) 計算。

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT 與上述相同,但我們只會比較最短行程時間和車輛的 travel_duration_limit
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS 如果車輛在最早的開始時間開始,就無法執行這項運送作業 (請參閱 CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT 瞭解時間計算):讓車輛在最快結束時間後結束的總時間。
VEHICLE_NOT_ALLOWED 貨運的 allowed_vehicle_indices 欄位不是空的,且該車輛不屬於此車輛。

TimeWindow

時間範圍會限制事件的時間,例如造訪時的抵達時間,或是車輛的開始和結束時間。

硬時間範圍邊界 (start_timeend_time) 會強制執行事件的最早和最晚時間,例如 start_time <= event_time <= end_time。電子時間範圍下限 soft_start_time 表示在 soft_start_time 當天或之後發生事件的偏好,其費用會與 soft_start_time 事件發生前的時間長度按比例計算。電子時間範圍上限 soft_end_time 表示在 soft_end_time 當天或之前發生事件的偏好,其費用與 soft_end_time 事件發生之後的時間長度成正比。start_timeend_timesoft_start_timesoft_end_time 應在全球時間限制內 (請參閱 ShipmentModel.global_start_timeShipmentModel.global_end_time),並應遵守下列規定:

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
欄位
start_time

Timestamp

硬性時間範圍開始時間。如果未指定,則會設為 ShipmentModel.global_start_time

end_time

Timestamp

硬性時間範圍的結束時間。如果未指定,則會設為 ShipmentModel.global_end_time

soft_start_time

Timestamp

時間範圍的正規開始時間。

soft_end_time

Timestamp

時間範圍的軟性結束時間。

cost_per_hour_before_soft_start_time

double

如果事件發生在 soft_start_time 之前,會增加模型中其他費用的每小時費用,計算方式如下:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

這個費用必須為正值,且只有在已設定 soft_start_time 時才能設定這個欄位。

cost_per_hour_after_soft_end_time

double

如果事件發生在 soft_end_time 之後,則模型中其他費用的每小時費用,計算方式如下:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

這個成本必須為正值,且只有在設定 soft_end_time 時才能設定這個欄位。

TransitionAttributes

指定路線上兩次連續造訪之間的轉換屬性。同一個轉換可能會套用多個 TransitionAttributes:在這種情況下,所有額外費用會相加,並套用最嚴格的限制或上限 (遵循自然的「AND」語義)。

欄位
src_tag

string

定義這些屬性適用的 (src->dst) 轉場組合。

如果 VisitRequest.tagsVehicle.start_tags 包含 src_tag 或不含 excluded_src_tag (視這兩個欄位中的哪一個非空白),即可視為來源造訪或車輛起點相符。

excluded_src_tag

string

詳情請參閱 src_tagsrc_tagexcluded_src_tag 中不得空白。

dst_tag

string

如果目的地或車輛的 VisitRequest.tagsVehicle.end_tags 包含 dst_tag 或不含 excluded_dst_tag (視這兩個欄位中的哪一個非空白),就會符合目的地或車輛終點。

excluded_dst_tag

string

詳情請參閱 dst_tagdst_tagexcluded_dst_tag 中不得空白。

cost

double

指定執行這項轉換作業的費用。這與模型中的所有其他費用相同,不得為負數。此額度適用於所有其他現有費用。

cost_per_kilometer

double

指定執行這個轉場時,每公里的移動距離。加總在車輛上指定的 Vehicle.cost_per_kilometer 最多。

distance_limit

DistanceLimit

指定執行這次轉換時的移動距離上限。

自 2021 年 6 月起,系統僅支援非強制性限制。

delay

Duration

指定執行這項轉換時的延遲時間。

這類延遲是指在完成來源造訪「之後」,以及開始目的地造訪「之前」

車輛

模擬運送問題中的車輛。解決運送問題時,系統會建立從 start_location開始到 end_location 這輛車的路線。路線是指造訪記錄的序列 (請參閱 ShipmentRoute)。

欄位
display_name

string

使用者定義的車輛顯示名稱。長度上限為 63 個半形字元,可以使用 UTF-8 字元。

travel_mode

TravelMode

交通方式會影響車輛可使用的道路和速度。另請參閱 travel_duration_multiple

route_modifiers

RouteModifiers

一組滿足的條件,這些條件會影響系統計算指定車輛的路線。

start_location

LatLng

車輛開始載運貨物的地理位置。如未指定,車輛會在第一次上車時開始。如果運送模型包含時間長度和距離矩陣,則不得指定 start_location

start_waypoint

Waypoint

路線點代表車輛在接受任何貨物前開始的地理位置。如果未指定 start_waypointstart_location,車輛會在第一個上車地點開始行駛。如果運送模型含有時間和距離矩陣,請勿指定 start_waypoint

end_location

LatLng

車輛在最後一次完成 VisitRequest 後結束的地理位置。如未指定,車輛的 ShipmentRoute 會在車輛完成最後一個 VisitRequest 時立即結束。如果運送模型包含時間長度和距離矩陣,則不得指定 end_location

end_waypoint

Waypoint

路線點代表車輛在最後一次完成 VisitRequest 後結束的地理位置。如果未指定 end_waypointend_location,車輛的 ShipmentRoute 會在最後一次完成 VisitRequest 時立即結束。如果運送模型包含時間長度和距離矩陣,則不得指定 end_waypoint

start_tags[]

string

指定車輛路線起點所附加的標記。

字串不得留空或重複。

end_tags[]

string

指定車輛路線終點的標記。

不得使用空字串或重複的字串。

start_time_windows[]

TimeWindow

車輛可能駛離起點的時間範圍。必須在全球時間限制內 (請參閱 ShipmentModel.global_* 欄位)。如未指定,則除了全球時間限制外,沒有其他限制。

屬於相同重複欄位的時間範圍必須不重疊,也就是說,任何時間範圍都不能與其他時間範圍重疊或相鄰,且必須按時間順序排列。

只有單一時段才能設定 cost_per_hour_after_soft_end_timesoft_end_time

end_time_windows[]

TimeWindow

車輛可能抵達終點的時間範圍。必須在全球時間限制內 (請參閱 ShipmentModel.global_* 欄位)。如果未指定,則除了全球時間限制以外,其他時間限制也沒有限制。

屬於相同重複欄位的時間範圍必須不重疊,也就是說,任何時間範圍都不能與其他時間範圍重疊或相鄰,且必須按時間順序排列。

只有單一時段才能設定 cost_per_hour_after_soft_end_timesoft_end_time

unloading_policy

UnloadingPolicy

已對車輛強制執行卸載政策。

load_limits

map<string, LoadLimit>

車輛容量 (例如重量、體積、棧板數量)。對應中的鍵是載入類型的 ID,與 Shipment.load_demands 欄位的鍵一致。如果這張對應中沒有指定索引鍵,相應的容量會視為無限制。

cost_per_hour

double

車輛費用:所有費用都會加總,且必須與 Shipment.penalty_cost 位於同一單位。

車輛路線的每小時費用。這筆費用適用於該路線總共花費的時間,而且包含交通時間、等待時間和造訪時間。使用 cost_per_hour 而非 cost_per_traveled_hour 可能會導致額外的延遲。

cost_per_traveled_hour

double

車輛路線的每行駛時數。這筆費用僅適用於該路線 (也就是在 ShipmentRoute.transitions 回報) 行經的交通時間,且不包含等待時間和造訪時間。

cost_per_kilometer

double

車輛路線的每公里費用。這筆費用適用於 ShipmentRoute.transitions 中回報的距離,不適用於從 arrival_location 間接行駛到單一 VisitRequestdeparture_location 的任何距離。

fixed_cost

double

使用此車輛處理貨物時須支付的固定費用。

used_if_route_is_empty

bool

這個欄位僅適用於車輛路線不提供任何貨運時。用於說明車輛是否應視為「二手」或在這個案例中否。

如果設為 true,即使車輛不提供任何貨物,車輛也會從起點移動到終點 -->

否則,它不會從起點行駛至終點,且這輛車沒有 break_rule 或誤點 (從 TransitionAttributes) 的時程。在這種情況下,車輛的 ShipmentRoute 不含任何車輛索引和標籤以外的任何資訊。

route_duration_limit

DurationLimit

這個限制適用於車輛路線的總行車時間。在特定 OptimizeToursResponse 中,車輛的路線時間長度是 vehicle_end_timevehicle_start_time 的差異。

travel_duration_limit

DurationLimit

這個限制適用於車輛路線的交通時間。在指定的 OptimizeToursResponse 中,路線行駛時間是所有 transitions.travel_duration 的總和。

route_distance_limit

DistanceLimit

限制適用於車輛路線的總距離。在指定的 OptimizeToursResponse 中,路線距離是其所有 transitions.travel_distance_meters 的總和。

extra_visit_duration_for_visit_type

map<string, Duration>

指定 Visit_types 字串到 times 的對應。時間長度除了 VisitRequest.duration 以外,還達到指定 visit_types 時所需的時間長度。若指定 cost_per_hour,延長造訪時間會使費用增加。鍵 (例如 visit_types) 不得為空字串。

如果造訪要求包含多個類型,地圖中會為每個類型加入持續時間。

break_rule

BreakRule

說明這輛車要強制執行的休息時間表。如果為空白,則不會為這輛車輛安排休息時間。

label

string

指定這輛車的標籤。在回覆中會回報這個標籤為對應 ShipmentRoutevehicle_label

ignore

bool

如果設為 true,used_if_route_is_empty 就必須為 false,且這輛車不會使用。

如果 injected_first_solution_routes 中遭忽略的車輛執行了運送,第一個解決方案會略過該貨品,但在回應中可免費執行。

如果貨物在 injected_solution_constraint 中受忽略的車輛執行,且任何相關上車/配送服務限制在車上 (也就是非寬鬆到第 RELAX_ALL_AFTER_THRESHOLD 級),回應中會略過該車輛。如果運送單中有非空白的 allowed_vehicle_indices 欄位,且所有允許的車輛都遭到忽略,系統就會在回應中略過該運送單。

travel_duration_multiple

double

指定可用於增加或減少此車輛行駛時間的乘數。舉例來說,如果將這個項目設定為 2.0,就代表這輛車的行駛速度較慢,而且交通時間是一般車輛的兩倍。(多次不會影響造訪時間長度)。如果指定 cost_per_hourcost_per_traveled_hour,費用就會受到影響。必須介於 [0.001, 1000.0] 之間。如未設定,車輛為標準車輛,系統會將此倍數視為 1.0。

警告:套用這個數倍數後,交通時間會四捨五入至最接近的秒數,但在執行任何數值運算之前,整數值可能會導致精確度降低。

另請參閱下方的 extra_visit_duration_for_visit_type

DurationLimit

用於定義車輛路線最長行駛時間的限制。可以是硬式或軟式。

定義軟性上限欄位後,必須同時定義非強制性上限及相關費用。

欄位
max_duration

Duration

硬性限制會將時間長度限制在 max_duration 內。

soft_max_duration

Duration

非強制執行時間限制並未強制執行時間長度上限,而違反時路徑會產生費用。這筆費用會與模型中定義的其他費用相加,且單位相同。

如果已定義,soft_max_duration 必須為非負數。如果一併定義 max_duration,soft_max_duration 必須小於 max_duration。

quadratic_soft_max_duration

Duration

軟性限制不會強制執行最大時間長度限制,但如果違反限制,路線就會產生費用,且費用會隨著時間呈現平方關係。這筆費用會與模型中定義的其他費用相加,且單位相同。

如果已定義,quadratic_soft_max_duration 必須為非負數。如果也定義了 max_duration,則 quadratic_soft_max_duration 必須小於 max_duration,且差值不得超過一天:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

違反 soft_max_duration 門檻會產生的每小時費用。如果時間長度低於門檻,則額外費用為 0,否則費用取決於持續時間,方法如下:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

費用必須為非負值。

cost_per_square_hour_after_quadratic_soft_max

double

違反 quadratic_soft_max_duration 門檻時產生的每平方小時費用。

如果時間長度低於門檻,則額外費用為 0,否則費用取決於持續時間,方法如下:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

費用必須為正數。

LoadLimit

定義套用至車輛的負載限制,例如「這輛卡車只能承載 3500 公斤」。詳情請參閱《load_limits》。

欄位
soft_max_load

int64

負載的軟性限制。詳情請參閱《cost_per_unit_above_soft_max》。

cost_per_unit_above_soft_max

double

如果車輛沿途的負載量超過 soft_max_load,須支付以下的罰金 (每輛車一次):(載入 - soft_max_load) * cost_per_unit_above_soft_max。所有費用都會增加,且必須與 Shipment.penalty_cost 位於相同的單位。

start_load_interval

Interval

路線起點的可接受的負載間隔。

end_load_interval

Interval

車輛在路線結束時可接受的載客量間隔。

max_load

int64

可接受的負載量上限。

時間間隔

可接受的負載量的時間間隔。

欄位
min

int64

可接受的最低負載。必須大於或等於 0。如果同時指定這兩個值,min 必須小於或等於 max

max

int64

可接受的負載上限。必須大於 0。如果未指定,則此訊息不會限制載入量上限。如果同時指定兩者,min 值必須 ≤ max

TravelMode

車輛可使用的交通方式。

這些應為 Google 地圖平台路線偏好 API 的部分交通模式,請參閱:https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode

列舉
TRAVEL_MODE_UNSPECIFIED 未指定交通方式,相當於 DRIVING
DRIVING 與行車路線 (汽車,...) 對應的交通模式。
WALKING 與步行路線對應的交通模式。

UnloadingPolicy

車輛卸貨方式的政策。僅適用於提供自取和外送的出貨商品。

其他商品在路線上的任何地點皆可自由運送,與 unloading_policy 無關。

列舉
UNLOADING_POLICY_UNSPECIFIED 未指定卸載政策;配送服務只能安排在相應的上車地點後完成。
LAST_IN_FIRST_OUT 貨品必須按取貨順序反向排序
FIRST_IN_FIRST_OUT 運送作業必須按照取貨順序進行

途經點

封裝路線控點。路線控點會標示 VisitRequests 的抵達和出發地點,以及車輛的起點和終點。

欄位
side_of_road

bool

選用設定。表示這個路線控點的位置是用來指定車輛在特定側面停靠的位置。設定這個值後,路線就會通過位置,這樣車輛就能在路側停靠,該位置是從道路中心偏離位置。這個選項不適用於「WALKING」交通方式。

聯集欄位 location_type。以不同方式表示地點。location_type 只能是下列其中一項:
location

Location

使用地理座標指定的點,包括選擇性的方向。

place_id

string

與路線控點相關聯的搜尋點地點 ID。