即時路線資料動態饋給會為非以地圖為導航指引的裝置提供僅限導航的資訊。這項服務會根據您提供的元素,提供即將執行的動作:
- 圖示 (左、右、迴轉)
- 圓環內的轉彎號誌
- 道路名稱
- 預估抵達下一個導航步驟或最終目的地的距離和時間
您可以使用即時路線動態饋給,在不適合使用完整 Navigation SDK UI 的情況下 (例如小螢幕顯示器) 建立體驗。舉例來說,您可以為二輪車乘客使用這項功能,在車輛行駛時提供導航指引,協助他們在最少干擾的情況下,更快、更有信心地抵達目的地。
必要的導覽顯示元素
每個導航步驟的主要欄位是完整道路名稱、操控方式和步驟的總距離,這些欄位可在 GMSNavigationStepInfo
中找到。
對於整體行程,您可能會想顯示目前步驟或目的地剩餘的時間和距離,這些資訊全都位於 GMSNavigationNavInfo
中。右圖顯示這些必要導覽元素的範例。
設定事件監聽器
如要使用僅限導覽資料,您必須為 didChangeNavInfo
事件實作事件監聽器。在事件監聽器中存取行程和步驟資訊,為使用者提供即時路線導航。
如要實作事件處理常式,地圖的檢視控制器必須實作 GMSNavigatorListener
通訊協定。如要進一步瞭解如何在 Navigation SDK for iOS 中處理事件,請參閱「監聽導覽事件」。
處理 didChangeNavInfo
事件
為 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
屬性,取得導覽的目前狀態,如下所示:
Enroute:
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];