<!DOCTYPE html> <html lang="ja"> <head> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>マップ 距離計測</title> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" /> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script> <style> div#mymap { width: 80vw; height: 70vh; margin: 0 auto; } h2 { background: pink; padding: 10px; } button { margin: 5px; padding: 10px 20px; font-size: 1rem; cursor: pointer; } </style> </head> <body> <h1>距離を計測する</h1> <h2 id="info">地図上でクリックしてください</h2> <h2 id="target">目標距離: 3000m</h2> <button id="undo">一つ前に戻る</button> <button id="reset">リセット</button> <div id="mymap"></div> <script> 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 latlngdist(pos1, pos2) { return pos1.distanceTo(pos2); } var path = []; var line = null; var lineprop = { color: 'navy', opacity: 0.6, weight: 8 }; var sMarker, gMarker; var totalDist = 0; var MAX_DISTANCE = 3000; var info = document.getElementById('info'); function updatedistance(delta) { totalDist += delta; info.innerHTML = `距離: ${Math.round(totalDist)}m`; if (totalDist >= MAX_DISTANCE) { alert("目標距離に達しました!"); } } function resetPath() { if (line) line.remove(); if (sMarker) sMarker.remove(); if (gMarker) gMarker.remove(); path = []; totalDist = 0; line = sMarker = gMarker = null; mymap.doubleClickZoom.enable(); info.innerHTML = "リセットされました。"; } function measurePath(e) { var latlng = e.latlng; if ( path.length > 1 && latlng.lat === path[path.length - 1].lat && latlng.lng === path[path.length - 1].lng ) { return; } path.push(latlng); var message = `北緯 ${latlng.lat} 東経 ${latlng.lng}`; if (path.length === 1) { sMarker = L.marker(latlng).addTo(mymap).bindPopup(message); gMarker = L.marker(latlng).addTo(mymap).bindPopup(message); line = L.polyline(path, lineprop).addTo(mymap); info.innerHTML = "始点が設定されました。"; } else { line.addLatLng(latlng); gMarker.setLatLng(latlng); updatedistance(latlngdist(path[path.length - 2], latlng)); } if (e.originalEvent.shiftKey) { resetPath(); } } function removePoint() { if (path.length > 1) { let removed = path.pop(); updatedistance(-latlngdist(removed, path[path.length - 1])); line.setLatLngs(path); gMarker.setLatLng(path[path.length - 1]); mymap.panTo(path[path.length - 1]); } else { info.innerHTML = "始点は削除できません。"; } } mymap.on("click", measurePath); document.getElementById("undo").addEventListener("click", removePoint); document.getElementById("reset").addEventListener("click", resetPath); </script> </body> </html>