iOS 開発者ガイド for SDK

徒歩とドライブに最適なターン・バイ・ターンナビ (矢印ナビ)

注意 : [ 重要 ] ターンバイターンガイダンス API を使用するアプリケーション開発者は、予期されるすべての使用シナリオでアプリケーションを徹底的にテストして、安全で正しい動作を保証する必要があります。 アプリケーション開発者は、アプリユーザーに以下を含む ( ただし、これらに限定されない ) 義務について警告する責任があります。
  1. 安全でない、または違法な状況につながる可能性のある指示に従わないでください。
  2. すべての地域の法律に従ってください。
  3. 運転中に携帯電話またはそのフィーチャーの一部を使用することは禁止されている場合がありますので、ご了承ください。
  4. 運転中は、常にハンドルから手を離さないでください。
  5. 運転中の第一の優先事項は、道路の安全性である必要があります。

SDK for iOS は、徒歩、車、トラックのルートでのナビゲーションをサポートしています。 この機能を使用すると、アプリは現在のデバイス位置を計算されたルートと照合して確認し、視覚的および音声的にジャストインタイムのナビゲーション指示を提供できます。 徒歩およびドライブでは、次の 2 つのナビゲーションモードがサポートされています。 ターン・バイ・ターンナビ (矢印ナビ)モード。計算されたルートを取得し、現在の位置をルートと照合します。トラッキングモードでは、ルートを使用せずに現在の位置のみを追跡します。 追跡モードでは、音声による指示は提供されません。 音声ガイドの詳細 については、音声ガイドを参照してください。

注 : 車両または歩行者ナビゲーションを実行している間、アプリケーションはナビゲーション固有のマップスキームに切り替える必要があります。 これらのスキームの使用方法の詳細 については、「マップスキーム」を参照してください。
図 1. 速度警告付きターン・バイ・ターンナビ (矢印ナビ)

GitHub でのナビゲーションの例

この機能を示す例について は、 https://github.com/heremaps/ (Obj-C) および https://github.com/heremaps/ (Swift) を参照してください。

ナビゲーションの再経路化

ドライブにターン・バイ・ターンナビ (矢印ナビ)を使用している場合、実際の NMAMapRoute オン NMAMapView オブジェクトを表示するには、再ルーティングのデリゲートメソッドを実装する必要があります。 ナビゲーション管理者がルートと実際のユーザー位置の間の偏差を判断すると、再経路化がトリガされます。 Navigation Manager は、次のメソッドをトリガーします。
  • navigationManager:navigationManagerWillReroute: - 再経路化がトリガされたとき。
  • navigationManager:didRerouteWithError: - 再経路化が完了したとき ( 新しいルートが作成されたとは限りません ) 。
  • navigationManager:didUpdateRouteWithResult: - ナビゲートしているルートに変更が加えられたとき。
navigationManager:didUpdateRouteWithResult:NMAMapRoute 再描画の主な場所です。 このメソッドは、さまざまなシナリオで呼び出されることがあります。
  • ユーザーがを使用してルートをプログラム的に変更しました
    [[NMANavigationManager sharedNavigationManager] setRoute:newRoute];
  • ナビゲーションルートと実際のユーザー位置の間に偏差があるため、ルート変更に成功しました。
  • ナビゲーションが停止したとき。
navigationManager:didUpdateRouteWithResult: 次のコードは、実装の例です。
- (void)navigationManager:(nonnull NMANavigationManager *)navigationManager
 didUpdateRouteWithResult:(nonnull NMARouteResult *)routeResult
{
  if (routeResult && routeResult.routes.count > 0) {
    // Let's add the 1st result onto the map
    self.route = routeResult.routes[0];

    // remove previously created map route from map
    if (self.mapRoute) {
      [self.mapView removeMapObject:self.mapRoute];
    }
    // create new one based on provided route
    if (route) {
      self.mapRoute = [NMAMapRoute mapRouteWithRoute:self.route];
      self.mapRoute.traveledColor = [UIColor clearColor];
      [self.mapView addMapObject:self.mapRoute];
    }
  } else {
    // The routeResult doesn't contain route for redraw.
    // It might occur when navigation stop was called.
  }
}
        

