精细导航数据 Feed 的详细信息

精细导航数据 Feed 可为未 专为基于地图的导航指导而设计。它能提供即将开始的机操作 提供的元素:

  • 图标(向左、向右、调头)
  • 在环岛中转弯数字
  • 道路名称
  • 预计距离和时间 目标账号

您可以使用精细导航来打造 Navigation SDK 界面不合适,例如对于小屏幕显示屏。对于 例如,您可以对骑双轮机动车的乘客使用此设置, 项目导航仅提供指导,帮助他们更快到达目的地 轻松自信、尽可能减少干扰

基本导航显示元素

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

每个导航路段的主要字段为完整的道路名称、 具体位置包括: GMSNavigationStepInfo.

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

设置事件监听器

要使用仅限导航的数据,必须为 didChangeNavInfo 事件。在事件监听器中,访问行程和 步骤信息,为您的用户提供精细导航。

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

处理 didChangeNavInfo 事件

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 枚举定义了导航时可能发生的每种操作, 可以通过 maneuver 属性获取指定步骤的操作 GMSNavigationStepInfo

您必须创建操作图标,并将其与相关操作对应起来。 对于某些操作,您可以设置图标的一对一映射,例如 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];