GeolocationAPI 調査その1

ちょいとGeolocationAPIを使うことになったので、調べた事をメモする。
本家は下記。
Geolocation API Specification

日本語でまとめてある記事があるので参考にする。
JavaScriptで位置情報を取得する方法(Geolocation API)

使用するAPI

  • navigator.geolocation.getCurrentPosition
  • navigator.geolocation.watchPosition

共通の仕様

どちらのAPIを使うにしても、下記の形で使用する。本家より。

navigator.geolocation.getCurrentPosition(successCallback, errorCallback, option);

位置情報の取得に成功した時は successCallback が呼び出される。失敗した時は errorCallback。あとはオプションの指定が可能。
getCurrentPosition と watchPosition の違いは、一度(呼ばれたとき)しか動かないか、その後も一定間隔で動き続けるかの違い。
getCurrentPosition は呼び出された時しか動かず、watchPosition は一定間隔で動き続ける。カーナビのようにリアルタイムで位置情報を更新する場合は watchPosition を使うことになるのかな。

watchPosition の一定間隔はオプションで指定する事になるのだろうか。おそらくオプションに指定出来る物は getCurrentPosition と watchPosition で変わってきそう。
watchPosition の動きを止める場合、IDを指定して止める。そのため、watchPosition は戻り値にIDを返すようだ。以下が本家のサンプルコード。

function scrollMap(position) {
      // Scrolls the map so that it is centered at (position.coords.latitude, position.coords.longitude).
}

function handleError(error) {
      // Update a div element with error.message.
}

var watchId = navigator.geolocation.watchPosition(scrollMap, handleError);

※ この例ではオプションを省略している。

上記を見ればわかるが、successCallback として scrollMap関数を渡している。scrollMap関数は、引数として position を受け取る。この中に位置情報等が保存されている。
仕様を見てみると

interface Position {
    readonly attribute Coordinates coords;
    readonly attribute DOMTimeStamp timestamp;
};

DOMTimeStamp は多分そのままの意味だろうけど、Coordinatesってなんだろ・・?

interface Coordinates {
    readonly attribute double latitude;
    readonly attribute double longitude;
    readonly attribute double? altitude;
    readonly attribute double accuracy;
    readonly attribute double? altitudeAccuracy;
    readonly attribute double? heading;
    readonly attribute double? speed;
};

ほむほむ。色々持ってる。double?とか言う怪しい型は無視して全プロパティの説明を読んでみる。

プロパティ 説明
latitude 緯度
longitude 軽度
altitude 高さ(メートル単位)
accuracy 緯度・軽度の精度(メートル単位)
altitudeAccuracy 高さの精度(メートル単位)
heading 方角。0〜360度。0を北とし、時計のように見る
speed 速度(メートル/秒)

ふーむ、北緯と南緯はどうやって表現してるんだろうと思ったら、マイナスで表現すると、下記に書いてあった。なるほど。
JavaScriptで位置情報を取得する方法(Geolocation API)

とりあえず基本はこんな感じ。