规划路线

有时,您可能需要规划应用向用户提供的路线。使用 Routes API、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,以指导其为车辆规划路线。

请求和使用路线令牌时会发生以下情况:

  1. Routes API、Routes Preferred API 或 Route Optimization API 会返回一个加密的路线令牌,其中包含路线多段线和路线目标。

  2. 您将路线令牌传递给 Navigation SDK。

  3. Navigation SDK 会检索路线,如果由于条件变化而无法使用该路线,则会检索最匹配的路线。

  4. 在沿着路线行驶时,如果交通或其他路况发生变化,或者车辆偏离了计划路线,经过修改的路线会不断尝试根据令牌中的路线目标匹配最佳路线。

此过程会最大限度地缩短实际路线与规划路线之间的距离。

为什么车辆可能不会完全按照规划的路线行驶

将规划的路线和路线目标视为遵循的准则,而不是强制性规定。由于道路状况、起始位置或其他参数在您创建计划路线后发生了变化,因此您可能会发现计划路线与导航系统提供的路线存在差异。这种差异可能会导致距离、预计到达时间和其他重要行程质量等方面的预期目标与实际目标不一致。

使用路线令牌规划路线

您可以通过创建路线令牌,然后将其传递给 Navigation SDK 来规划路线,如下文所述:

第 1 步:使用 Routes API、Routes Preferred API 或 Route Optimization API 创建路线令牌

  1. 使用以下方法之一请求路线令牌

    • Routes APIcomputeRoutes。如需详细了解如何在 Routes API 中请求路线令牌,请参阅计算路线请求路线令牌

    • Routes 首选 APIcomputeCustomRoutes。如需详细了解如何在 Routes Preferred API 中请求路线令牌,请参阅规划路线

    • Route Optimization APIoptimizeToursbatchOptimizeTours。如需详细了解如何在 Route Optimization API 中请求路线令牌,请参阅过渡多段线和路线令牌

  2. 设置 Routes API 或 Routes Preferred API 请求,以满足使用路线令牌的要求:

    • travel_mode 设置为 DRIVINGTWO_WHEELER
    • routing_preference 设置为 TRAFFIC_AWARETRAFFIC_AWARE_OPTIMAL
    • 请勿使用 Via 航点

第 2 步:将路线令牌传递给 Navigation SDK

  1. 存储路线令牌:在 Navigation SDK 中,设置一个字符串来存储路线令牌。例如:

    String routeToken = "route token returned by Routes API";

    返回的路线令牌示例:

    {
    // Other fields
    "routeToken": "CqMBCjoKCJQOor5DHcwiEhBon3XpHXFnVvDeWMwd9PpAGgz6wtnFDKIBrAHTARpCApUDSggAAAAACjcrP3gBEAQaTApKChgKDQoCCAERAAAAAACAZkAR3SQGgZUXdUASEggAEAMQBhATEBIYAkIEGgIIBSIYChZ2VEJiWlBPSkk1aU5wUVRzNTV5d0FRKAEiFQBcJuds-Efh-2QZhOMTtUCCxEVL_g",
    }
    
  2. 使用 Navigator.setDestinations 方法将路线令牌传递给 Navigation SDK,并指定您在创建路线令牌时使用的相同目的地航点:

    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 中指定的与航点相关的选项。