启用精细数据 Feed

精细数据 Feed 可为并非专为基于地图的导航指导而设计的设备提供仅限导航的信息。它会使用您提供的元素提供即将进行的动作:

  • 图标(左、右、调头)
  • 在环岛中转弯数字
  • 道路名称
  • 距离下一个导航步骤或最终目的地的估算距离和时间

您可以使用精细导航功能来打造不适合使用完整 Navigation SDK 界面的体验,例如适合小屏幕显示屏的体验。例如,您可以将此模型用于双轮机动车乘客,在这种情况下,您可以投影纯导航指导,帮助他们更快、更自信地到达目的地,同时最大限度地减少分心。

基本导航显示元素

一个手机屏幕,显示了即将在 50 英尺处进入教堂街的右转弯。在屏幕底部,到达目的地的剩余时间为 13 分钟,剩余距离为 2.1 英里。

每个导航路段的主要字段包括 GMSNavigationStepInfo 中的完整道路名称、操作和路段总距离。

对于整体行程,您可能想要显示到当前路段或目的地的剩余时间和距离,所有这些信息都可以在 GMSNavigationNavInfo 中找到。右图显示了这些基本导航元素的示例。

设置事件监听器

如需使用仅限导航的数据,您必须为 didChangeNavInfo 事件实现事件监听器。在事件监听器中,访问行程和路段信息,为用户提供精细导航。

若要实现事件处理脚本,地图的视图控制器必须实现 GMSNavigatorListener 协议。如需详细了解如何在 Navigation SDK for iOS 中处理事件,请参阅监听导航事件

处理 dodChangeNavInfo 事件

didChangeNavInfo 事件创建监听器,以为您的应用添加精细导航支持。在事件监听器中,使用以下类和枚举来控制精细导航:

下面显示了 didChangeNavInfo 事件的事件监听器示例:

Objective-C

  // ViewController.h
  @interface SomeViewController () <GMSNavigatorListener>

  @end

  // ViewController.m
  @implementation SomeViewController
  // Some initialization code.
  ... {
    ...
    [_mapView.navigator addListener:self];
    ...
  }

  #pragma mark GMSNavigatorListener
  - (void)navigator:(GMSNavigator *)navigator didUpdateNavInfo:(GMSNavigationNavInfo *)navInfo {
    // Get the current step information
    if (navInfo.navState == GMSNavigationNavStateEnroute) {
      GMSNavigationStepInfo *currentStep = navInfo.currentStep;
      if (currentStep) {
        ...
        roadNameLabel.text = currentStep.simpleRoadName;
        ...
      }
    }
    ...
  }

Swift

  // ViewController.swift
  class SomeViewController: UIViewController {
    ...
    mapView.navigator?.add(self);
    ...
  }

  extension SomeViewController: GMSNavigatorListener {
    func navigator(_ navigator: GMSNavigator,
                   didUpdateNavInfo navInfo: GMSNavigationNavInfo) {

      // Get the current step information
      if navInfo.navState == .enroute {
        if let currentStep = navInfo.currentStep {
          ...
          roadNameLabel.text = currentStep.simpleRoadName
          ...
        }
      }
    }
  }

使用 GMSNavigationNavInfonavState 属性获取当前导航状态,可以是以下状态之一:

  • 正在路由 - GMSNavigationNavStateEnroute 状态表示引导式导航当前处于活跃状态,且用户位于提供的路线上。提供了有关当前即将到来的操作步骤的信息。

  • 正在重选 - GMSNavigationNavStateRerouting 表示导航正在进行中,但导航器查找的是新路线。由于还没有新路线,即将到来的操作步骤不可用。

  • 已停止 - GMSNavigationNavStateStopped 表示导航已结束。例如,当用户退出应用中的导航时,导航会停止。在示例应用中,GMSNavigationNavStateStopped 状态会清除导航信息显示,以防止显示延迟步骤说明。

车道导航

Navigation SDK 将导航转弯卡片中的车道表示为 GMSNavigationLaneGMSNavigationLaneDirection 数据对象。GMSNavigationLane 对象表示导航期间的特定车道,并且具有 GMSNavigationLaneDirection 对象列表,这些对象描述可从该车道进行的所有转弯。

使用 recommended 字段标记驾驶员在车道上建议行驶的方向。

车道导航示例

以下代码段展示了上方屏幕截图中显示的车道的数据表示形式。

// Lane 1
GMSNavigationLaneDirections =
  [{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeNormalLeft, /*recommended=*/ true}]

// Lane 2
GMSNavigationLaneDirections =
  [{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeNormalLeft, /*recommended=*/ true}]

// Lane 3
GMSNavigationLaneDirections =
  [{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeStraight, /*recommended=*/ false}]

// Lane 4
GMSNavigationLaneDirections =
  [{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeStraight, /*recommended=*/ false},
{/*GMSNavigationLaneShape=*/ GMSNavigationLaneShapeNormalRight, /*recommended=*/ false}]

车道导航图片

Navigation SDK 支持为每个导航步骤生成车道图片(由 GMSNavigationStepInfo 传达)。这些图标符合 CarPlay 的图片大小调整指南

Swift

let currentStepInfo = navInfo.currentStep

