即時路線資料動態饋給的詳細資料

即時路線資料動態饋給會為未設計地圖導航指引的裝置,提供僅限導航的資訊。這項功能會根據您提供的元素,顯示即將進行的動作:

  • 圖示 (向左、向右、迴轉)
  • 迴轉道中的數字
  • 道路名稱
  • 預估距離和時間,直到抵達下一個導航步驟或最終目的地

您可以運用導航動態消息建立體驗,例如在小螢幕上顯示導航資訊,這時就不適合使用完整的 Navigation SDK UI。舉例來說,你可以為兩輪車騎士使用這項功能,只投影導航指引,協助他們以最少干擾更快抵達目的地,並減少走錯路的機會。

必要的導覽顯示元素

手機螢幕顯示即將在 50 英尺後右轉進入 Church Street。畫面底部顯示抵達目的地還需 13 分鐘,以及剩餘 2.1 英里。

每個導覽步驟的主要欄位是完整路名、動作和步驟總距離,這些資訊可在 GMSNavigationStepInfo 中取得。

對於整體行程,您可能想顯示目前步驟或目的地的剩餘時間和距離,這些資訊都可在 GMSNavigationNavInfo 中取得。 右側圖片顯示這些重要導覽元素的範例。

設定事件監聽器

如要使用僅限導航的資料,您必須實作 didChangeNavInfo 事件的事件監聽器。在事件監聽器中,存取行程和步驟資訊,為使用者提供即時路線導航。

如要實作事件處理常式,地圖的檢視控制器必須實作 GMSNavigatorListener 通訊協定。如要進一步瞭解如何處理 iOS 版 Navigation SDK 中的事件,請參閱「監聽導覽事件」。

處理 didChangeNavInfo 事件

建立 didChangeNavInfo 事件的監聽器,在應用程式中新增導航支援。在事件監聽器中,使用下列類別和列舉來控制導航:

以下是 didChangeNavInfo 事件的事件監聽器範例:

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
          ...
        }
      }
    }
  }

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;
        ...
      }
    }
    ...
  }

使用 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];