背景ナビゲーション

HERE SDK モードを運転に使用している場合は 、アプリがバックグラウンドにあるときにガイダンス ( 音声案内やイベントコールバックを含む ) を実行するようにターン・バイ・ターンナビ (矢印ナビ)を設定することもできます。 ただし、以下の制限事項に注意してください。
  • 前景色のナビゲーションシナリオとは異なり ストリームマップ データでは背景のナビゲーション中に HERE SDK を使用しません。 バックグラウンドでのナビゲーションをサポート するには、アプリがバックグラウンドでマップ データを使用できる場合に、 NMAMapLoader を使用して HERE ( 現在の都市または州など ) をプリロードする必要があります。
  • アプリがバックグラウンドにある場合、マップをレンダリング ( 外部デバイスに送信 ) することはできません。
  • アプリがフォアグラウンドにあるときに、ナビゲーションが以前に有効になっていない限り、バックグラウンドからナビゲーションを開始できません。 そのため、バックグラウンドで直接起動されるアプリは、ナビゲーションセッションを確実に開始することはできません。 NMANavigationManager クラスのこのチェックプロパティの詳細については、 backgroundNavigationStartEnabled を参照してください。

この機能を有効にするには、次の手順を実行します。

  1. Xcode 機能 タブで バックグラウンドモードを有効に し、次のエントリを確認します。
    • オーディオと AirPlay
    • 位置情報の更新
    図 2. Xcode の [ バックグラウンドモード ] オプション
  2. 次に、次の場所でバックグラウンドナビゲーションをオンにします NMANavigationManager
    [NMANavigationManager sharedNavigationManager].backgroundNavigationEnabled = YES;

NMANavigationManager クラス

NMANavigationManager クラスは、運転中または徒歩中に音声および視覚的な指示をユーザーに提供する責任があります。 Navigation Manager はシングルトンクラスであり、を使用してシングルトンインスタンスにアクセスでき [NMANavigationManager sharedNavigationManager]ます。

次の方法でナビゲーションを開始できます。
  • startTurnByTurnNavigationWithRoute: - ナビゲーションモードでナビゲーションマネージャを起動します
  • startTrackingWithTransportMode: - 追跡モードでナビゲーションマネージャを起動します
注 :
  • ナビゲーション操作には、デバイスの配置が必要です。 ナビゲーションマネージャでナビゲーションを開始すると、も NMAPositioningManager 自動的に開始されます。 NMAPositioningManagerHERE SDK では、位置データログとともにを使用して 、シミュレートされたナビゲーションセッションを実行できます。 シミュレートされた位置データの使用の詳細 については、『基本位置』を参照してください。
  • ターン・バイ・ターンナビ (矢印ナビ)モード開始時にユーザーが道路から離れていると、 HERE SDK がただちに音声ガイダンスを開始しないことがあります。 音声ガイダンスが開始されるまで、「最も近い道路に向かう」などのメッセージがアプリケーションに表示されます。

NMANavigationManager また、ナビゲーションセッション中に表示される、距離、進行方向、平均走行速度などの関連情報も提供されます。 次回の操作は currentManeuver 、および nextManeuver 特性で表されます。 currentManeuver は、最も差し迫った操作を表し、 nextManeuver は次に差し迫った操作を表します。 操作には、道路名、進行方向、操作方向などの道路関連の情報が含まれています。

currentManeuver いつでも nextManeuver すぐに利用できるわけではありません。 NMANavigationManagerDelegate プロトコルの navigationManager:hasCurrentManeuver:nextManeuver: メソッドを使用して、操作が更新されたときに通知を受け取ることができます。 詳細については、のセクションを参照 NMANavigationManagerDelegateしてください。

lowSpeedOffsethighSpeedOffsetspeedBoundary 、および speedWarningEnabled のプロパティを利用して、速度警告機能を設定できます。 速度警告が有効になって navigationManager:didUpdateSpeedingStatus:forCurrentSpeed:speedLimit いる場合、境界とオフセットに違反したときに、ナビゲーション管理者デリゲートに通知が送信されます。 速度警告機能はデフォルトで有効になっています。

