ガイド変更履歴HERE SDK API references
ガイド

ポジショニングを最適化する

ポジショニング機能はNavigateライセンスでのみ使用できます。

以下に、さまざまなアプリケーションで正確で信頼性の高い位置データを取得するための追加オプションを示します。

バックグラウンド更新を有効にする

アプリケーションがバックグラウンドで実行されているときに、位置情報の更新を引き続き受信する場合は、次のキーをアプリの Info.plist ファイルに追加して、このような機能を有効にする必要があります。

<key>UIBackgroundModes</key>
	<array>
		<string>location</string>
        <string>processing</string>
	</array>

iOS バージョン 13.0 以降では、「処理」モードが必要です。追加する場合は、次も必要です。

<key>BGTaskSchedulerPermittedIdentifiers</key>
    <array>
        <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    </array>

詳細については、Apple の iOS ドキュメントをご覧ください。

さらに、ユーザーは許可のリクエストを受け取る必要があります。「権限を追加する」セクションで共有したコード スニペットでも、これを処理できます。

権限が付与されると、すべての設定が完了します。LocationEngine.setBackgroundLocationAllowed() メソッドでバックグラウンドでの位置情報の更新を有効または無効にできます。LocationEngine.setBackgroundLocationIndicatorVisible() メソッドを使って、アプリケーションのバックグラウンドでの位置情報インジケーターの表示/非表示を設定することもできます。

最後に、LocationEngine.setPauseLocationUpdatesAutomatically() メソッドに false を 渡すことで、デバイスの停止時に位置情報の更新を一時停止しないようにできます。

アプリケーションでバックグラウンドでの位置情報機能が有効になっていない場合、setBackgroundLocationAllowed()setBackgroundLocationIndicatorVisible()LocationEngineStatus.notAllowed を返します。そうでない場合は、LocationEngineStatus.ok を返します。

付属の Positioning サンプル アプリでは、デフォルトではバックグラウンドでの更新は有効になっていません。

サブメートル精度を追加する

現在、HD GNSS機能はHERE SDK for iOS (Navigate) ではサポートされていません。現在、HD GNSS(High Definition Global Navigation Satellite System:高画質グローバル衛星ナビゲーションシステム)機能はHERE SDK for Android (Navigate)およびHERE SDK for Flutte r (Navigate)の一部としてAndroidデバイスでのみ利用可能です

位置情報の精度に対応する

Location オブジェクトに存在する horizontalAccuracyInMeters フィールドは、「不確実性の半径」とも呼ばれ、実際の地理座標が存在する可能性がある領域の推定値を 68% の確率で提供します。これは、現在地の周囲にハロー インジケーターを描画するために使用されます。下の図は、内側の緑色の円が location.coordinates として、周囲の円が半径 horizontalAccuracyInMeters の精度円として描かれています。真の地理座標が存在する可能性は、精度円の内側 (68%) または外側 (32%) です。

同様に、高度の場合は verticalAccuracyInMeters 値が 10 メートルのときに、実際の高度が 68% の確率で高度 - 10 メートルから高度 + 10 メートルの範囲内に収まると予想されることを示します。bearingAccuracyInDegreesspeedAccuracyInMetersPerSecond などの他の精度値も同じルールに従います。つまり、不確実性が小さいほど精度が高くなります。

coordinates.altitude 値は基準海面 (MSL) に関連して与えられます。

68% (CEP68) 以外の確率を達成する

指定された確率 68% (CEP68) が十分ではない場合、99% の精度を達成することは可能でしょうか。はい、可能です。指定された平均誤差半径 (CEP) は 2 自由度のカイ二乗分布に従うため、次の式に基づいて目的の確率を簡単に計算できます。

確率 不確実性の半径
50% CEP50 = 0.78 x CEP68
60% CEP60 = 0.90 x CEP68
70% CEP70 = 1.03 x CEP68
80% CEP80 = 1.19 x CEP68
90% CEP90 = 1.42 x CEP68
95% CEP95 = 1.62 x CEP68
99% CEP99 = 2.01 x CEP68

上の表を使用して、地図のハローインジケーターのさまざまな確率レベルを可視化できます。たとえば、水平精度が 20 メートルの場合、半径を (およそ) 2 倍にして、99% の確率を達成できます。精度値は常に CEP68 として与えられます。これは次のことを意味します。

CEP99 = 2.01 x CEP68 = 2.01 x 20 m = 40.2 m

これで、見つかった位置の周囲に半径 40.2 メートルの範囲を描くことができます。および、実際の位置は 99% の確率でその円の中に存在します。一方、半径 0 メートルの確率は 0% です。


EN 日本語

HERE documentation

Find answers to your product and technical questions

Documentation

What's new

Videos

EN 日本語

HERE ドキュメント

製品や技術に関する質問の答えを見つけましょう。より多くの内容と最新の情報については、英語版をご覧ください。

ドキュメント

ダイナミックマップ

動的コンテンツ関連のAPIをアプリやサービスに活用して、ドライバーが安全・快適かつ予定どおりに目的地へ到着できるよう支援します。

地図とデータ

世界中を走行する多数のマッピング車両から得られる最新の位置情報データを活用し、精度の高い地図やカスタムレイヤーを構築できます。

最新情報

動画

(function () { const input = document.querySelector('input[data-typeahead]'); if (!input) return; // Prevent the form from submitting/navigating input.closest('form')?.addEventListener('submit', e => e.preventDefault()); input.addEventListener('input', function () { const q = this.value.trim().toLowerCase(); document.querySelectorAll('.nav-group-name').forEach(group => { let anyVisible = false; group.querySelectorAll('.nav-group-task').forEach(task => { const text = task.textContent.trim().toLowerCase(); const show = !q || text.includes(q); task.style.display = show ? '' : 'none'; if (show) anyVisible = true; }); // Hide the whole group header if nothing matches group.style.display = anyVisible || !q ? '' : 'none'; }); }); })(); (function () { function onTokenClick(event) { var link = event.target.closest('.sdk-for-ios .item .token'); if (!link) return; event.preventDefault(); console.log('token clicked', link.textContent.trim()); var item = link.closest('.item'); if (!item) return; var content = item.querySelector('.height-container'); if (!content) { console.log('no .height-container found for item', item); return; } var isHidden = window.getComputedStyle(content).display === 'none'; content.style.display = isHidden ? 'block' : 'none'; link.classList.toggle('token-open', isHidden); var href = link.getAttribute('href'); if (href) { if (history.pushState) history.pushState({}, '', href); else location.hash = href; } } function openHashTarget() { var hash = window.location.hash.slice(1); if (!hash) return; var anchor = document.querySelector('.sdk-for-ios a[name="' + hash + '"]'); if (!anchor) return; var item = anchor.closest('.item'); if (!item) return; var link = item.querySelector('.token'); var content = item.querySelector('.height-container'); if (!link || !content) return; content.style.display = 'block'; link.classList.add('token-open'); } function init() { console.log('HERE SDK accordion init'); openHashTarget(); } document.removeEventListener('click', onTokenClick); document.addEventListener('click', onTokenClick); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } window.addEventListener('hashchange', openHashTarget); window.addEventListener('pageLoad', init); })();