iOS 開発者ガイド for SDK

基本的なポジショニング

SDK for iOS を使用して作成されたアプリケーションでは、ユーザーのデバイスの配置機能からの情報を使用して位置を表示し、オプションでリアルタイムで更新を提供できます。 現在の位置を取得するに は、 HERE SDKNMAPositioningManagerインターフェイスを使用するアプリケーションが必要です。 位置の更新または位置不明の通知を受信するには、アプリケーションで次の場所 NMAPositioningManager.h にある通知名 NSNotificationCenter addObserver を使用する必要があります。
  • NMAPositioningManagerDidUpdatePositionNotification
  • NMAPositioningManagerDidLosePositionNotification

ユーザーの現在の位置は NMAPositionIndicator 、クラスを使用して簡単に地図に表示できます。 の各インスタンス NMAMapViewpositionIndicator 、プロパティを介してアクセスされるこのクラスのインスタンスを所有しています。

NMAPositioningManager

この NMAPositioningManager クラスは、現在の位置や平均速度など、デバイスの地理的位置に関する情報を提供します。 NMAPositioningManager はシングルトンクラスであるため、 sharedPositioningManager クラスメソッドを使用してのみアクセスできます。

位置の更新を受け取るに NMAPositioningManager は、オブジェクトが通知にサブスクライブする必要があります。 通知の更新頻度は dataSource 、プロパティで設定されているデータソースに従って制御できます。 デフォルトでは、 dataSource は、以下の便利な NMADevicePositioningMethod オプションのいずれかを使用して、デバイスの更新頻度を設定する NMADevicePositionSource インスタンスです。

  • NMADevicePositioningMethodGPS - 場所が変更されたときに、標準の位置更新を送信します。 これらの更新プログラムは、 iOS API によって提供 CLLocationManager startUpdatingLocationされます。

  • NMADevicePositioningMethodSignificantChanges - ユーザーが長距離を移動した場合にのみ、位置の更新を送信します。 これらの更新プログラムは、 iOS API によって提供 CLLocationManager startMonitoringSignificantLocationChangesされます。 電力を節約する場合は、このオプションを使用します。

注 : CLLocationManager がユーザーの場所に正しくアクセスできるように、 NSLocationWhenInUseUsageDescription をプロジェクト Info.plist に追加します。 このキーの値は、システムが位置情報サービスを使用する権限を要求したときにユーザーに表示されます。 推奨される文字列については、アプリ送信要件を参照してください。
注 : dataSourceNMADevicePositionSource に設定する以外に、 NMAPositionDataSource プロトコルに準拠したカスタムデータソースに設定することもできます。 詳細については NMAPositionDataSource 、 API リファレンス を参照してください。

リアルタイムの位置更新の受信を開始するに NMAPositioningManager startPositioningNMADevicePositioningMethodGPS は、アプリケーションがを呼び出して、がデフォルトの更新メカニズムとして使用する必要があります。 BOOL このメソッドは、配置が正常に開始されたかどうかを示す値を返します。

位置の更新を受信している間 NMAPositioningManager currentPosition 、アプリケーションはプロパティを介してクライアントデバイスの現在の位置を取得できます。 この現在の位置は rawPositionmapMatchedPosition 現在の状況では修正されている可能性が高いかどうかに応じて、またはプロパティと同じです。 rawPosition は、 HERE SDK エンジンによって変更されていない現在のデータソースの位置の値です。 While mapMatchedPositionmapMatchMode 、最寄りの自動車または徒歩道路と一致する位置データの値です(プロパティによって異なります)。 ポジショニングマネージャーがアクティブでないか、または位置が無効な場合は、 currentPosition メソッド nil が戻ります。

注 : マップマッチングはデフォルトで無効になっています。 ナビゲーション などのマップマッチングを必要とする任意の HERE SDK 機能を使用して自動的に有効にすること も、mapMatchingEnabledYESに設定して手動で有効にすることもできます。 マップの一致が無効になると、 mapMatchedPosition 元の位置 nil に戻り、 currentPosition 元の位置を返します。

