FR_page.9

김수현·2025년 3월 18일

Suhyeon's 개발일지

목록 보기
12/34

산불이 난 위치를 알기 위해 infowindow를 통해 경도 위도를 나타내주었다.
그리고, 두 개의 마커를 클릭 시 그 두 마커의 거리를 표현할 수 있도록 해주었다.

일단, 두 마커의 거리를 구하는 함수이다.

function getDistance(lat1, lng1, lat2, lng2) {
    function deg2rad(deg) {
        return deg * (Math.PI / 180);
    }
    var R = 6371; // 지구 반지름 (km)
    var dLat = deg2rad(lat2 - lat1);
    var dLon = deg2rad(lng2 - lng1);
    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
            Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
            Math.sin(dLon / 2) * Math.sin(dLon / 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    return R * c * 1000; // 거리 (m)
}

위의 코드는, 서칭을 통해 긁어왔다.

function moveLatLngUp(lat, lng, offset = 0.0001) {
    return new kakao.maps.LatLng(lat + offset, lng);
}

let firstClick = null; // 첫 번째 클릭한 마커의 위치 저장
let infowindow = new kakao.maps.InfoWindow({ 
    zIndex: 100,
    removable : true,
});

let clickedMarkers = []; // 클릭된 마커 저장

position.forEach((a, i) => {
    setTimeout(() => {
        let location = new kakao.maps.LatLng(a[0], a[1]); 
        let markerImage = i === 0 ? firstMarkerImage : redMarkerImage;

        const marker = new kakao.maps.Marker({ 
            position: location, 
            image: markerImage, 
            zIndex: i === 0 ? 100 : 1 
        });

        marker.setMap(map); // 지도에 마커 추가

        // ✅ 마커 클릭 이벤트 추가
        kakao.maps.event.addListener(marker, "click", function () {
            const lat = location.getLat();
            const lng = location.getLng();

            // 🔥 기존 선택된 2개 마커 초기화 (3번째 마커 클릭 시)
            if (clickedMarkers.length === 2) {
                clickedMarkers.forEach((m) => m.setImage(redMarkerImage)); // 원래 크기로 변경
                clickedMarkers = []; // 배열 초기화
                firstClick = null; // 첫 번째 클릭 정보 초기화
            }

            // 현재 클릭된 마커 추가
            clickedMarkers.push(marker);
            marker.setImage(bigRedMarkerImage); // 큰 마커로 변경

            if (clickedMarkers.length === 1) {
                // 첫 번째 마커 선택
                firstClick = { lat, lng };
                let newPosition = moveLatLngUp(lat, lng, 0.0001);
                infowindow.setContent(`<div style="padding:5px;">                                
                    <strong>위도:</strong> ${convertToDMS(lat.toFixed(6))}<br>
                    <strong>경도:</strong> ${convertToDMS(lng.toFixed(6))}</div>`);
                infowindow.setPosition(newPosition); 
                infowindow.setMap(map);
                console.log("첫 번째 마커 선택:", firstClick);
            } else if (clickedMarkers.length === 2) {
                // 두 번째 마커 선택 → 거리 계산 후 표시
                const distance = getDistance(firstClick.lat, firstClick.lng, lat, lng);
                console.log("두 마커 사이의 거리:", distance.toFixed(0), "m");

                let newPosition = moveLatLngUp(lat, lng, 0.0001);
                infowindow.setContent(`<div style="padding:5px;">
                    <strong>두 위치의 거리: ${distance.toFixed(0)} m</strong><br>
                    <strong>위도:</strong> ${convertToDMS(lat.toFixed(6))}<br>
                    <strong>경도:</strong> ${convertToDMS(lng.toFixed(6))}</div>`);
                infowindow.setPosition(newPosition); 
                infowindow.setMap(map);
            }
        });
    }, i * 100);

});

두 개의 마커를 클릭 시 클릭한 마커를 표현해주기 위해 큰 마커로 변경되도록 하였다.
3번째 마커 클릭 시 앞에서 클릭한 두 개의 마커를 원본 마커 크기로 변경하기 위해 clikedMarkers배열을 설정해주었다. 이 배열의 길이로 몇번째 클릭한 마커인지 알 수 있도록 해주었다.

그리고, 첫 번째 클릭한 마커와 두 번째 클릭한 마커의 lat, lng을 알기 위해 firstclick를 설정해 주었고 두 번째 마커를 클릭하면 첫 번째 마커가 null값으로 변해 다시 처음과 두번째 마커를 클릭하여 거리를 계산할 수 있도록 해주었다.

moveLatLng함수는 infowindow의 위치가 마커를 가려서 예쁘게 보이지 않았다. 그래서 infowindow에서 offset을 통해 위치를 설정해주려 했는데 직접 적용이 안되어서 위치를 설정해주는 함수를 따로 만들어주었다.
그 결과, 마커 위에 표시되었다.

0개의 댓글