ターンバイターン方式のデータフィードの詳細

ターンバイターン データフィードは、地図ベースのナビゲーション ガイダンス用に設計されていないデバイスに、ナビゲーション専用情報を提供します。指定した要素を使用して、今後の操作を指定します。

  • アイコン(左折、右折、U ターン)
  • ロータリーの交差点の番号
  • 道路名
  • 次のナビゲーション ステップまたは最終目的地までの推定距離と推定時間

ターンバイターン フィードを使用すると、小画面ディスプレイなど、Navigation SDK の完全な UI が適切でないエクスペリエンスを作成できます。たとえば、2 輪車の運転手向けに、ナビゲーションのみのガイダンスを投影して、気を散らすことなく、より速く、より確実に目的地に到着できるようにすることができます。

必須のナビゲーション表示要素

50 フィート先で教会通りに右折することを示すモバイル画面。画面下部には、目的地までの残り時間が 13 分、残り距離が 2.1 マイルとなっています。

各ナビゲーション ステップの主なフィールドは、道路のフルネーム、操作、ステップの合計距離です。これらは GMSNavigationStepInfo で使用できます。

ルート全体については、現在のステップまたは目的地までの残り時間と距離を表示できます。これらはすべて GMSNavigationNavInfo で使用できます。右側の画像は、これらの基本的なナビゲーション要素の例を示しています。

イベント リスナーを設定する

ナビゲーション専用のデータを使用するには、didChangeNavInfo イベントのイベント リスナーを実装する必要があります。イベント リスナー内で、ルートやステップの情報にアクセスして、ユーザーにターンバイターン ナビゲーションを提供します。

イベント ハンドラを実装するには、地図のビュー コントローラに GMSNavigatorListener プロトコルを実装する必要があります。Navigation SDK for iOS でのイベント処理について詳しくは、ナビゲーション イベントをリッスンするをご覧ください。

didChangeNavInfo イベントを処理する

didChangeNavInfo イベントのリスナーを作成して、アプリにルート案内機能を追加します。イベント リスナーで、次のクラスと列挙型を使用してルート案内を制御します。

  • GMSNavigationNavInfo - ナビゲーションの状態に関する情報を定義するクラス。

  • GMSNavigationStepInfo - ナビゲーション ルート上の 1 つのステップに関する情報を定義するクラス。

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

GMSNavigationNavInfonavState プロパティを使用して、ナビゲーションの現在の状態を取得します。これは次のいずれかです。

  • Enroute - 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 などのアイコンへの 1 対 1 のマッピングを設定できます。ただし、一部の操作は他の操作と特性を共有するため、複数の操作を 1 つのアイコンにマッピングすることもできます。たとえば、GMSNavigationManeuverTurnLeftGMSNavigationManeuverOnRampLeft の両方を左折アイコンにマッピングできます。

一部の操作には「時計回り」または「反時計回り」のラベルが追加されています。これは、国の運転側に基づいて SDK によって決定されます。たとえば、左側通行の国では、ドライバーは時計回りにロータリーや U ターンをしますが、右側通行の国では反時計回りに曲がります。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];