GPS情報の取得

ここからの説明は、実際にGPSセンサ付のデバイスでのみ動かせる。 まず、HTTPS配付可能なディレクトリにて、HTML 文書ファイルと JavaScript プログラムを作成し、それを GPS センサつきモバイルデバイスで確認するという手順が必要である。

https://www.w3.org/TR/geolocation-API/

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進)
altitudeWGS84高度(メートル)(取れなければ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-get.html

https://www.yatex.org/lect/gps/gps-watch.html https://www.yatex.org/lect/gps/gps-watch.html

機種によって異なるが、次のようなことが気になる場合がある。

また、watchPosition() の場合は捕捉に成功するまで続くが逆に

という問題があり、デバイスによっては電気消費が激しくなることもある。

★★★★★★