有时,您可能需要规划应用向用户提供的路线。使用 路由令牌 Routes Preferred API 或 Route Optimization API 可以 帮助您为规划的路线指定两点:
路线的多段线
您的路线目标
例如,以下是您可能有的路线规划目标示例:
最大限度地缩短送餐时间:送餐商家可能希望 尽可能缩短送餐时间
尽可能缩短行程时间或减少燃料消耗:物流公司可能希望提高司机的效率并降低燃料费用。
最大限度地缩短到达目的地所需的时间:服务调度操作可能需要 尽可能缩短操作员提供任务请求所需的时间。
降低费用并提高安全性:共享汽车公司可能希望找到一条费用较低且出于安全考虑避开某些区域的路线。
有关使用路线令牌规划路线的更多信息,请参阅在 路由令牌 Routes API 及转换多段线和路线 令牌数: Route Optimization API。
为什么要为路线目标使用路线令牌
有了来自 Routes API 的路线令牌 Routes Preferred API(即 Route Optimization API) 可以更好地控制提供的路线:
尽可能提前规划路线,以供 Navigation SDK 使用。
为 Navigation SDK 选择最佳路线。如果您在 Routes API 中生成路线时请求路线令牌,则会为每条生成的路线获取一个路线令牌。然后,您可以选择 传递给 Navigation SDK。
提前估算价格,包括预计到达时间和价格 距离。虽然实际费用和时间可能会有所不同,但此估算值可缩小预计路线费用与实际路线费用之间的差距。
指定更高级的路线目标,例如环保路线或最短路线。
路线令牌的运作方式
您可以使用 Routes API、Routes Preferred API 或 Route Optimization API 可根据路线目标规划路线。您 可以将从这些 API 中任意一个返回的路由令牌 Navigation SDK - 用于为车辆规划路线。
当您请求和使用路由令牌时,会发生以下情况:
Routes API、Routes Preferred API 或 Route Optimization API 会返回一个加密的路线令牌,其中包含路线多段线和路线目标。
您将路线令牌传递给 Navigation SDK。
Navigation SDK 会检索路线,如果由于条件变化而无法使用该路线,则会检索最匹配的路线。
在驾车过程中,如果路况或其他路况发生变化,或 车辆偏离计划路线,修改的路线会不断 尝试根据令牌中的路线目标匹配最佳路线。
此过程可以最大限度地增加实际路线与计划路线的距离。
为什么车辆可能不会完全按照规划的路线行驶
请将规划的路线和路线目标视为要遵循的指南: 并不是规定性的由于道路状况、起始位置或其他参数在您创建计划路线后发生了变化,因此您可能会发现计划路线与导航系统提供的路线存在差异。这种差异可能会导致 您针对距离和预计到达时间以及其他重要行程制定的计划目标和实际目标 质量。
使用路线令牌规划路线
要规划路线,您可以创建一个路线令牌,然后将其传递给 Navigation SDK,如以下步骤所述:
第 1 步:使用 Routes API、Routes Preferred API 或 Route Optimization API 创建路线令牌
使用以下方法之一请求路线令牌:
Routes API:
computeRoutes
。如需详细了解如何在 Routes API 中请求路线令牌,请参阅计算路线和请求路线令牌。Routes 首选 API:
computeCustomRoutes
。有关 有关如何请求路线令牌的信息,请参阅 路线首选 API,请参见规划 路由。Route Optimization API:
optimizeTours
或batchOptimizeTours
。如需详细了解如何请求路线 令牌,请参阅转换多段线和路线 令牌。
设置 Routes API 或 Routes Preferred API 请求,以满足使用路线令牌的要求:
- 将
travel_mode
设置为DRIVING
或TWO_WHEELER
- 将
routing_preference
设置为TRAFFIC_AWARE
或TRAFFIC_AWARE_OPTIMAL
- 请勿使用
Via
航点
- 将
第 2 步:将路线令牌传递给 Navigation SDK
存储路线令牌:在 Navigation SDK 中,设置一个字符串来存储路线令牌。例如:
String routeToken = "route token returned by Routes API";
返回路由令牌的示例:
{ // Other fields "routeToken": "CqMBCjoKCJQOor5DHcwiEhBon3XpHXFnVvDeWMwd9PpAGgz6wtnFDKIBrAHTARpCApUDSggAAAAACjcrP3gBEAQaTApKChgKDQoCCAERAAAAAACAZkAR3SQGgZUXdUASEggAEAMQBhATEBIYAkIEGgIIBSIYChZ2VEJiWlBPSkk1aU5wUVRzNTV5d0FRKAEiFQBcJuds-Efh-2QZhOMTtUCCxEVL_g", }
使用
Navigator.setDestinations
方法,指定相同的目的地 您在创建路线令牌时使用的航点:setDestinations(List
destinations, CustomRoutesOptions customRoutesOptions, DisplayOptions displayOptions); 例如:
CustomRoutesOptions customRoutesOptions = CustomRoutesOptions.builder() .setRouteToken(routeToken) .setTravelMode(TravelMode.DRIVING) .build();
Navigator.setDestinations
方法会返回请求的状态。如果它找到了从车辆位置到给定目的地的路线,则返回 RouteStatus.OK
。
如需详细了解此方法,请参阅 Navigator.setDestinations
。
示例
以下代码示例演示了如何使用路线令牌指定规划的路线。
ArrayList <Waypoint> destinations = Lists.newArrayList();
Waypoint waypoint1 =
Waypoint.builder()
.setLatLng(10, 20)
.setTitle("title")
.setVehicleStopover(true)
.build();
destinations.add(waypoint1);
Waypoint waypoint2 =
Waypoint.builder()
.setPlaceId("ChIJYV-J-ziuEmsRIMyoFaMedU4")
.setTitle("title")
.setVehicleStopover(true)
.build()
destinations.add(waypoint2);
String routeToken = "route token returned by Routes API";
CustomRoutesOptions customRoutesOptions =
CustomRoutesOptions.builder()
.setRouteToken(routeToken)
.setTravelMode(TravelMode.DRIVING)
.build();
// Existing flow to get a Navigator.
NavigationApi.getNavigator(...);
// Existing flow for requesting routes.
ListenableResultFuture<RouteStatus> routeStatusFuture =
navigator.setDestinations(destinations, customRoutesOptions);
// Or with display options.
DisplayOptions displayOptions = new DisplayOptions();
ListenableResultFuture<RouteStatus> routeStatusFuture =
navigator.setDestinations(destinations, customRoutesOptions, displayOptions);
路线令牌和 Navigation SDK 如何交互
下面展示了 Navigation SDK 生成的路线和计划 路由令牌中的路由交互:
替换之前设置的所有目的地。
使用车辆的出发位置。
调整以适应道路和交通状况。请参阅为什么车辆可能不会完全按照规划的路线行驶。
忽略以下不需要的路由相关选项:
avoidsHighways
avoidsTolls
avoidsFerries
licensePlateRestriction
关注:
与航点相关的选项,例如路边偏好设置。
路线目标。如果 Navigation SDK 必须调整返回的路线,则会使用您在请求路线令牌时指定的路线目标。因此,您应使用在 Routes API 中指定的与航点相关的选项。