Newer
Older
nikko / catgps.js
function distance(x1, y1, x2, y2) {	// ヒュベニ式による距離概算
    rx = 6378137;			// 赤道半径(m) WGS84
    ry = 6356752.314;			// 極半径(m)   WGS84
    e2=(rx*rx-ry*ry)/rx/rx;		// 離心率 E^2
    dx = (x2-x1)*Math.PI/180;		// 経度の差をラジアン変換
    dy = (y2-y1)*Math.PI/180;		// 緯度の差をラジアン変換
    my = (y1+y2)/2.0*Math.PI/180;	// 緯度の平均をラジアン変換
    w = Math.sqrt(1-e2*Math.sin(my)*Math.sin(my));
    m = rx*(1-e2)/Math.pow(w,3);		// 子午線曲率半径
    n = rx/w;				// 卯酉線曲率半径
    return Math.sqrt(Math.pow(dy*m,2) + Math.pow(dx*n*Math.cos(my),2));
}

function game(){
    var threshold = 10;		// 何m接近をゴールとするか
    
    var timerInterval = 10000;	// GPS失敗で何秒後に再取得か
    var tmId = null;
    var i = 0, countD = document.getElementById("countdown");
   
    var info = document.getElementById("info");
    
    var point = L.marker(mymap.getCenter(),{icon:myIcon}).addTo(mymap);
    //
    var stop = document.getElementById("stp");
   
    var gps = document.getElementById("str");
    var ser = document.getElementById("serif");
    var tme = document.getElementById("time");
    var nowTrying = null;
    var doflag=true;
    
    function tryGetGPS() {
	clearTimer();
	ser.textContent = "GPS取得..."
	nowTrying = navigator.geolocation.getCurrentPosition(
    	    onSuccess, onError,{
    		maximumAge: 0, timeout: 3000, enableHighAccuracy: true})
    }
    
    function onemore() {
	if (nowTrying || tmId) {
	    info.textContent = "既にGPS取得試行or待機中です";
	} else {
	    startTimer();
	    //tm.textContent=""+naiyo[0]+"";
	}
    }

    function startTimer() {
	if (tmId==null && doflag){
	    tmId = setTimeout(tryGetGPS, 5000);
    	    ser.textContent = "5秒後にGPS取得…";
	    tme.textContent= "周りに注意して使用しましょう!";
    	}
    }
    
    function clearTimer() {
     	if (tmId) {
	    clearTimeout(tmId);
	    //nowTrying=nil;
	}
    }

    function countDown(){
	if (doflag){
	    alert("周りに注意して使用して下さい");
	    //alert(""+naiyo[0]+"")
	    tryGetGPS();
	} else{
	    tryGetGPS();
	    doflag=true;
	    tmId=null;
	}
    }

    function stopCountDown() {
	doflag=false;
	countD.textContent = "stop!";
     	ser.innerHTML = "startボタンをもう一度押すと始まります";
    }
   
    function onSuccess(pos) {
	nowTrying = null;
	tmId=null;
	mymap.setZoom(18);
	var latlng = L.latLng([pos.coords.latitude, pos.coords.longitude]);
	ser.textContent = "現在の位置は"+latlng+"です。";
	mymap.panTo(latlng);	
	
	//point.setPopupContent("あなたの位置はここです").openPopup().setLatLng(latlng);
	point.bindPopup("あなたの位置はここです").setLatLng(latlng);
	var lat = latlng.lat, lng = latlng.lng;
	//alert(iro);
	var g=100000,d=0,i=0, come,color,near_point;
	//var m=feature.geometry.coordinates;
	
	for(i=0; i<kasyo.length; i++){
	    var kiken = L.latLng(kasyo[i][1],kasyo[i][0]);
	    var klat =kiken.lat, klng=kiken.lng;
	    d=distance(klng,klat,lng,lat);
	    d=Math.floor(d*100)/100;
	    if ( d <= g  && iro[i]=="red" && k_type[i] == "Point" || d <= g  && iro[i]=="Red" && k_type[i] == "Point"|| d <= g  && iro[i]=="yellow" && k_type[i] == "Point" || d <= g  && iro[i]=="Gold" && k_type[i] == "Point"|| d <= g  && iro[i]=="" && k_type[i] == "Point"|| d <= g  && iro[i]=="Yellow" && k_type[i] == "Point"){
		g=d;
		near_point=ten[i];
		//come=naiyo[i];
		//color=iro[i];
	    }
	 }
	if (g<= threshold){
	    //alert(come);	    
	    near_point.openPopup();
	    //info.style.color="red";
	    //info.innerHTML =""+come+"";
	    navigator.vibrate(1000);
	    onemore();
	}
	else{
	    //tm.textContent=""+g+"";
	    info.innerHTML = "一番近い危険箇所への距離は"+Math.round(g*100)/100+"m";	// 表示
	    info.style.color="black";
	    onemore();
	}
    }
    function onError(err) {			// 失敗時
	nowTrying = null;
	ser.textContent = "現在位置の取得失敗.10秒後にもう一回";
	tmId = setTimeout(tryGetGPS, timerInterval);
    }
    
    gps.addEventListener("click", countDown, false);
    stop.addEventListener("click", stopCountDown, false);
};
document.addEventListener("DOMContentLoaded", game, false);