地図の追跡

NMANavigationManager また、地図追跡をカスタマイズするためのプロパティも提供します。 地図追跡とは、ナビゲーション中に地図の位置情報を自動的に更新する機能のことです。 既定 mapTrackingEnabled では、地図追跡機能は有効になっていますが、プロパティを使用して切り替えることができます。 追跡が有効な場合 mapTrackingOrientation 、プロパティを使用して、マップの向きを動的にするか、常に北を指すようにするかを設定できます。 mapTrackingAutoZoomEnabled また、プロパティを使用して、現在のデバイス速度に基づいてマップがズーム レベルを自動的に調整するかどうかも設定できます。 デフォルトでは、動的方向と自動ズームが有効になっています。

ナビゲーションモードまたはトラッキングモード NMANavigationManager で開始した後、 NMAMapViewtransformCenter プロパティを変更して、 positionIndicator を画面の下部に近づけることができます。 transformCenter 画面の下部にを配置すると、ルートおよび旋削のアニメーションがユーザーにより見やすくなります。

自然指導

NMANavigationManager setNaturalGuidanceMode: 自然なガイダンスを有効にするためにメソッドを使用できます。 自然なガイダンスとは、ナビゲーション中に利用できる動的な情報の一種を指します。この情報には、ルートガイダンスの指示に、決定ポイントの周囲にコンテキスト要素が含まれています。 これらのコンテキスト要素には、サービス、地図作成機能、交通信号などがあります。 自然なガイダンスの指示には、次のようなものがあります。
  • " 右側の公園を通過し、アンダーソンスクールの Bayview street で左折します "
  • " 渋滞ランプを通過し、ガソリンスタンドの手前で右折します "
  • " 右側のドームビルを通過するルートを続行します "

利用可能な自然ガイダンス情報のタイプは NMANaturalGuidanceOption 、 列挙型 (enum) によって定義されます。 これらのオプションは、個別に使用することも、組み合わせて使用することもできますが、特定の操作については通常、 1 つの種類のガイダンス指示のみが提供されます。 自然なガイダンスを無効にするには、 NMANaturalGuidanceNone setNaturalGuidanceMode: メソッドに移動します。

注 : NMANaturalGuidanceLandmark オプションを使用している場合、デバイスのロケールおよびナビゲーション音声パッケージの言語をユーザーの物理的な場所に合わせて設定する必要があります。 そうしないと、ランドマーク情報が話されない場合があります。 たとえば、フランス語を使用する国でナビゲーションを行っている場合、音声パッケージとデバイスのロケールをフランス語に設定する必要があります。

NMANavigationManagerDelegate プロトコル

NMANavigationManager NMANavigationManagerDelegate プロトコルを実装するデリゲートを介して、ナビゲーションイベントをクライアントに通知します。 デリゲートプロトコルには、次のメソッドが含まれています。
  • navigationManagerDidReachDestination: - ナビゲーションの目的地に到達したことを示します
  • navigationManager:hasCurrentManeuver:nextManeuver: - nextManeuver のプロパティにアクセスして取得できる新しい命令情報があることを示します NMANavigationManager
  • navigationManager:didUpdateRoute: –新たに計算された NMARoute オブジェクトを提供します。このオブジェクトを使用して、マップ上に新しいルートをレンダリングできます
  • didUpdateSpeedingStatus:forCurrentSpeed:speedLimit: - ユーザーが指定された道路名と制限速度で制限速度を超過したことを示します
  • navigationManagerDidLosePosition: - システムが GPS 信号を失ったことを示します
  • navigationManagerDidFindPosition: - システムが GPS 信号を取得したことを示します
  • navigationManagerWillReroute: –ルートの再計算が開始されたことを示します。 これは、現在の位置が元のルートから逸脱しているためです
  • navigationManagerDidReroute: - ルートの再計算が完了したことを示します
  • navigationManager:didFindAlternateRouteWithResult: - ナビゲーション管理者が改善されたルートを見つけたことを示します
  • navigationManager:shouldPlayVoiceFeedbackWithText: - 音声フィードバックを再生する準備ができていることを示します。 このコールバックの戻り値を使用して、音声で読み上げるテキストを取得し(該当する場合)、現在の音声フィードバックを再生するかどうかを制御します
  • navigationManager:willPlayVoiceFeedbackWithText: - 音声フィードバックイベントが発生することを示します ( たとえば、操作が発表されたとき ) 。
  • navigationManager:didPlayVoiceFeedbackWithText: - 音声フィードバックイベントが終了したことを示します
  • navigationManager:didFindAlternateRoutes: - 交通渋滞回避モードが有効になっているナビゲーション中に代替ルートが発見されたことを示します

