다음지도 polygon을 DB에 넣고 뺴야하는데 도와주세요ㅜ

var mapContainer = document.getElementById(‘map’), // 지도를 표시할 div
mapOption = {
center: new daum.maps.LatLng(33.450701, 126.570667), // 지도의 중심좌표
level: 3 // 지도의 확대 레벨
};

var map = new daum.maps.Map(mapContainer, mapOption); // 지도를 생성합니다

var drawingFlag = false; // 다각형이 그려지고 있는 상태를 가지고 있을 변수입니다
var drawingPolygon; // 그려지고 있는 다각형을 표시할 다각형 객체입니다
var polygon; // 그리기가 종료됐을 때 지도에 표시할 다각형 객체입니다
var areaOverlay; // 다각형의 면적정보를 표시할 커스텀오버레이 입니다

// 마우스 클릭 이벤트가 발생하고나면 drawingFlag가 그려지고 있는 상태인 ture 값으로 바뀝니다
// 그려지고 있는 상태인 경우 drawingPolygon 으로 그려지고 있는 다각형을 지도에 표시합니다
// 마우스 오른쪽 클릭 이벤트가 발생하면 drawingFlag가 그리기가 종료된 상태인 false 값으로 바뀌고
// polygon 으로 다 그려진 다각형을 지도에 표시합니다

// 지도에 마우스 클릭 이벤트를 등록합니다
// 지도를 클릭하면 다각형 그리기가 시작됩니다 그려진 다각형이 있으면 지우고 다시 그립니다
daum.maps.event.addListener(map, ‘click’, function(mouseEvent) {

// 마우스로 클릭한 위치입니다 
var clickPosition = mouseEvent.latLng; 

// 지도 클릭이벤트가 발생했는데 다각형이 그려지고 있는 상태가 아니면
if (!drawingFlag) {

    // 상태를 true로, 다각형을 그리고 있는 상태로 변경합니다
    drawingFlag = true;
    
    // 지도 위에 다각형이 표시되고 있다면 지도에서 제거합니다
    if (polygon) {  
        polygon.setMap(null);      
        polygon = null;  
    }
    
    // 지도 위에 면적정보 커스텀오버레이가 표시되고 있다면 지도에서 제거합니다
    if (areaOverlay) {
        areaOverlay.setMap(null);
        areaOverlay = null;
    }

    // 그려지고 있는 다각형을 표시할 다각형을 생성하고 지도에 표시합니다
    drawingPolygon = new daum.maps.Polygon({
        map: map, // 다각형을 표시할 지도입니다
        path: [clickPosition], // 다각형을 구성하는 좌표 배열입니다 클릭한 위치를 넣어줍니다
        strokeWeight: 3, // 선의 두께입니다 
        strokeColor: '#00a0e9', // 선의 색깔입니다
        strokeOpacity: 1, // 선의 불투명도입니다 0에서 1 사이값이며 0에 가까울수록 투명합니다
        strokeStyle: 'solid', // 선의 스타일입니다
        fillColor: '#00a0e9', // 채우기 색깔입니다
        fillOpacity: 0.2 // 채우기 불투명도입니다
    }); 
    
    // 그리기가 종료됐을때 지도에 표시할 다각형을 생성합니다 
    polygon = new daum.maps.Polygon({ 
        path: [clickPosition], // 다각형을 구성하는 좌표 배열입니다 클릭한 위치를 넣어줍니다 
        strokeWeight: 3, // 선의 두께입니다 
        strokeColor: '#00a0e9', // 선의 색깔입니다   
        strokeOpacity: 1, // 선의 불투명도입니다 0에서 1 사이값이며 0에 가까울수록 투명합니다
        strokeStyle: 'solid', // 선의 스타일입니다
        fillColor: '#00a0e9', // 채우기 색깔입니다
        fillOpacity: 0.2 // 채우기 불투명도입니다
    });

    
} else { // 다각형이 그려지고 있는 상태이면 
    
    // 그려지고 있는 다각형의 좌표에 클릭위치를 추가합니다
    // 다각형의 좌표 배열을 얻어옵니다
    var drawingPath = drawingPolygon.getPath();

    // 좌표 배열에 클릭한 위치를 추가하고
    drawingPath.push(clickPosition);
    
    // 다시 다각형 좌표 배열을 설정합니다
    drawingPolygon.setPath(drawingPath);
     

    // 그리기가 종료됐을때 지도에 표시할 다각형의 좌표에 클릭 위치를 추가합니다
    // 다각형의 좌표 배열을 얻어옵니다
    var path = polygon.getPath();

    // 좌표 배열에 클릭한 위치를 추가하고
    path.push(clickPosition);
    
    // 다시 다각형 좌표 배열을 설정합니다
    polygon.setPath(path);
}

});

