Newer
Older
j2321-tanakai / locget-timer.js
// 例:タイマーを用い、10回 getCurrentPosition() を繰り返す
(() => {
function locGetTimer() {
    var timerInterval = 5000;	// 衛星信号取得再試行までの間隔(ミリ秒)
    var mymap = L.map("mymap").setView([38.891, 139.824], 16);
    L.tileLayer('//cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
	attribution:
	'<a href="http://maps.gsi.go.jp/development/ichiran.html">\
	国土地理院</a>'
    }).addTo(mymap);
    var locmarker = L.marker(mymap.getCenter()).addTo(mymap);
    locmarker.bindPopup("捕捉中...").openPopup();
    var nTrial = 10;
    var tmId = null;		// 最初はnullにしておく
    function tryGetLOC() {
	locmarker.setPopupContent("start").openPopup()
	navigator.geolocation.getCurrentPosition(
	    onSuccess, onError,{maximumAge: 0,
				enableHighAccuracy: true,
				timeout: 9000});
    }
    function onSuccess(pos) {
	// 引数 pos は L.latlng で変換してから使用する
	var latlng = L.latLng([pos.coords.latitude, pos.coords.longitude]);
	mymap.flyTo(latlng);
	locmarker.setPopupContent(
	    "現在地は "+latlng+"です"
	).openPopup().setLatLng(latlng);
    }
    function onError(err) {
	var restN = "あと"+(--nTrial)+"回試行します。";
	if (nTrial > 0) {
	    locmarker.setPopupContent("捕捉失敗:"+restN).openPopup();
	    tmId = setTimeout(tryGetLOC, timerInterval); // 5秒後に再試行
	    //tryGetLOC(); //setTimeoutでNGな機種はこちらにする
	} else {
	    var m = '<span style="color: red;">中止します。</span>';
	    locmarker.setPopupContent(m).openPopup();
	}
    }
    tryGetLOC();
}
document.addEventListener("DOMContentLoaded", locGetTimer, false);
})();