車線情報

NMANavigationManagerDelegate には、 navigationManager:didUpdateLaneInformation:roadElement: メソッドもあります。 このコールバックは、高速道路出口の前など、車線情報を提示する必要があるルートの地点に到着したときに発生します。 NMALaneInformation このクラスは、車線変更の方向と、この車線が現在のルートにあるかどうかを表します。 たとえば navigationManager:didUpdateLaneInformation:roadElement: 、ユーザーが交差点に移動すると、アプリケーションがコールバックを受け取ることがあります。 ルートに左折が必要で、現在の道路に 3 つのレーン(左車線と 2 つの直線車線)がある場合 NMALaneInformation 、コールバックには 3 つの物体が含まれています。 NMALaneInformation オブジェクトは常に左から右の順序でコールバックメソッドで返されるため、最初のオブジェクト NMALaneInformation には "left" という directions プロパティと、レーンが現在のルートにあるかどうかを示す recommendationState プロパティがあります。 レーンがオンかオフルートかを判断するのに十分なデータがない場合は、 recommendationState プロパティ NMALaneInformationRecommendationStateNotAvailable が返されます。

注 : レーンに関する情報を取得するには、ルートに追加のマップ データが必要です。 まず NMAMapDataPrefetcher 、またはを使用 NMAMapLoaderして、必要なマップ データをダウンロードする必要があります。 そうしないと、レーン情報が正しく返されません。

学校区

NMASchoolZoneWarnerDelegate コールバックメソッドを使用して、ユーザーが学校のゾーンに入っているか、または学校のゾーンから出ているかを確認できます。 コールバック didDetectSchoolZone は、ユーザーが現在のルートの方向に沿っている場合に、前に学校 NMARoadElement のゾーンがあると発生します。このゾーンは、現在のルートの方向に沿っている場合に、学校のゾーンがある場合には、その約 100 メートル先 コールバック didUpdateSchoolZone は、ユーザーが学校区に入ったとき、または左側に入ったときに発生します。 例 :

- (void)schoolZoneWarner:(nonnull NMASchoolZoneWarner *)schoolZoneWarner
   didDetectSchoolZone:(nonnull NMASchoolZoneNotification *)notification
{
  // distance to the road element with school zone
  NSUInteger distance = notification.distance;
  // road element associated with this school zone
  NMARoadElement* roadElement = notification.roadElement;
  // begin time, e.g. Monday 09:00
  NSDate* timeBegin = notification.schoolZoneInfo.timeBegin;
  // end time, e.g. Monday 17:00
  NSDate* timeEnd = notification.schoolZoneInfo.timeEnd;
  float speedLimit = notification.schoolZoneInfo.speedLimit;
}

- (void)schoolZoneWarner:(nonnull NMASchoolZoneWarner *)schoolZoneWarner
   didUpdateSchoolZone:(nonnull NMASchoolZoneInfo *)zoneInfo
{
  if (zoneInfo) {
    // user enters school zone
    float speedLimit = zoneInfo.speedLimit;
  } else {
    // user left school zone
  }
}
        
開発者は、のユーティリティメソッドを使用 NMASchoolZoneWarnerDelegate して、特定の道路要素に学校区があるかどうかを確認することもできます。 例 :

 // Get road element from geo coordinate
 // Use instance of NMAMapView to get roadElementAtCoordinates