// 지도에 마우스무브 이벤트를 등록합니다
// 다각형을 그리고있는 상태에서 마우스무브 이벤트가 발생하면 그려질 다각형의 위치를 동적으로 보여주도록 합니다
daum.maps.event.addListener(map, ‘mousemove’, function (mouseEvent) {

// 지도 마우스무브 이벤트가 발생했는데 다각형을 그리고있는 상태이면
if (drawingFlag){

    // 마우스 커서의 현재 위치를 얻어옵니다 
    var mousePosition = mouseEvent.latLng; 
    
    // 그려지고있는 다각형의 좌표배열을 얻어옵니다
    var path = drawingPolygon.getPath();
    
    // 마우스무브로 추가된 마지막 좌표를 제거합니다
    if (path.length > 1) {
        path.pop();
    } 
    
    // 마우스의 커서 위치를 좌표 배열에 추가합니다
    path.push(mousePosition);

    // 그려지고 있는 다각형의 좌표를 다시 설정합니다
    drawingPolygon.setPath(path);
}             

});

// 지도에 마우스 오른쪽 클릭 이벤트를 등록합니다
// 다각형을 그리고있는 상태에서 마우스 오른쪽 클릭 이벤트가 발생하면 그리기를 종료합니다
daum.maps.event.addListener(map, ‘rightclick’, function (mouseEvent) {

// 지도 오른쪽 클릭 이벤트가 발생했는데 다각형을 그리고있는 상태이면
if (drawingFlag) {
    
    // 그려지고있는 다각형을  지도에서 제거합니다
    drawingPolygon.setMap(null);
    drawingPolygon = null;  
    
    // 클릭된 죄표로 그릴 다각형의 좌표배열을 얻어옵니다
    var path = polygon.getPath();

    // 다각형을 구성하는 좌표의 개수가 3개 이상이면 
    if (path.length > 2) {
        
        // 지도에 다각형을 표시합니다
        polygon.setMap(map); 

        var area = Math.round(polygon.getArea()), // 다각형의 총면적을 계산합니다
            content = '<div class="info">총면적 <span class="number"> ' + area + '</span> m<sup>2</sup></div>'; // 커스텀오버레이에 추가될 내용입니다
            
        // 면적정보를 지도에 표시합니다
        areaOverlay = new daum.maps.CustomOverlay({
            map: map, // 커스텀오버레이를 표시할 지도입니다 
            content: content,  // 커스텀오버레이에 표시할 내용입니다
            xAnchor: 0,
            yAnchor: 0,
            position: path[path.length-1]  // 커스텀오버레이를 표시할 위치입니다. 위치는 다각형의 마지막 좌표로 설정합니다
        });      

         
    } else { 
        
        // 다각형을 구성하는 좌표가 2개 이하이면 다각형을 지도에 표시하지 않습니다 
        polygon = null;  
    }
    
    // 상태를 false로, 그리지 않고 있는 상태로 변경합니다
    drawingFlag = false;          
}  

});

다음지도에 있는 면적그리는 예제입니다. 네 잘됩니다.
그런데 제가 하고싶은건 이 면적 그대로 DB에 넣고 뺴는식으로 다른페이지에서 띄워주어야하는데
그렇게 제가 생각해본게 사각형을 그리면 면적이 나오고 각각 찍히는 위도 경도를 디비에 넣고 뺴야한다고 생각했는데 이상한것같아서
map:map
id:polygon

