精细数据 Feed 可为并非专为基于地图的导航指导而设计的设备提供仅限导航的信息。它会使用您提供的元素提供即将进行的动作:
- 图标(左、右、调头)
- 在环岛中转弯数字
- 道路名称
- 距离下一个导航步骤或最终目的地的估算距离和时间
您可以使用精细导航功能来打造不适合使用完整 Navigation SDK 界面的体验,例如适合小屏幕显示屏的体验。例如,您可以将此模型用于双轮机动车乘客,在这种情况下,您可以投影纯导航指导,帮助他们更快、更自信地到达目的地,同时最大限度地减少分心。
基本导航显示元素
每个导航路段的主要字段包括 GMSNavigationStepInfo 中的完整道路名称、操作和路段总距离。
对于整体行程,您可能想要显示到当前路段或目的地的剩余时间和距离,所有这些信息都可以在 GMSNavigationNavInfo 中找到。右图显示了这些基本导航元素的示例。
设置事件监听器
如需使用仅限导航的数据,您必须为 didChangeNavInfo
事件实现事件监听器。在事件监听器中,访问行程和路段信息,为用户提供精细导航。
若要实现事件处理脚本,地图的视图控制器必须实现 GMSNavigatorListener
协议。如需详细了解如何在 Navigation SDK for iOS 中处理事件,请参阅监听导航事件。
处理 dodChangeNavInfo 事件
为 didChangeNavInfo
事件创建监听器,以为您的应用添加精细导航支持。在事件监听器中,使用以下类和枚举来控制精细导航:
GMSNavigationNavInfo - 用于定义导航状态相关信息的类。
GMSNavigationStepInfo - 用于定义导航路线上某个路段的相关信息的类。
GMSNavigationNavState - 用于定义导航的当前状态(例如正在路线、重新规划路线或已停止)的枚举。
GMSNavigationDrivingSide - 用于定义此路段位于右行驶路线还是左开路线的枚举。
GMSNavigationManeuver - 用于定义要执行的导航操作的枚举,例如左转或右转。
下面显示了 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 ... } } } }
导航状态
使用 GMSNavigationNavInfo 的 navState
属性获取当前导航状态,可以是以下状态之一:
正在路由 -
GMSNavigationNavStateEnroute
状态表示引导式导航当前处于活跃状态,且用户位于提供的路线上。提供了有关当前即将到来的操作步骤的信息。正在重选 -
GMSNavigationNavStateRerouting
表示导航正在进行中,但导航器查找的是新路线。由于还没有新路线,即将到来的操作步骤不可用。已停止 -
GMSNavigationNavStateStopped
表示导航已结束。例如,当用户退出应用中的导航时,导航会停止。在示例应用中,GMSNavigationNavStateStopped
状态会清除导航信息显示,以防止显示延迟步骤说明。
车道导航
Navigation SDK 将导航转弯卡片中的车道表示为 GMSNavigationLane
和 GMSNavigationLaneDirection
数据对象。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 枚举定义了在导航时可能发生的每个操作,并且您可以从 GMSNavigationStepInfo 的 maneuver
属性获取指定步骤的动作。
您必须创建操作图标,并将其与相关的操作方式配对。
对于某些操作,您可以设置到图标的一对一映射,例如 GMSNavigationManeuverDestinationLeft
和 GMSNavigationManeuverDestinationRight
。但是,由于某些操作与其他方法具有相同的特征,因此您可能需要将多种操作映射到单个图标。例如,GMSNavigationManeuverTurnLeft
和 GMSNavigationManeuverOnRampLeft
都可以映射到左转图标。
一些操作包含额外的“顺时针”或“逆时针”标签,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];