Newer
Older
2021-Kaoka-gamedesign / map / measure / measure-d.js
@KAOKA Daisuke KAOKA Daisuke on 17 Dec 2021 2 KB 試し
// 例
// 2点の距離計測

// var mymap = L.map("mymap");
var mymap = L.map("mymap").setView([38.891, 139.824], 16);
L.tileLayer('http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
 attribution:
   '<a href="http://maps.gsi.go.jp/development/ichiran.html">国土地理院</a>'
}).addTo(mymap);

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));
}

var start = null, pass = null, goal = null;	// 測定始点と終点
var sMarker, pMarker, gMarker;			// 始点終点マーカ
function startOrGoal(e) {
    var info = document.getElementById("info");
    var imsg = "北緯 "+e.latlng.lat+" 東経 "+e.latlng.lng;
    if (!start) {
	start = e.latlng;
	sMarker = L.marker(start).addTo(mymap).bindPopup(imsg);
	info.innerHTML = imsg;
    } else if (!pass) {
	pass = e.latlng;
    var lng1 = start.lng, lat1 = start.lng,
        lng2 = pass.lng,  lat2 = pass.lat;
	pMarker = L.marker(pass).addTo(mymap).bindPopup(imsg);
    var d = distance(lng1, lat1, lng2, lat2);
    } else if (!goal) {
    goal = e.latlng;
    var lng2 = pass.lng, lat2 = pass.lat,
        lng3 = goal.lng, lat3 = goal.lat;
    gMarker = L.marker(goal).addTo(mymap).bindPopup(imsg);
    var k = distance(lng2, lat2, lng3, lat3);
    info.innerHTML = "距離: "+Math.round((d+k)*100)/100+"m";    
    } else {
	sMarker.remove(mymap);		// 始点マーカの除去
	pMarker.remove(mymap);
    gMarker.remove(mymap);		// 終点マーカの除去
	start = pass = goal = sMarker = pMarker = gMarker = null;
	info.innerHTML = "クリアしました";
    }
  }
mymap.on('click', startOrGoal);		// クリックイベントで startOrGoal()