[GIS] DuraMap-Xr, 특정 레이어를 최상단으로 이동시키기

특정 레이어의 이름을 gl이라고 할때.. 이 gl이라는 이름의 레이어를 최상단에 위치시키는 코드입니다.

String lastLayerName = XrMain.Layers.GetLayerName(XrMain.Layers.Count - 1);
if(lastLayerName.CompareTo("gl") != 0)
{
    XrMain.Layers.MoveLayer("gl", lastLayerName, false);
    XrMain.Update();
}

가장 먼저 최상단에 위치하는 레이어를 구하고.. 최상단의 레이어가 gl이 아닐 경우에 4번 코드의 MoveLayer 매서드를 통해 최상단으로 이동시켜 주면 됩니다. MoveLayer의 세번째 인자값을 false로 주었는데.. 이동시킬 위치를 기준으로 앞으로 이동시킬 것인지.. 뒤로 이동시킬 것인지에 대한 값입니다. 여기서는 false로 주었으므로 뒤쪽으로 이동시킨다는 의미입니다.

잠시 듀라맵을 이용하여 작업하던차에… 정리해 봅니다..

[GIS] DuraMap-Xr, 편집 Event 정리

듀라맵에서 그래픽 레이어나 SHP 파일의 도형을 편집할때.. 편집에 대한 흐름을 보다 융통성있게 처리하기 위해 다음과 같은 이벤트를 제공합니다.

  • OnEditAddedRow – 마우스를 통해 새로운 도형이 그려져 레이어에 추가된 직후 발생하는 이벤트
  • OnEditBeforeDeleteRows – 선택된 도형(들)을 DEL 키를 눌러 삭제하기 직전에 발생하는 이벤트
  • OnEditDeletedRows – 선택된 도형을 DEL 키를 눌러 삭제된 직후 발생하는 이벤트
  • OnEditModifiedRows – 선택된 도형(들)이 편집된 직후 발생되는 이벤트
  • OnEditSelectionChanging – 마우스를 통해 도형(들)이 새롭게 선택된 직후 발생하는 이벤트
  • OnEditSelectionChanged – 마우스를 통해 도형(들)을 새롭게 선택하기 직전에 발생하는 이벤트

편집에 대해서 총 6개의 이벤트를 제공합니다. 언급된 순서대로 하나 하나 예제 코드를 통해 간단히 살펴보도록 하겠습니다.

먼저 OnEditAddedRow의 이벤트에 대한 C# 코드는 다음과 같습니다.

private void Xr_OnEditAddedRow(object sender,
    XrMapLib._IXrMapControlEvents_OnEditAddedRowEvent e)
{
    int fid = e.fID;

    ....
}

이벤트 매서드의 인자로 넘겨진 XrMapLib._IXrMapControlEvents_OnEditAddedRowEvent e에는 fID라는, 새롭게 추가된 도형에 대한 ID 값이 담겨있습니다.

그리고 다음은 OnEditBeforeDeleteRows에 대해 알아보겠습니다. 이 이벤트는 도형을 삭제하기 전에 정말 삭제할지의 여부를 사용자에게 묻기 위한 용도로 사용될 수 있습니다. 코드 예입니다.

private void Xr_OnEditBeforeDeleteRow(object sender, EventArgs e)
{
    DialogResult DR = MessageBox.Show(
        "Are you sure that selected POIs be deleted?", "Delete POI",       
        MessageBoxButtons.YesNoCancel);
    Xr.Edit.AllowDeleteByKeyboard = (DR == DialogResult.Yes);
}

먼저 메세지 상자를 통해 선택된 도형을 지울 것인지를 묻습니다. 사용자가 Yes가 아닌 버튼을 누르면 Xr의 Edit 프로퍼티인 AllowDeleteByKeyboard를 false로 지정하여 삭제하지 않습니다.

다음은 OnEditDeletedRows 이벤트입니다. 이 이벤트는 선택한 도형을 DEL 키를 눌러 실제로 삭제된 직후에 발생하는 이벤트이며 도형이 삭제된 후에 어떤 일을 해야 한다면 이 이벤트에서 처리해 주면 됩니다.

그리고 OnEditModifiedRows입니다. 선택된 도형(들)을 이동하거나 새로운 정점을 추가하거나 삭제할때 발생하는 코드입니다. 코드 예는 다음과 같습니다.

private void Xr_OnEditModifiedRows(object sender, EventArgs e)
{
    ValueList id = Xr.Edit.GetSelectedRows();
    if (id.Count > 0)
    {
        ....
    }
}

위의 코드는 도형이 편집된 직후 어떤 도형이 편집되었는지를 파악하기 위해서 Xr.Edit의 GetSelectedRows 매서드를 통해 ID의 목록을 얻어올 수 있습니다. 도형이 편집된 직후 무언가를 처리해야 한다면 바로 이 이벤트에서 처리해주면 됩니다.

다음으로 OnEditSelectionChanging 입니다. 이 이벤트는 사용자가 선택된 도형에 대한 선택 상태를 변경하기 직전에 발생하는 코드로써.. 예를 들어 A라는 도형이 선택되었을때.. 아니면 선택된 도형이 없는 상태에서 B라는 다른 도형을 선택하거나 A라는 도형의 선택을 해제했을때 발생합니다. 이 이벤트에 대한 응용예는 선택된 도형을 DEL 키를 통해 삭제했을때 어떤 도형을 삭제했는지를 파악할때 사용할 수 있는 이벤트입니다.

