位置情報データを使用する方法


位置情報データを使用する方法

navigator.geolocationプロパティをサポートしているデバイスでは、JavaScriptを介して、位置情報データをアプリで使用できます。位置情報データにアクセスする方法については、W3CのGeolocation API Specification(英語のみ)に記載されています。

Geolocationのサンプルは、位置情報データにアクセスする方法を示します。このサンプルのコードは、<Amazon Apps & Games Services SDKs>/Web/Cookbook/Geolocation/にあります。Web App SDKは、Amazon Developer SDKからダウンロードできます。

位置情報技術に対応しているかどうかを検出する方法

位置情報技術に対応しているかどうかを検出するには、navigator.geolocationプロパティが存在するかどうかを確認します。存在する場合、位置情報技術に対応しています。

if (navigator.geolocation) {
  // 位置情報技術に対応している
} else {
  // 位置情報技術に対応していない
}

ユーザーの現在の位置情報データを要求する方法

navigator.geolocationプロパティが存在することを確認した後に、最小で1つ、最大で3つの引数を指定してnavigator.geolocation.getCurrentPosition()を呼び出すことで、ユーザーの位置情報データを要求できます。引数は、順番に次のとおりです。

  1. (必須)デバイスの現在地が正常に測定されたときに呼び出される関数へのコールバック。
  2. (オプション)デバイスの現在地を測定するときにエラーが発生した場合に呼び出される関数へのコールバック。
  3. (オプション)位置検索オプションをカプセル化するオブジェクト。

次の位置検索オプションがあります。

  • enableHighAccuracy(ブーリアン)はアプリで可能な限り最良の結果を受け取るためのヒントを提供します。高精度の結果を要求すると、応答時間が遅くなったり、電池の消耗が大きくなることがあります。ユーザーがこの機能を拒否する可能性があります。また、このフラグがfalseに設定された場合よりも精度の高い結果をデバイスが提供できない可能性があります。このフラグの目的は、高精度の結果を必要としていないことをアプリから実装に伝達できるようにすることです。これにより、実装は大量の電池を消耗する位置情報プロバイダー(GPSなど)の使用を回避できます。
  • timeout(long)は、getCurrentPosition()の呼び出しから成功のコールバックが呼び出されるまでの最大経過時間(ミリ秒)です。timeoutの時間が経過し、その他のエラーが発生していない場合、エラーのコールバックがタイムアウトのエラーコードと共に呼び出されます。
  • maximumAge(long)は、キャッシュされた場所が引き続き使用できる最大時間(ミリ秒)です。maximumAgeがゼロに設定された場合、実装は新しい位置データの取得をすぐに試行する必要があります。maximumAgeを無限に設定すると、キャッシュされたデータはその古さに関係なく常に返されます。

次にgetCurrentPosition()の呼び出しと、成功のコールバック、エラーのコールバック、およびオプションのオブジェクトが定義された場合の例を示します。成功のコールバックの実装については、「位置情報データの使用」のセクションに示されています。エラーのコールバックの実装については記載されていません。

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0
};

if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(showPositionSuccessCallback, showPositionErrorCallback, options);
} else {
  $("#location").text("このブラウザまたはコンテキストは位置情報に対応していません");
}

位置情報データの使用

位置情報データを要求し、その要求が正常に処理されると、成功のコールバックが呼び出されます。コールバック関数が、座標オブジェクトとタイムスタンプを含む位置オブジェクトを受け取ります。座標オブジェクトには次のプロパティがあります。

  • latitudeは度数(10進数表記)で指定します。
  • longitudeは度数(10進数表記)で指定します。
  • altitudeはWGS84楕円体を超える位置の高さ(メートル単位)です。実装がこの情報を提供できない場合はnullになります。
  • accuracyは緯度と経度の精度で、メートル単位で指定します(信頼水準:95%)。
  • altitudeAccuracyはメートル単位で指定します(信頼水準:95%)。実装がaltitudeの情報を提供できない場合はnullになります。
  • headingはデバイスの移動方向を示し、0° ≤ heading < 360°のように度で指定します。デバイスが固定されている(速度が0)の場合はNaNになります。実装がheadingの情報を提供できない場合はnullになります。
  • speedはデバイスの現在の速度における水平方向の強度を示し、メートル/秒で指定されます。実装がspeedの情報を提供できない場合はnullになります。

positionの座標オブジェクトの情報を使用して、latitude、longitude、accuracyの情報を表示する成功のコールバックの例と、latitudeとlongitudeがクエリ文字列に埋め込まれているマップへのリンクを次に示します。

function showPositionSuccessCallback(position) {
  var latitude = position.coords.latitude;
  var longitude = position.coords.longitude;
  var accuracy = position.coords.accuracy;
  $("#location").html("Latitude: " + latitude
                      + "<br/>Longitude: " + longitude
                      + "<br/>Accuracy: " + accuracy + " meters");
  $("#osm").html('<a href="http://www.openstreetmap.org/?lat=' + latitude
                 + '&lon=' + longitude + '&zoom=17&layers=M">Open Street Maps view</a>');
}

位置情報データを使用するパーミッションのリクエスト

Amazonアプリストアにアプリを申請するときに、[アプリファイル] タブの [ウェブアプリの機能] セクションで [Geolocation] チェックボックスをオンにします。これにより、Androidマニフェストに適切なパーミッションが追加されます。適切なチェックボックスをオンにしない場合、アプリの位置情報機能は動作しません。