位置測定データを使用する


位置測定データを使用する

アプリは位置測定データを、navigator.geolocationプロパティをサポートするデバイスのJavaScriptを通じて利用できます。W3CのGeolocation API Specification(位置測定APIの仕様)には、位置測定データにアクセスする方法が記載されています。

位置測定のサンプルは、位置測定データにアクセスする方法を示します。このサンプルのコードは、<Amazonアプリ・ゲームサービスSDK>/Web/Cookbook/Geolocation/にあります。Web App SDKは、Amazonアプリ・ゲームサービス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マニフェストに適切なパーミッションが追加されます。適切なチェックボックスをオンにしない場合、アプリの位置測定機能は機能しません。