ここからの説明は、実際にGPSセンサ付のデバイスでのみ動かせる。 まず、HTTPS配付可能なディレクトリにて、HTML 文書ファイルと JavaScript プログラムを作成し、それを GPS センサつきモバイルデバイスで確認するという手順が必要である。
https://www.w3.org/TR/geolocation-API/
HTML5 Geolocation APIでは次の3つのインターフェースが用意されている。
getCurrentPosition(successCallback[, errorCallback[, option]])
センサからの位置情報を1度だけ取得試行し、成功したら
successCallback
を、失敗したら
errorCallback
を呼ぶ。
成功時の関数には Potision
オブジェクトが、
失敗時の関数には PotisionError
オブジェクトが渡される。
watchPosition(successCallback[, errorCallback[, option]])
位置情報取得を繰り返す。引数は getCurrentPosition()
と同様。
返却値としてIDが返るので、この値を保存しておき、GPS
追跡を止めたいときに次の clearWatch()
に渡す。
clearWatch(watchId)
指定したIdの追跡を止める。止めない限り追跡は続き、 成功・失敗によって指定した関数が呼ばれるため、 止める処理を盛り込む必要がある。
情報取得を試行する2つの関数は、いずれも第1、第2引数にそれぞれ 取得成功時に呼ぶ関数、失敗時に呼ぶ関数を指定する。このように 将来何かのタイミングで呼び返してほしい関数のことをコールバック関数 という。
第3引数に指定するのは挙動を制御するオプションで、 以下のプロパティが設定できる。
enableHighAccuracy |
高精度の測定をするかどうか。false はしない。false 以外であればする。デフォルトは false。 |
timeout |
位置情報が取得できるまでの最大待ち時間(ミリ秒)。 |
maximumAge |
以前に取得してキャッシュしてある位置情報の有効期限(ミリ秒)。 0(デフォルト)に指定するとキャッシュを利用せずかならず測定を試みる。 |
たとえば、1回のみの情報取得を試みるコードは以下のようになる。
// ここまでに変数 mymap にLeaflet地図オブジェクトが入っているとする。 var gpsmarker = L.marker(mymap.getCenter()).addTo(mymap); // マーカを作り、取得に関する情報をポップアップ表示する用途に用いる。 gpsmarker.bindPopup("取得中...").openPopup(); function tryGetGPS() { // 取得を開始する処理を行なう関数の定義 navigator.geolocation.getCurrentPosition( onSuccess, onError,{ // 下で定義する2つの関数をコールバック指定 maximumAge: 0, timeout: 2000, enableHighAccuracy: true }); } function onSuccess(pos) { // 成功時のコールバック。関数名は何でもよい。 // pos.coords に位置情報が入る。LeafletのLatLngに変換する。 var latlng = L.latLng([pos.coords.latitude, pos.coords.longitude]); mymap.panTo(latlng); // 地図の中心を取得した位置に gpsmarker.setPopupContent( // ポップアップ表示を "ここは "+latlng+"です." // 更新後の緯度経度に変え、 ).openPopup().setLatLng(latlng); // ポップアップし、ポイントも変更する } var nTrial = 10; // 最大試行回数を決めておく function onError(err) { // 失敗時のコールバック restN = "あと"+(--nTrial)+"回試行します。"; gpsmarker.setPopupContent("取得失敗:"+restN).openPopup(); if (nTrial > 0) { // 残り回数があれば tryGetGPS(); // 再度取得を試行する } } tryGetGPS();
成功時のコールバックには Position
オブジェクトが渡る。
Position
は2つのプロパティを持つ。
coords | 位置に関する情報 | |
timestamp | 取得時刻 |
coords
プロパティはさらに以下のプロパティを持つ。
latitude | 緯度(10進) | |
longitude | 経度(10進) | |
altitude | WGS84高度(メートル)(取れなければnull) | |
accuracy | 緯度経度の測定誤差(精度) | |
altitudeAccuracy | 高度の測定誤差(精度) | |
heading | 移動方向(北から反時計回り360度まで) | |
speed | 水平移動速度(m/s) |
モバイルデバイスを用いての実験はこのURLから:
https://www.yatex.org/lect/gps/gps-get.html
https://www.yatex.org/lect/gps/gps-watch.html
機種によって異なるが、次のようなことが気になる場合がある。
また、watchPosition()
の場合は捕捉に成功するまで続くが逆に
という問題があり、デバイスによっては電気消費が激しくなることもある。
★★★★★★