Newer
Older
2024-C1232021_kanata / measure.html
<!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>