NMARoadElement* roadElement = [NMAMapView roadElementAtCoordinates:coordinate];
 if (roadElement) {
   // Check whether road element has active school zone
   NMASchoolZoneInfo* info = [NMASchoolZoneWarner schoolZoneInfoForRoadElement:roadElement];
   if (info) {
     // provided road element has school zone
   }

   // Check whether school zone is active at specific time
   // GMT: Sunday, 8 March 2020, 00:00:00
   NSDate *sunday = [NSDate dateWithTimeIntervalSince1970:1583625600];
   NMASchoolZoneInfo* infoAtTime = [NMASchoolZoneWarner schoolZoneInfoForRoadElement:roadElement
                                          time:sunday];
   if (infoAtTime) {
     // school zone is active at provided time
   }
 } else {
   // NMARoadElement is nil either because there is no road at the provided location or map
   // data is not loaded. Use NMAMapLoader API to download map area, or use road element from
   // another provider, e.g. from the calculated route.
 }
        

現実的なビュー : 2D 署名とジャンクションビュー

レーン情報機能で提供されるデータに加え て、 SDK for iOS を使用して、特定の高速道路で標識や交差点の画像プレビューを提供することもできます。 たとえば、ユーザーが高速道路の分岐点に近づくと、高速道路の上に 2 つの指示標識が表示され、ジャンクションの近くにあるレーンのプレビューが表示されます。インジケータの矢印が正しい車線をハイライトして表示されます。 これらの画像プレビューは 2D 署名と分岐点ビューと呼ばれ、これらを組み合わせてリアリスティックビューと呼ばれます。

図 3. 2D 署名の例
図 4. 交差点表示の例

リアリスティックビュー機能は、デフォルトでは無効になっています。 有効にするには、 NMANavigationManager.realisticViewMode プロパティを使用して表示モードを NMARealisticViewDay または NMARealisticViewNight に設定します。 次に NMANavigationManager.realisticViewAspectRatios 、プロパティを使用して、目的の画像縦横比を登録します。

デリゲートの実装を追加すると、ユーザーが Realistic View をサポートするハイウェイセクションに近づくと、アプリケーションは次のメソッドコールバックを受信し始めます。 次の操作 コールバックは、 2 番目の次の操作で現実的なビューが利用可能になったとき(たとえば、次の操作が交差点に入るとき)に発生 し、現在の操作コールバックは、直近の操作(ユーザーが交差点に入るときなど)を入力したときに発生します。
  • navigationManager:didUpdateRealisticViewsForCurrentManeuver:
  • navigationManager:didUpdateRealisticViewsForNextManeuver:
上記の最初の 2 つのメソッドコールバックは NSDictionary 、 1 realisticViewsつ以上 NSDictionary のイメージを保持するという名前のオブジェクトを返します。 NSDictionary から画像のを取得 realisticViewsするには、次のいずれかの縦横比の文字列をキーとして使用します。
  • NMARealisticView16x9Key
  • NMARealisticView3x5Key
  • NMARealisticView4x3Key
  • NMARealisticView5x3Key
このステップを実行した後、スルーキー NMANavigationManagerSignpostKey および NMANavigationManagerJunctionViewKey キー NSDictionary から署名ポストおよび交差点表示の画像を抽出できます。
注 : 複数の縦横比を追加して、同じ署名または分岐点ビューの複数の画像を受信できます。 ただし、パフォーマンスに影響が出る可能性があることに注意してください。
注 : Realistic View イメージを消去するに navigationManagerDidInvalidateRealisticViews: は、 Navigation Manager のデリゲートもメソッドを実装してリッスンする必要があります。 このメソッドは、現実的なビューイメージを閉じる必要がある場合 ( ユーザーがジャンクションに入った後など ) に呼び出されます。

navigationManager:didUpdateRealisticViewsForCurrentManeuver: 次に、実装の例を示します。


- (void)navigationManager:(NMANavigationManager *)navigationManager
    didUpdateRealisticViewsForCurrentManeuver:(NSDictionary *)realisticViews
{
  NSDictionary *realisticView = [realisticViews objectForKey:NMARealisticView3x5Key];
  NMAImage *junction = [realisticView objectForKey:NMANavigationManagerJunctionViewKey];
  if (junction) {
    //** display the junction image
  }
  NMAImage *signpost = [realisticView objectForKey:NMANavigationManagerSignpostKey];
  if (signpost) {
    //** display the signpost image
  }
}