let options = GMSNavigationStepImageOptions()
options.maneuverImageSize = .square96
options.screenMetrics = UIScreen.mainScreen

let maneuverImage = currentStepinfo.maneuverImage(options: options)
      

Objective-C

GMSNavigationStepInfo *stepInfo = navInfo.currentStep;

GMSNavigationStepImageOptions *options = [[GMSNavigationStepImageOptions alloc] init];
options.maneuverImageSize = GMSNavigationManeuverImageSizeSquare96;
options.screenMetrics = UIScreen.mainScreen;

UIImage* maneuverImage = [stepInfo maneuverImageWithOptions:options];
      

创建操作图标

操作图标

GMSNavigationManeuver 枚举定义了在导航时可能发生的每个操作,并且您可以从 GMSNavigationStepInfomaneuver 属性获取指定步骤的动作。

您必须创建操作图标,并将其与相关的操作方式配对。 对于某些操作,您可以设置到图标的一对一映射,例如 GMSNavigationManeuverDestinationLeftGMSNavigationManeuverDestinationRight。但是,由于某些操作与其他方法具有相同的特征,因此您可能需要将多种操作映射到单个图标。例如,GMSNavigationManeuverTurnLeftGMSNavigationManeuverOnRampLeft 都可以映射到左转图标。

一些操作包含额外的“顺时针”或“逆时针”标签,SDK 会根据一个国家/地区的驾驶方向确定该标签。例如,在道路左侧行驶的国家/地区,驾驶员按顺时针方向转弯转弯或调头,而在道路右侧行驶的国家/地区则是逆时针方向。Navigation SDK 会检测操作是出现在左侧还是右侧路况中,并输出适当的操作。因此,您的操作图标在顺时针操作和逆时针操作时可能有所不同。

展开即可查看不同操作对应的图标示例

示例图标 精细导航
DEPART
UNKNOWN
STRAIGHT
ON_RAMP_UNSPECIFIED
OFF_RAMP_UNSPECIFIED
NAME_CHANGE
TURN_RIGHT
ON_RAMP_RIGHT
TURN_LEFT
ON_RAMP_LEFT
TURN_SLIGHT_RIGHT
ON_RAMP_SLIGHT_RIGHT
OFF_RAMP_SLIGHT_RIGHT
TURN_SLIGHT_LEFT
ON_RAMP_SLIGHT_LEFT
OFF_RAMP_SLIGHT_LEFT
TURN_SHARP_RIGHT
ON_RAMP_SHARP_RIGHT
OFF_RAMP_SHARP_RIGHT
TURN_SHARP_LEFT
ON_RAMP_SHARP_LEFT
OFF_RAMP_SHARP_LEFT
TURN_U_TURN_COUNTERCLOCKWISE
ON_RAMP_U_TURN_COUNTERCLOCKWISE
OFF_RAMP_U_TURN_COUNTERCLOCKWISE
TURN_U_TURN_CLOCKWISE
ON_RAMP_U_TURN_CLOCKWISE
OFF_RAMP_U_TURN_CLOCKWISE
ROUNDABOUT_SHARP_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_RIGHT_CLOCKWISE
ROUNDABOUT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_RIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_CLOCKWISE
ROUNDABOUT_STRAIGHT_COUNTERCLOCKWISE
ROUNDABOUT_STRAIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_CLOCKWISE
ROUNDABOUT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_LEFT_CLOCKWISE
ROUNDABOUT_SHARP_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_LEFT_CLOCKWISE
ROUNDABOUT_U_TURN_COUNTERCLOCKWISE
ROUNDABOUT_U_TURN_CLOCKWISE
ROUNDABOUT_COUNTERCLOCKWISE
ROUNDABOUT_CLOCKWISE
ROUNDABOUT_EXIT_COUNTERCLOCKWISE
ROUNDABOUT_EXIT_CLOCKWISE
MERGE_RIGHT
OFF_RAMP_RIGHT
MERGE_LEFT
OFF_RAMP_LEFT
FORK_RIGHT
TURN_KEEP_RIGHT
ON_RAMP_KEEP_RIGHT
OFF_RAMP_KEEP_RIGHT
FORK_LEFT
TURN_KEEP_LEFT
ON_RAMP_KEEP_LEFT
OFF_RAMP_KEEP_LEFT
MERGE_UNSPECIFIED
DESTINATION
DESTINATION_RIGHT
DESTINATION_LEFT
FERRY_BOAT
FERRY_TRAIN

使用生成的图标

Navigation SDK 支持为给定的 GMSNavigationStepInfo 生成操作图标。这些图标符合 CarPlay 图片大小调整指南

Swift

let currentStepInfo = navInfo.currentStep

let options = GMSNavigationStepImageOptions()
options.maneuverImageSize = .square96
options.screenMetrics = UIScreen.mainScreen

let maneuverImage = currentStepinfo.maneuverImage(options: options)
      

Objective-C

GMSNavigationStepInfo *stepInfo = navInfo.currentStep;

GMSNavigationStepImageOptions *options = [[GMSNavigationStepImageOptions alloc] init];
options.maneuverImageSize = GMSNavigationManeuverImageSizeSquare96;
options.screenMetrics = UIScreen.mainScreen;

UIImage* maneuverImage = [stepInfo maneuverImageWithOptions:options];