[HTML5] 位置情報を継続的に取得する
今日はHTML5のGeoLocationAPIを利用した位置情報取得、第2弾。
継続的に位置情報を取得する方法を試してみたので、それをブログに残しておきたいと思います。

HTML5の位置情報を取得する機能とは
GeoLocation APIという機能を使う事で、Web画面でJavaScriptを利用する事で、位置情報(経度や緯度など)を取得出来るようになります。 ”HTML5で位置情報を取得する@YoheiM.NET”をご参照ください。
継続的に位置情報を取得するには
HTML5で位置情報を継続的に取得するには、navigator.geolocation.watchPositionメソッドを利用して位置情報を取得します。
// watch Position.
var watchId = null;
var watchButton = document.querySelector("#watchButton");
watchButton.addEventListener("click", function(){
  alert("位置情報取得を開始します");
  var options = {enableHighAccuracy:true, maximumAge:0}
  watchId = navigator.geolocation.watchPosition(wSuccessFunc,wFailureFunc);//,options);
}, false);
watchPositionメソッドの引数には、以下を指定します。
| 引数名 | 意味 | 備考 | 
| successFunc | 位置情報取得成功時に呼ばれるコールバック関数 | 位置情報取得の度に呼び出される | 
| failureFunc | 位置情報失敗時に呼ばれるコールバック関数 | オプション(=指定しなくても良い)。一度この関数が呼ばれたら、その後は正しい位置情報は取得出来ない。 | 
| options | watchPositionメソッドに対する振る舞いを規定するオプション | オプション(=指定しなくても良い)。精度向上、タイムアウト時間、キャッシュ時間を設定出来る | 
watchPositionメソッドは、IDを戻り値として返却します。このIDは、watchPositionを中止する際に(clearPositionメソッドコール時に)利用します。
位置情報成功時のコールバック関数
例えば以下のように実装します。
function wSuccessFunc(position){
  var status = "";
  for(var prop in position.coords){
    status += prop + ": " + position.coords[prop] + "<br>";
  }
  status += "<br>";
  var str = document.querySelector("#statusArea2").innerHTML;
  document.querySelector("#statusArea2").innerHTML = str + status;
}
引数のoption.coordsに位置情報が格納されており、ここではその情報をページへ出力しています。options.coordsから取得出来る位置情報は以下のようなものです。
| プロパティ名 | 内容 | 備考 | 
| latitude | 緯度 | |
| longitude | 経度 | |
| altitude | 高度 | |
| accuracy | 位置精度 | どれだけ正確な位置情報かを表す。単位はMeter | 
| altitudeAccuracy | 高度精度 | 高度の正確性を表す。単位はMeter。高度が提供されていない場合にはnull | 
| heading | 方角 | 北から時計回りで0<=heading<360の値で示される。動いていない場合には、NaN | 
| speed | 移動速度 | 1秒間あたりの水平方向への移動距離。単位はMeter | 
hading,speedについては、実装されていないブラウザーもあり、その場合には、nullが返されるようです|
位置情報失敗時のコールバック関数
例えば以下のように実装します。
var failureFunc = function(err){
  var errCause = "";
  switch(err.code) {
    case err.TIMEOUT:
      errCause = 'Timeout';
      break;
    case err.POSITION_UNAVAILABLE:
      errCause = 'Position unavailable';
      break;
    case err.PERMISSION_DENIED:
      errCause = 'Permission denied';
      break;
    case err.UNKNOWN_ERROR:
      errCause = 'Unknown error';
      break;
  }
  alert("位置情報取得に失敗しました。原因: " + errCause + " " + err.message);
}
引数のerrには、エラーコード(err.code)とエラーメッセージ(err.message)が格納されており、それを利用してエラー原因をユーザーへ通知しています。エラーメッセージは、さらに、ユーザーに「だからどうしろ」という情報も与えると、より親切ですね~。
watchPositionを停止するclearPositionメソッド
watchPositionメソッドで継続的に位置情報を取得する必要がなくなれば、clearPostionメソッドを呼んで、位置情報取得を終了します。例えば以下のように実装します。
// clear watch.
if (watchId !== null){ // watchId is a global variable.
  navigator.geolocation.clearWatch(watchId);
  watchId = null;
  alert("位置情報取得を終了しました");
}
navigator.geolocation.clearWatchメソッドに、watchPositionメソッドの戻り値であるwatchIdを渡し、位置情報取得を終了します。
最後に
継続的に位置情報を取得する事で、ランニングコースの計測など色々と楽しいことが出来そうです。自分の手元のスマートフォンで試したところ、watchPositionで位置情報を計測中に端末が待機状態になっても、位置情報を継続して取得しているようでした。
HTML5の周辺機能として、今後の使い方が楽しみな機能の一つです(*゚▽゚)ノ
 
  