アプリケーションで位置の更新が不要になった場合は、 stopPositioning を呼び出して NMAPositioningManager に通知する必要があります。 NMAPositionIndicator位置の更新を必要とする他の SDK サービス ( など ) が使用されていない場合、位置の更新が停止されます。

NMAPositioningManager 通知

NMAPositioningManager この通知を使用して、位置決めメカニズム( GPS など)によって決定されたクライアントデバイスの位置更新を追跡できます。 これらの通知を登録または登録解除するには、次の方法を使用します。


[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(methodName)
      name:NMAPositioningManagerDidUpdatePositionNotification
      object:[NMAPositioningManager sharedPositioningManager]];

[[NSNotificationCenter defaultCenter] removeObserver:self
      name:NMAPositioningManagerDidUpdatePositionNotification
    object:[NMAPositioningManager sharedPositioningManager]];

アプリケーションは、次の 2 種類の通知を登録できます。

  • NMAPositioningManagerDidUpdatePositionNotification
  • NMAPositioningManagerDidLosePositionNotification
メモ :NSNotificationCenter オブジェクトが同じ通知に登録できる回数に制限はありません。 同じオブジェクトを通知に複数回登録しないように注意してください。 それ以外の場合、オブジェクトは重複した通知を受信します。

でこれらの通知を登録して処理する例を次に示し UIViewControllerます。


// Start positioning and register for position update notifications
- (void)viewDidLoad
{
  ...
  if ([[NMAPositioningManager sharedPositioningManager] startPositioning]) {
  // Register to positioning manager notifications
  [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(positionDidUpdate) name:NMAPositioningManagerDidUpdatePositionNotification
    object:[NMAPositioningManager sharedPositioningManager]];

  [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(didLosePosition) name: NMAPositioningManagerDidLosePositionNotification
    object:[NMAPositioningManager sharedPositioningManager]];
  }

  ...
}
// Handle NMAPositioningManagerDidUpdatePositionNotification
- (void)positionDidUpdate
{
  NMAGeoPosition *position = [[NMAPositioningManager sharedPositioningManager] currentPosition];
  [_mapView setGeoCenter:position.coordinates
        withAnimation:NMAMapAnimationLinear];
}
// Handle NMAPositioningManagerDidLosePositionNotification
- (void)didLosePosition
{
  ...
}

アプリケーションがバックグラウンドにあるときに不要な位置の更新を避ける UIApplicationDelegate ために、プロトコルコールバックを使用して、アプリケーションがフォアグラウンドに戻るときに位置の配置を停止し、再起動できます。

次のコード スニペットでは、通知の位置決めを停止し、登録を解除する方法について説明します。


- (void)viewWillDisappear:(BOOL)animated
{
  [[NMAPositioningManager sharedPositioningManager] stopPositioning];
  [[NSNotificationCenter defaultCenter] removeObserver:self
    name:NMAPositioningManagerDidUpdatePositionNotification
    object:[NMAPositioningManager sharedPositioningManager]];
  [[NSNotificationCenter defaultCenter] removeObserver:self
    name:NMAPositioningManagerDidLosePositionNotification
    object:[NMAPositioningManager sharedPositioningManager]];
}
注 : Xcode プロジェクトでバックグラウンド位置情報の更新が有効になっている場合でも NMAPositioningManager 、アクティブなナビゲーションセッションがない限り、はアプリケーションがバックグラウンドにあるときに更新を提供しません。 この動作を上書きするには、を呼び出し setBackgroundUpdatesEnabled:YES ます NMAPositionDataSource

位置シミュレーション

HERE SDK には、 NMALoggedPositionSourceNMARoutePositionSource という 2 つのクラスがあります。これらのクラスを使用して、アプリケーション内での位置の更新をシミュレートできます。 これらのクラスは NMAPositionDataSource プロトコルを実装します。これらのクラスを使用するには、インスタンスを作成して設定し、 NMAPositioningManagerdataSource プロパティに割り当てる必要があります。 一度に使用できる位置データソースは 1 つだけです。

