规划路线

有时,您可能希望规划应用为驾驶员提供的路线。使用 Routes API(或 Routes Preferred API)的路由令牌有助于您为规划路线指定两项内容:

  • 路线的多段线

  • 您的路线目标

例如,以下是您可能设置的一些路由目标示例:

  • 最大限度地缩短送货时间:提供食物的商家可能希望最大限度地缩短送货时间。

  • 最大限度地缩短行程时间或燃料消耗:物流企业可能希望提高司机的效率并降低燃料费用。

  • 最大限度地缩短到达目的地所需的时间:服务调度操作可能希望最大限度地缩短操作人员处理作业请求所需的时间。

  • 降低成本并提高安全性:拼车企业可能会希望找到一条对乘客费用更低的路线,并出于安全考虑而避开某些区域。

如需详细了解如何使用路由令牌规划路线,请参阅请求路由令牌

为什么要将路由令牌用于路线目标

借助 Routes API 或 Routes Preferred API 的路由令牌,您可以更好地控制所提供的路由:

  • 提前规划路线,以便 Navigation SDK 尽可能使用。

  • 选择供 Navigation SDK 使用的最佳路线。 如果在 Routes API 中生成路由时请求路由令牌,则会获得生成的每个路由的路由令牌。然后,您可以在将路线传递给 Navigation SDK 时为要使用的路线选择令牌。

  • 提前估算价格,包括估算预计到达时间和距离。虽然实际费用和时间可能会有所不同,但此估算可以缩小预期路线费用与实际路线费用之间的差距。

  • 指定更高级的路由目标,例如节能路线或最短路线。

Routes API 路由令牌的工作原理

您可以使用 Routes API 或 Routes Preferred API 来根据路线目标规划路线。Routes API 会返回一个路线令牌,您可以将该令牌传递给 Navigation SDK,以指导它如何规划您的车辆。

从 Routes API 请求和使用路由令牌时,会发生以下情况:

  1. Routes API 会返回包含路线多段线和路线目标的加密路线令牌。

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

  3. Navigation SDK 会检索路线;如果路线因条件变化而不可用,它会检索最匹配的路线。

  4. 驾车时,如果路况或其他路况发生变化,或者车辆偏离规划路线,修改后的路线将不断尝试根据令牌中的路线目标匹配最佳路线。

此过程可最大限度增加实际路线与计划路线的接近程度。

为什么不能准确遵循规划的路线

您可以将规划的路线和路线目标视为要遵循的准则:它们并非规定性。由于路况、出发位置或自您创建规划路线以来发生的其他参数发生了变化,您规划的路线与引导式导航提供的路线之间可能存在差异。这种差异可能会导致距离和预计到达时间以及其他重要行程质量方面的计划目标与实际目标不匹配。

使用路由令牌规划路线

若要规划路线,您可以创建一个路线令牌,然后将其传递给 Navigation SDK,如以下步骤所述:

第 1 步:使用 Routes 或 Routes Preferred API 创建路由令牌

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

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

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

  2. 设置路由请求,以满足使用路由令牌的要求:

    • travel_mode 设置为 DRIVING
    • routing_preference 设置为 TRAFFIC_AWARETRAFFIC_AWARE_OPTIMAL
    • 不使用 Via 航点

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

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

    let routeToken = "route token returned by Routes API"

    返回的路由令牌示例:

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

    mapView.navigator?.setDestinations([waypoint1, waypoint2], routeToken: routeToken, callback: {...})

Navigator.setDestinations 方法会返回请求的状态。如果找到了从用户所在位置到指定目的地的路线,则返回 RouteStatus.OK

如需详细了解此方法,请参阅 Navigator.setDestinations

示例

以下代码示例演示了如何检索规划路线。

Swift

let location = CLLocationCoordinate2D(latitude: 47.67, longitude: -122.20)
let waypoint1 = GMSNavigationWaypoint(location: location, title: "waypoint from location")!
let waypoint2 = GMSNavigationWaypoint(placeID: "samplePlaceID", title: "waypoint from Place ID")!

let routeToken = "route token returned by Routes API"
mapView.navigator?.setDestinations([waypoint1, waypoint2], routeToken: routeToken, callback: {...})

Objective-C

CLLocationCoordinate2D location = CLLocationCoordinate2DMake(47.67, -122.20);
GMSNavigationWaypoint *waypoint1 = [[GMSNavigationWaypoint alloc] initWithLocation:coordinate title:@"waypoint from location"];
GMSNavigationWaypoint *waypoint2 = [[GMSNavigationWaypoint alloc] initWithPlaceID:@"samplePlaceID"
                                                                            title:@"waypoint from Place ID"];
NSString *routeToken = @"route token returned by Routes API";

[mapView.navigator setDestinations:@[waypoint1, waypoint2]
                         routeToken:routeToken
                           callback:^(GMSRouteStatus routeStatus){...}];

路线令牌与 Navigation SDK 的交互方式

下面介绍了由 Navigation SDK 生成的路线与路线令牌中的计划路线的交互方式:

  • 替换之前设置的所有目的地。

  • 使用车辆出发位置。

  • 根据道路和路况调整。请参阅为何可能无法准确遵循规划的路线

  • 忽略以下与路由相关的选项,因为它们是不需要的选项:

    • avoidsHighways
    • avoidsTolls
    • avoidsFerries
    • licensePlateRestriction
  • 关注

    • 与航点相关的选项,例如道路一侧偏好设置。

    • 路由目标。如果 Navigation SDK 必须调整返回的路线,它会使用您在请求路线令牌时指定的路线目标。因此,您应该使用您在 Routes API 中指定的相同航点相关选项。