끝으로 OnEditSelectionChanged 이벤트입니다. 이 이벤트는 사용자가 도형을 선택하거나 선택 상태를 해제한 직후에 발생하는 이벤트입니다. 사용 예제 코드는 다음과 같습니다.

private void Xr_OnEditSelectionChanged(object sender, EventArgs e)
{
    ValueList vl = Xr.Edit.GetSelectedRows();
    if (vl.Count > 0)
    {
        ....
    }
}

사용자가 도형을 선택한 후 어떤 일을 수행해야 할때 이 이벤트를 사용할 수 있습니다.

[GIS] SHP을 SQL 문으로 변환해 주는 툴 – SHP2SQL

SHP 파일의 좌표 정보와 속성 정보를 DBMS에 테이블 구조를 생성하고 값을 추가하는데 필요한 SQL문을 생성해 주는 툴입니다. 현재는 포인트 타입에 대한 SHP 파일에 대해서 적용할 수 있습니다. 먼저 실행 화면은 아래와 같습니다.

사용자 삽입 이미지
위의 UI 화면에서 Export Fields에 DBMS로 내보내고자 하는 필드를 선택하면 됩니다.. 필요없는 필드값에 대해서도 제외시켜도 됩니다. 이 기능을 이용해서 DBMS에 따라 필드명으로써 사용할 수 없는 필드는 이곳을 통해 제외시켜줄 수 도 있습니다.. 위의 화면 예시처럼 입력값들을 지정한 후 변환 버튼을 누르게 되면 다음과 같은 sql 문이 담긴 텍스트 파일이 만들어 집니다..

사용자 삽입 이미지
테이블을 생성하고 생성된 테이블에 속성값을 추가하기 위한 Ansi SQL 구문으로 구성됩니다.. 이 내용을 수정해 줄 필요(테이블명)도 있을 것입니다..  이렇게 생성된 SQL 파일을 각 DBMS에서 불러와 실행해주면 간단하게 DBMS에 SHP 파일에 대한 테이블이 생성됩니다.. MySQL의 경우 soruce 명령어를 이용해서 외부의 sql 문이 담긴 파일을 실행할 수 있습니다.

이 툴의 실행을 위해서는 최신 버전의 듀라맵을 설치하셔야 합니다. 다음 url을 통해 듀라맵을 설치하시기 바랍니다.

http://www.gisdeveloper.co.kr/notice/574

소스 코드와 컴파일된 실행 파일 모두를 제공해 드리니.. 개발자 분이라면 목적에 맞게 커스터마징해 사용하시길 바랍니다..

아래의 이미지는 위에서 만들어진 sql 구문이 담긴 text 파일을 MySQL에서 실행시켜 만들어진 테이블을 조회해 본 화면입니다.

사용자 삽입 이미지
위의 이미지를 보시면.. X, Y 필드명으로 POI의 좌표가 자동으로 추가된 것을 확인할 수 있습니다.

[GIS] 구글맵의 타일맵의 크기

정확히 말씀드리면.. 아이폰에서 구글맵에서 서비스 되는 타일맵의 크기입니다. 블로그의 방문자분 중 모바일폰의 지도 서비스에서 타일맵의 트래픽 관련 댓글을 보고.. 혹시나 해서 제가 가지고 있는 아이폰으로 요래 저래 단순하지만 확실한 방법으로 ^^; 타일맵의 크기를 찾아봤습니다. 아래는 그 크기를 알아보기 위해 얻은 캡쳐 화면입니다.

사용자 삽입 이미지
저는 처음에 64×64 크기의 타일맵을 사용할거라 예상했더랬습니다.. 아이폰의 픽셀 화소 크기가 일반 LCD 모니터의 화소 크기보다 미려해서.. 이런 판단을 하게 되었나 봅니다만.. 여튼.. 이번에 모바일쪽에서 서비스할 지도를 타일로 가공하는 작업을 눈앞에 두고 있던 차에.. 이제 타일맵의 크기를 128×128로 가공하도록 방향을 바꿔야 겠습니다..

끝으로.. 제가 가지고 있는 아이폰3의 화면 크기가 정확하지는 않지만.. 480×360인데.. 이 화면 크기면.. 위의 캡쳐 이미지 처럼 타일 이미지의 개수가 최소 9개면 충분하다는 결론입니다.. 현재 대부분의 스마트폰의 화면 크기가 이의 4배정도 되므로.. 곰곰히 생각해 보면.. 모바일 폰이든.. 일반 데스크탑에서든.. 타일맵의 크기를 공통적으로 256×256으로 하는 것도 별 무리는 없지 않을까 생각이 듭니다.. 타일맵 가공이 생각외로 상당히 시간이 많이 걸리고 손이 많이 가는 작업인지라.. 타일맵의 크기를 최대한 키워서 파일 개수를 최소로 줄여 작업하는게 수월하기 때문입니다..

요즘… 에어컨으로 인해.. 실내의 온도차이와 실외의 온도 차이가 너무 극심한것같습니다.. 실내에서 정신없이 작업하다가 잠시 밖에 볼일 보러 나갈라치면… 한마디로 쪈다는.. 쪈다는 표현이 딱이네요.. 쪕니다 쪌어요.. -_-; 극심한 온도차이로 생체리듬도 다소 흐트려진 요즘입니다.. 그래도 긴박한 요즘.. 정신 바짝 차려야하다는 생각으로 버텨봅니다..