Newer
Older
2022-yuya / map / Appn / markerlayer.js
document.addEventListener("DOMContentLoaded", () => {
    // 例: コントロールレイヤ
    var mlCenter   = [38.891, 139.824];
    var otherPoint = [38.890, 139.822];
    var osmTile =	// OSMのタイル
	L.tileLayer('//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
	    attribution:
	    '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> \
contributors'
	});
    var gsiTile =	// 国土地理院タイル
	L.tileLayer('//cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
	    attribution:
	    '<a href="http://maps.gsi.go.jp/development/ichiran.html">国土地理院</a>'
	});
	
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, goal = null;		// 測定始点と終点
var sMarker, 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 (!goal) {
	goal = e.latlng;
	let lng1 = start.lng, lat1 = start.lat,	// 緯度経度を個別に取得
	    lng2 = goal.lng,  lat2 = goal.lat;
	// 終点マーカを生成しマップに貼り付けポップアップ文字列を登録
	gMarker = L.marker(goal).addTo(mymap).bindPopup(imsg);
	let d = distance(lng1, lat1, lng2, lat2);		// 距離を計算
	info.innerHTML = "距離: "+Math.round(d*100)/100+"m";	// 表示
    } else {				// 始点終点ともに存在するとき
	sMarker.remove(mymap);		// 始点マーカの除去
	gMarker.remove(mymap);		// 終点マーカの除去
	start = goal = sMarker = gMarker = null;
	info.innerHTML = "クリアしました";
    }
}
mymap.on('click', startOrGoal);	
    var mlmap = L.map("markerlayer", {
	layers: [gsiTile],
	center: mlCenter, zoom: 16, scrollWheelZoom: false
    });
    /*     上記4行は以下のようにするのと同じ効果
	   var mlmap = L.map("markerlayer").setView(mlCenter, 16);
	   gsiTile.addTo(mlmap);
	   markerLayer1.addTo(mlmap);
	   markerLayer2.addTo(mlmap); */
    // 以下、コントロールレイヤの設定
    //   ベースレイヤはOSMと国土地理院2つをJSON形式で指定
    var baseLayers = {'OpenStreetMap': osmTile, '国土地理院': gsiTile};
    //   マーカーを2つオーバーレイレイヤに指定
    var ovlLayers
    //   ベースレイヤとオーバーレイレイヤをマップに追加
    L.control.layers(baseLayers, ovlLayers).addTo(mlmap);
    
}, false);	// HTML文書がロードされたら上のアロー関数を呼ばせる