NMALoggedPositionSource このクラスは、ログファイルから位置データを提供します。 現在、 GPX ファイル形式がサポートされています。 ログファイルに一覧表示されている位置は、ログの末尾に達するまで 1 つずつ処理されます。 stationary プロパティ positionLost は、ログに記録されたパスに沿った移動の停止をシミュレートし、プロパティは位置データの損失をシミュレートします。

NMARoutePositionSource このクラスは、計算されたからの位置データを提供 NMARouteします。 更新は、 updateInterval プロパティで制御された頻度で、ルートの最初から最後まで生成されます。 シミュレートされた走行速度は movementSpeed 、プロパティを使用して設定されます。 停止位置と停止位置は、 stationary プロパティと positionLost プロパティでそれぞれシミュレートされます。

注意 :NMALoggedPositionSource 屋内でのポジショニングはサポートされていません。

位置ログを作成しています

HERE SDK を使用して、NMALoggedPositionSourceで再生できる GPX ログを作成することもできます。 これを行うには、 NMAPositionManagerlogType プロパティを、現在のデータソースから受信した位置をログに記録する必要があることを示す値 NMAPositionLogTypeDataSource に設定します。 GPX ログは Documents 、アプリケーションのフォルダに作成されます。 位置ログを無効にするには NMAPositionLogType 、をに設定 NMAPositionLogTypeNoneします。

注 : この機能はデバッグ目的でのみ使用されます。 本番アプリケーションでは、ポジションログを使用しないでください。

NMAPositionIndicator

NMAPositionIndicator このクラスを使用すると、によって報告さ NMAPositioningManagerれたとおりにユーザーの現在の場所をマークするマップ オブジェクトを簡単に追加できます。 位置インジケータを設定して、未加工、マップマッチング、または現在の位置 ( 未加工の位置またはマップマッチングの間で自動的に選択される位置 ) を表示できます。 位置インジケータは、半透明の円の中に円形のオブジェクトとしてレンダリングされます。この円の直径は、示されている位置の精度を示します。 マップオブジェクトのタイプ NMAPositionIndicatorNMAMapMarker、、 NMAMapLocalModel、およびのカスタマイズに使用NMAMapCircleできます。

図 1. NMAPositionIndicator

NMAMapView インスタンスには、 NMAMapView positionIndicator プロパティからアクセスできる NMAPositionIndicator インスタンスがあります。 によって表示されるマップ オブジェクト NMAPositionIndicatordisplayObject 、そのプロパティで変更 visible でき、インジケータはそのプロパティで表示または非表示にできます。

注 : tracksCourse プロパティを使用して、位置インジケーターを現在の移動方向に自動的に向けるかどうかを制御できます。 有効にする と、 HERE SDKpositionIndicatorを回転させて、車両が走行している方向に合わせる。 つまり、車両がアイドル状態の場合、変更はありません。 代わり に、位置インジケータがデバイスのコンパス方向を指すようにする必要がある場合は、 CLLocationManagerDelegate を使用します。

orientationOffset ポジションインジケータのヨーが車両の動きに基づいて変更された場合にのみ適用されることに注意してください。

精度の円の色、 accuracyIndicatorColor および accuracyIndicatorVisible プロパティを使用して表示するかどうかをカスタマイズできます。

// Display position indicator
mapView.positionIndicator.visible = YES;
注 : NMAPositionIndicator 表示に設定 NMAPositioningManager すると、更新が自動的に有効になります。

位置インジケーターを地図の中央に置き、デバイス位置のリアルタイムの更新を表示するには、新しい位置更新を受信するたびに地図センターを更新する必要があります。 この方法で頻繁に地図を再描画すると、デバイスのバッテリー寿命が節約されることに注意してください。 リアルタイムの更新を実行する際に、バッテリーの消費電力が及ぼす影響に注意してください。 次のコードを使用して、位置の更新を受信したときに地図の位置を更新できます。

- (void)positionDidUpdate
{
  NMAGeoPosition *position = [[NMAPositioningManager sharedPositioningManager] currentPosition];
  [_mapView setGeoCenter:position.coordinates
        withAnimation:NMAMapAnimationLinear];
}

このセクションで紹介およびデモンストレーションされたクラスの詳細については 、 API リファレンス のドキュメントを参照してください。