이런식으로 줘서 뭉텅이로 뺴와야하는지 모르겠습니다 ㅠ 도와주세요 ㅠ

따로 공간 DB를 사용하시는게 아니라면
문자열로 만들어서 저장해야 하고
문자열을 받아서 그려주어야 합니다.

var pathArr = polygon.getPath();
var coordsArr = pathArr.map( function( path ) {
    return { lat: path.getLat(), lng: path.getLng() };
});
var coordsStr = JSON.stringify( coordsArr );

// coordsStr을 서버로 전송하여 DB에 저장합니다.
// --------------------------------------------------------

// DB에 저장된 데이타를 문자열(coordsStr)로 받은 경우
// 역변환(deserialize, 문자열=>객체화)해서  하여 그려준다.
var coordsArr = JSON.parse( coordsStr );
var path = coordsArr.map(function ( coords ) {
    return new daum.maps.LatLng( coords.lat, coords.lng );
});
var polygon = new daum.maps.Polygon({
     map: map,
     path: path
});

실례지만 JSON은 아직 잘 몰라서…
do while문으로 클릭하면 좌표를 배열로 누적 시켜서 넣고빼는 방식은 틀린거네요…
그릴때 각각 사각형 꼭짓점을 누를떄마다 밑에 위도 경도는 바뀝니다.
아직 배우는 단계라 혹시 조금더 상세하게 가르쳐주실 수 있으신지요…? ㅎ

맞고 틀리고는 없습니다.
그건 구현 스펙에 달린거고 방법은 여러가지가 있겠죠.

다만 저는 무언가 Javascript의 객체 자체를 디비에 넣으려고 하시는 것 같아서
그것은 불가하다는 말씀을 드리려고 한 것이었고요.
polygon 객체 자체가 아닌 그것을 이루고 있는 좌표들을 저장해야 하며
그렇게 좌표의 배열을 서버를 통해 보내려면 직렬화하여야 하고
그렇기에 JSON이라는 내장 객체를 사용한 것입니다.

JSON이라는 내장 객체는 자바스크립트 객체의 직렬화 / 문자열의 객체화(혹은 역직렬화) 를 담당하고 있으며

JSON.parse()
JSON.stringify()

라는 method명으로 접근 가능합니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON

polygon.getPath() 로 얻은 객체는
daum.maps.LatLng의 배열이기 때문에
[ LatLng, LatLng, …]
형태인데 LatLng은 자바스크립트 객체로 일종의 포인터라고 생각하시면 됩니다. 이것을 JSON 포멧으로 직렬화 할 수는 없죠. 직렬화 가능 대상은 오브젝트/배열 표현과 숫자, 문자열, boolean값 정도입니다.
때문에 저 LatLng를 숫자를 포함하는 오브젝트 표현으로 바꿔주는게 다음의 과정입니다.

var coordsArr = pathArr.map( function( path ) {
    return { lat: path.getLat(), lng: path.getLng() };
});

이러면 coordsArr에는
[ {lat: xxx, lng: xxx}, {lat: xxx, lng: xxx}, …]
이렇게 들어가게 되고 직렬화가 가능한 자료구조가 됩니다.

역직렬화의 경우에는 반대로 생각하시면 됩니다.
그저 단순히 구조화된 객체에 들어있는 숫자 뿐이니 그것을 지도에서 사용 가능한 객체로 변환시켜줘야겠죠.

아무튼 대략 이런 프로세스인데,
이것 마저도 정답은 아닙니다. 뭘 구현하시느냐는 개발자에게 달렸고
저는 힌트/가이드만 드리는 것이죠 ^^;
구체적인 코드를 작성해 드리는건 여러 이유에서 좋지 않은 일이라고 생각합니다.

2개의 좋아요

진짜 정말 진심으로 감사합니다.
어느정도 조금씩 감이 오는 것 같습니다.
사… 사…ㄹ… 감사합니다!!!

1개의 좋아요

고마움만 받겠습니다 :slight_smile: