// 例 // 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()