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

即時路線資料動態饋給會為非以地圖為導航指引的裝置提供僅限導航的資訊。這項服務會根據您提供的元素,提供即將執行的動作:

  • 圖示 (左、右、迴轉)
  • 圓環內的轉彎號誌
  • 道路名稱
  • 預估抵達下一個導航步驟或最終目的地的距離和時間

您可以使用即時路線動態饋給,在不適合使用完整 Navigation SDK UI 的情況下 (例如小螢幕顯示器) 建立體驗。舉例來說,您可以為二輪車乘客使用這項功能,在車輛行駛時提供導航指引,協助他們在最少干擾的情況下,更快、更有信心地抵達目的地。

必要的導覽顯示元素

行動裝置螢幕顯示即將在 50 英尺處右轉至 Church Street。畫面底部顯示,到達目的地的剩餘時間為 13 分鐘,剩餘距離為 2.1 英里。

每個導航步驟的主要欄位是完整道路名稱、操控方式和步驟的總距離,這些欄位可在 GMSNavigationStepInfo 中找到。

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

設定事件監聽器

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

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

處理 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 屬性,取得導覽的目前狀態,如下所示:

  • EnrouteGMSNavigationNavStateEnroute 狀態表示導航功能目前處於啟用狀態,且使用者正在沿著指定路線行駛。可取得目前即將執行的機動步驟相關資訊。

  • 重新規劃路線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];