getCurrentPosition は精度が出ないので watchPosition を使う。

JavaScriptで位置情報を取得するのに、ふたつのメソッドが用意されています。

  • getCurrentPosition:一度だけ位置情報を取得
  • watchPosition:連続的に位置情報を取得

→ 参考:Geolocation の利用 - MDN

現在位置を特定したいのであれば get〜 を使えば良さそうなのだけれど、一発だけの測定だと非常に精度が悪い。精度を高めるには、

  • getCurrentPositionを何回か呼んで、最後の測定結果を取り出す
  • watchPositionを一定時間走らせる

という解決方法が考えられます。たぶん後者のほうが簡単に書けそうなので、こちらを採用。例えばこんな感じ。測定開始から5秒後に終了して、得られた緯度・経度を表示します。
<script type="text/javascript">
var watchID;
var lat;
var lng;
var geoOptions = {
                        maximumAge : 0 ,
                        timeout : 2000 ,
                        enableHighAccuracy : true
                        };
var WAIT = 5000;

watchID = navigator.geolocation.watchPosition( onSuccess , onErr , geoOptions );
setTimeout( function(){ navigator.geolocation.clearWatch( watchID );
                                  alert( '緯度:' + lat + ' / 経度:' + lng );} ,
                                  WAIT );

function onSuccess( pos ){
  lat = pos.coords.latitude ;
  lng = pos.coords.longitude ;
}

function onErr( err ){
  // エラー処理
}
</script>

手許の iPhone で試してみると、数秒間の測定で割と充分な精度が得られました。

エラーコードのメモ。上の例だと、エラーコールバック関数内 err.code で参照できます。

  • 0:不明のエラー (UNKNOWN_ERROR)
  • 1:位置情報の利用が許可されていない。(PERMISSION_DENIED)
    そのアプリケーションで位置情報が利用できない設定になっている。
  • 2:現在位置が特定できない。(POSITION_UNAVAILABLE)
    iPhoneならば、例えば「機内モード」がONになっているときなど。
  • 3:測定のタイムアウト。(TIMEOUT)
    watchPosition()の第三引数の timeout の値によってタイムアウトまでの時間を制御できる。

カテゴリ: