[GIS] DuraMap-Xr의 공간 데이터 편집 기능에 대한 간단한 시연

DuraMap-Xr에 대한 공간 편집 기능 문의가 있어 간단하게 만들어 본 동영상을 공유해 봅니다. SHP 파일에 대한 편집 내용으로.. 크게 새로운 공간 데이터 추가와 기존 데이터의 편집 기능을 소개하고 편집 기능에서 매우 활용도가 큰 정점(Vertex)와 선분(Edge)에 대한 스냅(Snap) 기능과 편집된 이력에 대한 Undo/Redo에 대한 시연 내용으로 구성되어 있습니다.

[Flash] http://www.gisdeveloper.co.kr/wp-content/uploads/1/1195370430.swf

DuraMap-Xr은 PC에 저장된 공간 데이터뿐만 아니라 공간 데이터 서버에 존재하는 공간 데이터에 대해서도 편집이 가능합니다. 동영상의 용량 문제로 급하게 만들어 충분한 내용을 전달하지 못해 아쉽지만.. 위의 시연 내용으로 DuraMap-Xr에 대한 공간 데이터 편집 기능에 대한 튜토리얼을 작성해 보다 자세하게 소개하도록 할 예정입니다..

단순한 파일 복사인데 왜 메모리 사용량이 계속 올라갈까?

이번에 타일맵을 생성해 납품하면서.. 최종 테스트를 위해 실서버로 타일맵 파일을 복사해야 하는데.. 이게 머리가 아픕니다.. 몇가지 시행착오로 인해 4일정도를 허비했는데요..

시행착오라 함은.. 먼저 타일맵 파일을 서버로 바로 FTP로 전송했던 시행 착오.. 그리고 타일맵을 압축해서 전송하려고 압축을 시도 했던 시행 착오.. 외장형 하드를 하나 더 구입해 이 하드에 복사한 후 서버가 설치된 IDC에 가서 복사하려고 했던 착오.. 이네요..

먼저 가장 근본적인 상황은.. 타일맵 파일들의 개수와 크기입니다. 정확히 말하면 크기는 별 문제가 아닙니다. 실제 용량은 100기가 정도되는데.. 이 정도면 3~4시간 정도면 복사하고도 남습니다. 문제는 파일 개수입니다. 매우 작은 크기(4kb~25kb)의 파일 개수가 5천8백만개정도됩니다..

파일들을 바로 FTP로 전송을 시도 했다면 소요되는 시간은 20일정도.. zip으로 압축하는 것은.. 수천만개의 파일을 하나의 zip으로 압축하는건 않되었고.. 백만개씩 나눠 압축하는 것은 손도 시간도 너무 많이 필요한 작업이고.. 외장형 하드에 복사하는 것이 가장 옳바른 판단이였는데.. 이 복사하는 시간에 대한 예상 시간은 2일로 산출되더군요..

그래서 어제 복사를 중지하고.. 오늘 아예 서버의 하드를 떼왔습니다. 그리고 오늘 11시 경부터 도스 시절부터 제공해 오던 XCopy를 이용해 복사를 하고 있습니다. 만약 XCopy가 아닌 드레그&드랍으로 했다면… 이거 실패합니다. 여하튼.. 이런 저런 시행착오 끝에 진행을 하고 있는데요.. 또 불안감이 엄습하네요…

사용자 삽입 이미지
보시면 메모리와 시스템의 핸들이 이상합니다.. 처음 시작할때 메모리 사용량은 2.30GB였는데요. 지금은 무려 4.92GB까지 올라갔습니다. 핸들 역시 눈에 띠지 않게 조심스럽게 올라가고 있습니다. 단순한 파일 복사일 뿐인데… 왜 이렇게 메모리 누수가 발생하는건지….. 이대로라면 새볔녁에 예전 격었던 시행착오처럼 실패할 가능성이 보입니다..

이대로 걸어 놓고 퇴근하려고 하는데.. 신경쓰이게 말이죠… 단순한 파일 복사…. 이런 단순한 파일 복사가 수천, 수백만번 수행… 메모리 누수? 복사할 파일을 열고 않닫나? 이건 아닐텐데… 왜? 메모리가 계속 올라가지… 뭐 이런……. 여하튼.. 별 뾰족한 수가 없습니다.. 그냥 맡길수밖에요….

[GIS] Polygon To Point

많은 경우에 Polygon 형태의 SHP 파일을 Point 형태의 SHP 파일로 변환해야할 필요가 있습니다. 이때 폴리곤을 포인트로 변환하기 위해 폴리곤의 중심섬(Centroid)을 생각할 수 있는데.. 이 툴은 폴리곤에 대한 SHP 파일을 각 폴리곤의 중심점으로 하여 포인트 SHP 파일로 변환해주는 툴입니다. 포인트로 변환된 SHP 파일에 대한 속성 파일인 DBF에는 단순히 FID 값만이 저장되는데.. 이에 대해서는 원본 폴리곤 SHP 파일에 대한 DBF를 변환된 포인트 SHP 파일과 확장자만 다르게 하여 변경해주면 속성값을 그대로 유지해주는 효과가 있습니다. 아래는 간단한 사용예입니다.

사용자 삽입 이미지
사실 이 툴은 ArcGIS에서 이와 동일한 기능을 하는 FeatureToPoint라는 툴박스의 기능이 제대로 작동하지 않는 문제가 있다고 하여 DuraMap-Xr로 해당 기능을 만든 프로그램입니다. 이 프로그램을 다운로드 하기 위해서 아래의 링크를 통해 받으시기 바랍니다. 참고로 이 프로그램을 실행하기 위해서는 DuraMap-Xr 맵엔진을 등록하여야 하며 이 사이트에서 다운로드 받으실 수 있습니다.

[GIS] DuraMap-Xr, 위성/항공 이미지 레이어

범용 GIS 엔진인 DueaMap-Xr은 위성영상이나 항공영상에 대한 이미지 데이터를 표시하기 위해 ImageMapLayer를 지원합니다. 흔히 GIS 업계에서 공간 좌표를 메타데이터로 가지는 이미지 데이터의 포맷으로 geotiff를 사용합니다. tiff는 볼래 Tag라는 개념으로 이미지 데이터에 대한 데이터로써의 메타 데이터를 제공할 수 있는 구조이면서 동시에 하나의 파일에 여러개의 이미지를 저장하고 있는 구조입니다. 파일 하나에 대해 여러개의 이미지 각각을 페이지(page)라고 합니다.

DuraMap-Xr은 이러한 공간 좌표를 가지고 있는 geotiff를 레이어로써 추가하여 살펴볼 수 있으며, 동시에 일반 이미지에 대해서도 별도의 월드(world) 파일을 통해 공간 좌표를 부여하여 화면상에 표시할 수 있습니다. 그러므로 geotiff처럼 파일안에 공간 좌표에 대한 정보가 없을 경우라도 간단히 월드 파일을 작성하여 공간 좌표 데이터를 이미지에 부여할 수 있습니다. 이 두가지 방법 모두에 대해 DuraMap-Xr은 지원하므로 사용자는 자신이 가지고 있는 이미지 데이터에 대해 수치지도와 같은 공간 데이터와 함께 공간상으로 매칭하여 살펴볼 수 있는 기능을 제공합니다.

간단히 월드 파일에 대해 설명드리도록 하겠습니다. 월드 파일의 확장자는 각 이미지 포맷에 따라 다른데.. 여기에는 일정한 규칙이 존재합니다. 즉, tif는 tfw, bmp는 bpw, jpg는 jgw, gif는 gfw, png는 pgw가 됩니다. 물론… DuraMap-Xr은 이에 대한 모든 월드 파일과 이미지 포맷을 지원합니다. 그리고 이 월드 파일은 텍스트 형식으로써 메모장을 통해 살펴보면.. 한 예로 다음과 같은 형식입니다.

0.250000
0.000000
0.000000
-0.250000
277200.125000
519583.875000

가장 첫번째 값인 0.250000은 가로 방향에 대한 셀 해상도이며 네번째인 -0.250000은 세로 방향에 대한 셀 해상도로써 음수인 이유는 그 진행방향이 위에서 아래이기 때문입니다. 흔히 GIS의 지도 좌표는 세로 방향이 아래에서 위쪽 방향으로 점점 증가하는데 이와 반대이기 때문입니다. 그리고 다섯번째와 여섯번째는 이미지의 좌상단에 있는 픽셀의 공간 좌표에 해당합니다. 여기서 설명하지 않은 두번째와 세번째는 영상에 대한 기울기와 회전정보입니다.

이 글은 월드 파일을 가지고 있는 tif 파일을 이미지 레이어로 추가하는 방법에 대해 살펴보겠습니다. 월드 파일에 대한 정보를 자체적으로 포함하고 있는 geotiff에 대해서도 이와 동일한 방법으로 사용되며, 만약 월드 파일이 존재하지 않는 단순한 이미지 파일인 경우에도 원점을 (0, 0)으로 하며 해상도를 픽셀단위로 하여 레이어로 추가할 수 있습니다. 먼저 아래와 같이 폼을 디자인합니다.

사용자 삽입 이미지
가장 첫번째 버튼인 Add GeoTiff는, 정확히 말해 geotiff는 아니지만 월드 파일을 가지고 있는 tiff 파일을 레이어로 추가하는 버튼입니다. 앞서 말씀드렸듯이.. geotiff에 대해서도 동일한 코드로 레이어로써 추가할 수 있습니다. Add GeoTiff에 대한 코드는 다음과 같습니다.

axXr1.Layers.RemoveAllLayer();
axXr1.Layers.AddImageMapLayer("img", "D:\\__Data__\\geotif\\o26007.tif");
axXr1.WaitForAllConnections();
axXr1.ZoomFullExtent();

1번 코드를 통해 이미 추가한 레이어를 모두 제거하고, 2번 코드를 통해 img라는 레이어 이름으로 지정된 파일 경로에 대한 이미지 파일을 레이어로 추가합니다. 3번 코드는 레이어를 완전히 추가될때까지 대기합니다. 위의 코드에 대한 버튼을 클릭한 결과는 아래와 같습니다.

사용자 삽입 이미지
화면상의 이미지를 확대/축소/이동하는 이미지 버튼에 대한 코드는 앞서 이미 설명했으므로 여기서는 생략하도록 하고… 다음으로 월드 파일이 없는 JPG 파일을 추가해 보도록 하겠습니다. 여기서는 이미지 영상을 통해 추가한 레이어를 통해 이미지를 회색계열이나 반전.. 그리고 밝기나 명암, 감마값 설정등을 하기 위한 코드를 설명드리기 위함입니다. 이를 위해 지도 이미지가 아닌 보다 재미있는 이미지를 사용하도록 하겠습니다. Add JPG 버튼에 대한 코드는 다음과 같습니다. 앞서 Add GeoTiff 버튼와 이미지 파일명만 다를뿐 동일합니다.

axXr1.Layers.RemoveAllLayer();
axXr1.Layers.AddImageMapLayer("img", "d:\\__Data__\\1220715771.jpg");
axXr1.WaitForAllConnections();
axXr1.ZoomFullExtent();

실행 결과는 다음과 같습니다.

사용자 삽입 이미지
깜찍한 세끼 개구리에 대한 이미지입니다. 딱딱한 지도만 보다가 이런 이미지를 보니 기분이 발랄해 지는 기분이였는데요. 여러분은 어떠신지 모르겠습니다. 이제 이 이미지에 대해서 2가지 이미지 조정을 수행해 보도록 하겠습니다. 먼저 Grey 버튼에 대한 코드입니다.

XrMapLib.ImageMapLayer lyr = axXr1.Layers.GetLayerAsImageMap("img");
if (lyr != null)
{
    lyr.Grey = !lyr.Grey;
    axXr1.Update();
}

이 버튼은 영상 이미지를 회색계열로 변경하는 기능입니다. 먼저 1번 코드를 통해 ImageMapLayer 타입의 객체를 얻어오고 Grey 속성값을 true/false로 지정하여 회색계열 여부를 지정합니다. 결과는 다음과 같습니다.

사용자 삽입 이미지
다음은 Invert 버튼에 대한 코드입니다.

XrMapLib.ImageMapLayer lyr = axXr1.Layers.GetLayerAsImageMap("img");
if (lyr != null)
{
    lyr.Invert = !lyr.Invert;
    axXr1.Update();
}

앞서 Grey 버튼에 대한 코드와 매우 유사하며 단지 4번 코드에서 Invert 속성을 통해 이미지의 반전 여부를 지정합니다. 결과는 다음과 같습니다.

사용자 삽입 이미지
이외에도 ImageMapLayer의 속성중에 Gamma, Contrast, Brightness 값을 통해 각각 감마값을 통한 밝기 조절(범위: 0~무한대값), 명암조절(범위: -100~100), 밝기조절(범위: -100~100)을 수정할 수 있습니다. 이렇게 변형된 이미지를 다시 원래의 이미지 색조로 되돌리기 위해서 SetDefaultColor 매서드를 호출하기만 하면 됩니다.