| |
|
|
|
|
|
| 그리드 레이어에 대한 간단한 소개에 이어... 그럼 어떻게 그리드 레이어를 사용하는지를 하나의 예를 통해 살펴보도록 하겠습니다. IDW 보간 기법인데요. 공간상에 분포된 기지점(이미 알고 있는 공간상의 위치와 속성값)을 이용해서 미지점에 대한 속성값을 보간해 보는 알고리즘이 바로 IDW 입니다. IDW에 대한 설명과 수학적 공식은 이 블로그에서 IDW로 검색해 살펴보시기 바랍니다. 이후부터는 IDW에 대한 알고리즘을 이해하고 있다는 전제 아래에서 설명하겠습니다만....... 이해하지 못한다고 해도 그리드 레이어를 응용하는 것에 대한 감은 충분히 익히실 수 있을거라 판단됩니다. 뭐니 뭐니해도... 코딩을 통해 살펴 보는 것이 머리도 맑고.. 정신 건강에도 좋을듯합니다.
각 버튼에 대해 간단히 설명을 드리면... Add Points 버튼은 기지점에 대한 포인트를 추가하는 버튼이며.. Add Grid Layer는 그리드 레이어를 추가하는 버튼이며.. IDW Analysis는 기지점과 추가한 그리드 레이어를 이용해 IDW 보간을 수행하는 버튼입니다. 끝으로 Color Setting은 분석 결과 그리드를 표현하는 색상을 변경하는 버튼입니다. 먼저 Add Points 코드에 대해 간단히 살펴보도록 하겠습니다.
네..! points라는 레이어 명으로 지정된 shp 파일을 레이어로 추가하는 코드입니다. 덧붙여.. 이 shp 파일에는 Value2라는 수치값 속성이 존재합니다. 즉, 이 shp 파일에는 공간상의 (x, y) 지점과 해당 수치값을 담고 있는 공간 데이터입니다. 어떤 값이 담겨 있는지를 사용자에게 보여주기 위해 9번~15번 코드를 통해 라벨을 표시하도록 했습니다. 결과는 아래 이미지와 같습니다.
이제 다음으로 Add Grid Layer 버튼에 대한 코드를 살펴보도록 하겠습니다. 코드는 다음과 같습니다. 이미 그리드 레이어에 대한 소개 글에서 살펴보았으므로 역시 간단하게 설명하도록 하겠습니다.
위의 코드는 그리드 레이어를 추가하는 코드로써 먼저 그리드 레이어에 대한 정보를 수집하는 코드가 실행됩니다. 1번 코드는 현재 화면에 대한 MBR을 얻는 코드이고 3번 코드는 그리드 레이어의 가로 셀 개수를 500개로 지정하기 위한 변수입니다. 4번 코드는 셀의 해상도 값입니다. 세로 셀 개수는 앞서 구한 MBR과 가로 셀 개수 그리고 해상도를 통해 계산하며 5번 코드에 해당됩니다. 이렇게 지정한 값을 통해 6번 코드에서 그리드 레이어의 연결문자열을 지정합니다. 메모리 상에서만 생성되며 파일을 저장하지 않습니다. 보다 자세한 내용은 그리드 레이어 소개 글을 참조하시기 바랍니다. 아무런 데이터 값도 지정하지 않은 그리드 레이어를 추가했으므로 화면상의 결과는 달라지지 않습니다. 이제 IDW Analysis 버튼에 대한 코드를 살펴보겠습니다.
Shape 지도 레이어의 공간 데이터(x,y 좌표)와 속성 데이터에 접근하기 위해 ShapeTable과 AttributeTable 객체를 얻어옵니다. 그리고 이 객체를 통해 IDW 계산식을 수행합니다. IDW에 대한 계산식은 이 블로그에서 IDW로 검색해 보시기 바랍니다. 소스 코드는 길지만.. IDW 계산을 위한 코드가 대부분을 차지 하므로 이 부분에 대한 자세한 설명은 생략하도록 하겠습니다. IDW를 계산하기 위한 power 값을 1.3으로 지정했다는 것만 언급하겠습니다. 또한 위의 코드는 IDW 보간 연산을 빠르게 하기 위한 전처리를 하지 않고 최대한 코드를 단순하게 작성하여 속도가 제법 느립니다만.. 약간의 전처리 연산을 선행하면 훨씬 빠른 연산 속도를 얻을 수 있습니다. 결과는 아래와 같습니다.
네.. 결과를 보시면 기지점을 이용하여 그 이외의 미지점에 대한 값을 보간하여 각 셀에 보간된 값을 담고 있습니다.그리드 레이어는 기본적으로 위의 결과처럼 Greyscale로 셀값을 표현하지만.. 사용자가 원하는 색상으로도 표현이 가능하며 이 기능이 바로 Color Setting 버튼입니다. 코드를 살펴보면...
색상을 구성하는 핵심 키 포인트는 먼저 기존의 Greyscale 색상들을 제거하기 위해 4번 코드에서 처럼 그리드 레이어의 ColorTable의 Clear 매서드를 호출하고 이 ColorTable에 사용자가 원하는 색상을 ColorTable의 AddColor 매서드를 통해 추가하기만 하면됩니다. 결과는 아래와 같습니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/07/05 19:08
2010/07/05 19:08
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/608 |
|
|
|
|
|
|
|
| DuraMap-Xr은 DEM나 그리드 데이터를 생성하고 읽어들이면서 그리드 데이터의 값을 수정할 수 있는 그리드 레이어 기능을 제공합니다. 그리드 레이어로써 쉽게 ArcGIS에서 제공하는 FLT 파일을 DuraMap-Xr에서 읽어 표시하는 코드는 아래와 같습니다.
코드를 살펴보면.... 먼저 1번 코드에서 AddGridMapLayer 매서드를 통해 그리드 레이어를 추가하며 이 매서드의 첫번째 인자는 레이어의 이름입니다. 중요한 것이.. 두번째 인자인데요. 오픈할 파일명과 이 파일에 대한 데이터를 메모리로 올릴지에 대한 여부를 지정하고 있습니다. 파일명을 지정하기 위해 FileName= 다음에 파일 경로를 지정하면 되고.. OnMemory= 뒤의 값이 1이면 메모리에 올린다는 의미이고 0이면 메모리에 올리지 않고 파일에서 바로 바로 데이터 값을 읽겠다는 의미입니다. 위의 코드에 대한 실행 결과는 아래와 같습니다.
실제로는 이렇게 이미 존재하는 파일을 읽는것뿐만이 아니라 새롭게 그리드 파일을 생성하는 경우가 빈번합니다. 아래의 코드는 새로운 그리드 데이터를 생성하는 API에 대한 예제입니다.
1번 코드에서 AddGridMapLayer의 두번째 인자가 그리드 데이터를 생성할때 필요한 인자값들입니다. 각 인자값에 대해 간단히 설명을 하면 다음과 같습니다.
- FileName 새롭게 생성할 그리드 데이터를 저장할 파일명이며, 이 FileName이 지정되지 않을 경우 메모리 상에서만 생성되고 파일로 저장하지 않겠다는 의미로 해석됩니다.
- OnMemory 새롭게 생성할 그리드 데이터를 메모리 상에 올릴지에 대한 여부로 1이면 메모리로 올리겠다는 의미이고 0이면 올리지 않겠다는 의미입니다. 만약 값이 0일 경우 FileName을 만든시 지정해 주어야 합니다.
- MinX 그리드 데이터에 대한 영역(MBR)에서 좌측하단에 대한 X 좌표입니다.
- MinY 그리드 데이터에 대한 영역(MBR)에서 좌측하단에 대한 Y 좌표입니다.
- Resolution 그리드 데이터에 대한 셀 해상도입니다.
- ColumnCount 그리드 데이터에 대한 가로측 방향의 셀 개수입니다.
- RowCount 그리드 데이터에 대한 세로측 방향의 셀 개수입니다.
- NullValue 그리드 데이터에 대한 셀에 값을 지정하지 않았을 경우 할당될 값입니다.
새롭게 생성된 그리드 데이터는 값이 전혀 할당되지 않았으므로 화면상에 아무것도 표시되지 않지만 분명히 주어진 공간상에 위치하고 있습니다. 이렇게 생성된 그리드 데이터에 대한 셀에 값을 읽고 쓰는 코드는 아래와 같습니다.
먼저 레이어의 이름으로 그리드 레이어 객체를 얻어오고 그리드 레이어의 셀값을 담고 있는 GridCells 객체를 얻어옵니다. 이렇게 얻어온 GridCells 객체를 통해 값을 설정하고 얻어올 수 있습니다.
이상으로 간단하게 그리드 레이어에 대한 소개를 마치고 다음으로 그리드 레이어를 응용해 공간상의 포인트 데이터를 이용해 IDW 분석을 하는 예제를 통해 그리드 레이어를 활용하는 것에 대해 살펴보도록 하겠습니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/07/01 14:27
2010/07/01 14:27
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/605 |
|
|
|
|
|
|
|
| DuraMap-Xr을 이용하여 SHP 파일이나 공간 데이터 서버로부터 제공받은 도형 데이터를 마우스를 이용하여 편집하고 편집된 결과를 SHP 파일로 다시 저장하거나 공간 데이터 서버로 반영할 수 있는 시스템 개발이 가능합니다. 이 글은 DuraMap-Xr을 이용하여 SHP 파일을 마우스로 편집하고 저장하는 API에 대해 설명합니다.
공간 데이터 편집에 대한 API 설명을 위해 간단하게 만들어 볼 데모에 대한 시연은 다음 동영상을 통해 먼저 살펴보신 후 이 글을 보면 이해가 쉬울 것으로 생각됩니다.
시연을 살펴보았다면.. 이제 시연에 소개된 데모 프로그램의 코드를 살펴봄으로써 편집 API에 대해 설명드리도록 하겠습니다. 먼저 아래와 같은 폼을 디자인합니다.
시연에서 살펴봤던 폼입니다. 편집에 대한 여러가지 기능을 포함하다보니.. 사용된 컨트롤이 제법 많습니다. 하지만 단계 별로 하나씩 살펴보면 그리 어렵지 않습니다. 먼저 Add Layers 버튼에 대해 가볍게 설명하는 것으로 시작해 보겠습니다. 아래는 Add Layers 버튼에 대한 코드입니다.
이런.. 욜라열라.. 코드가 깁니다.. 설명할것도 많겠죠..? 먼저 OpenFileDialog 대화상자를 통해 읽어올 공간 데이터에 대한 파일을 오픈합니다. 파일의 확장자를 조사하는데.. .tif의 경우는 12번째 줄처럼 AddImageMapLayer 매서드를 통해 이미지 맵 레이어로 추가하며 .shp의 경우는 16번째 줄처럼 AddShapeMapLayer 매서드를 통해 추가합니다. 추가가 성공적으로 된다면 공간 데이터 파일이 안전하게 연결될때까지 대기하고(26번 코드).. 파일이름을 문자열로하여 컴보박스 컨트롤 2개에 추가합니다. 이 컴보 박스 컨트롤은 앞서 설계한 폼에 보이는 2개의 컴보 박스에 해당하며 왼쪽의 컨트롤은 편집하고자 하는 대상 레이어를 지정할때 사용하며.. 오른쪽 컨트롤은 스냅핑 대상 레이어를 지정할때 사용합니다. 코드는 길지만 이해하는데 어려운 것은 없을듯합니다.. 궁금하신 점은 언제든 댓글로...
이제 지도를 확대/축소/이동하는 버튼(이미지가 들어간 버튼 3개)에 대한 코드에 대해 살펴보도록 하겠습니다. 이미 DuraMap-Xr에 대한 다른 API 튜토리얼에서 자주 설명했지만 다시 한번 설명하도록 하겠습니다. 먼저 확대 버튼에 대한 코드는 아래와 같습니다.
축소 버튼에 대한 코드는 아래와 같습니다.
이동 버튼에 대한 코드는 아래와 같습니다.
간단하죠? 이제 본격적으로 편집 API에 대해 집중해 볼 수 있겠습니다. New 버튼을 클릭하면 comboBox1 컨트롤에서 선택된 레이어에 새로운 도형을 마우스로 추가할 수 있는 상태로 만들게 되는데요.. New 버튼에 대한 코드는 아래와 같습니다.
먼저 편집 대상이 되는 레이어 이름을 얻기 위해 comboBox1에서 선택된 항목의 텍스트를 얻어온 후 DuraMap-Xr 엔진의 Edit 프로퍼티의 SetTargetLayer의 인자로 넘겨주게 됩니다. SetTargetLayer가 true를 반환하면 마우스를 이용하여 편집이 가능하는 것입니다. 이렇게 편집이 가능할 경우 7번 코드 ~ 12번 코드가 실행되어 새로운 도형을 마우스로 추가할 수 있는 상태로 만듭니다. 이 부분에 대해 좀더 집중적으로 설명해 보면...... 먼저 7번 코드는 새롭게 추가할 도형에 대한 FID를 얻어오는 것으로 FID는 중복되어서는 않되므로 Unique한 FID를 가져와야 하며 이런 값의 FID 값을 가져오는 함수가 GetFID입니다. 이 함수는 아래와 같습니다.
GetFID 함수는 인자로 받은 레이어 이름을 통해 중복되지 않은 새로운 FID 값을 계산하기 위해 먼저 레이어의 ShapeTable이 가지고 있는 전체 Row의 개수를 가져와 이 개수의 값을 FID을 하여 ShapeTable이 Row로 가지고 있지 않을때까지 +1 을 해주게 됩니다. 상당히 어리석은 방법이지만 다행히 SHP 파일은 FID 값을 0부터 순차적으로 가지고 있어 이번 데모의 경우 쓸만한 방법이긴합니다만.... 실제로 프로젝트에 적용할때는 비지니스 로직에 대해 적합한 방법을 적용하시기 바랍니다. 다시 New 버튼에 대한 설명으로 돌아와... 8번 코드는 마우스를 통해 새롭게 추가할 도형의 종류(ShapeType)를 얻는 것으로 편집 대상이 되는 레이어의 도형 종류를 얻어오는 것이며.. 11번 코드는 이렇게 구한 FID와 도형 종류로 하여 새로운 Row를 추가하라는 매서드입니다. 그러나 이 11번 코드의 AddNewRow 매서드를 달랑 호출한다고 하여 마우스를 통해 화면상에 새로운 Row를 그릴 수 있는 것은 아니며 마우스의 조작 여부를 지정하는 MouseMode를 XrEditMode로 지정해 주는 코드인 12번 코드가 필요합니다. 여기까지가 새로운 도형을 추가할 수 있는 편집 환경에 대한 구성이 완료된 것으로 아래의 화면은 SHP 파일을 하나 추가하여 마우스로 새로운 Row를 추가하는 예로 든 실행 화면입니다. 먼저 Add Layer 버튼으로 SHP 파일을 추가하고 편집 대상이 되는 레이어 이름을 선택(comboBox1)한 뒤에 New 버튼을 눌러 지도 화면에서 마우스 이동과 클릭을 통해 도형을 그려나가는 것입니다. 도형 그리기를 완료시키는 것은 마우스를 더블클릭하면 됩니다.
자.. 이제 다음으로 기존에 존재하는 Row을 선택하여 이동 시키거나 정점을 추가하거나 정점을 삭제하는 등의 작업을 하기 위한 Edit 버튼에 대해 살펴보겠습니다. Edit 버튼의 코드는 다음과 같습니다.
New 버튼과 유사하며 차이점은 New 버튼에서 새로운 Row를 추가하라는 AddNewRow 매서드의 호출이 빠졌다는 것입니다. 이렇게 기존에 존재하는 Row를 편집하는 것은 먼저 편집 대상 레이어를 지정(4번 코드)하고 마우스의 조작 상태를 XrEditMode로만 지정(7번 코드)해 주면 됩니다. 이렇게 되면 마우스를 이용하여 Row를 클릭해 선택하고 이동이나 정점 추가, 삭제, 이동등과 같은 편집을 수행할 수 있게 됩니다. 아래는 이에 대한 한가지 예제 화면입니다.
위의 화면처럼 선택된 도형은 도형을 구성하는 좌표에 대한 컨트롤 포인트가 표시되어 마우스를 통해 이동할 수 있습니다. 또한 Ctrl 버튼을 누른 상태에서 선택된 도형의 선분을 누르면 그 지점에 새로운 Vertex가 추가됩니다. 그리고 정점을 누른 상태에서 DEL 키를 누르면 선택된 정점이 삭제됩니다. 그냥 DEL 키를 누르면 전체 도형이 삭제됩니다. 참... 간단합니다..
Undo와 Redo 버튼은 사용자가 수행한 편집 이력을 통해 되돌리기와 되돌린 작업에 대한 재실행에 대한 코드가 실행됩니다. 먼저 Undo 버튼의 코드는 아래와 같습니다.
Redo 버튼에 대한 코드는 아래와 같습니다.
이 Undo와 Redo 버튼에 대한 편집이력 되될리기는 SetTargetLayer로 새로운 레이어를 지정해 버리기 전까지는 계속 유지되어 수행될 수 있습니다.
이제 마지막으로 편집 시에 정점과 선분에 대한 스냅 기능에 대해 설명하겠습니다. comboBox2 컨트롤은 스냅 대상이 되는 레이어를 선택하는 컨트롤이며 comboBox2의 아이템을 선택할때 발생하는 SelectedIndexChanged 이벤트의 코드는 아래와 같습니다.
스냅 대상이 되는 레이어는 단 하나만 지정될 수있는게 아니라... 여러개가 지정될 수 있습니다. 이 데모에서는 4번 코드를 통해 스냅 대상이 되는 레이어를 한개만 지정되도록 기존에 지정된 스냅 대상 레이어를 제거하고 있습니다. 5번 코드는 스냅 대상이 되는 레이어를 추가하는 코드이며 성공하면 스냅 대상이 된 레이어의 이름을 통해 정점에 대해 스냅을 할지... 또는 선분에 대해 스냅을 할지를 지정하기 위해 8번 코드와 9번 코드를 통해 지정하게 됩니다. 아래의 그림은 하나의 레이어를 추가하고 이 레이어에 대해 스냅 기능을 적용한 화면 예입니다.
이미지에는 마우스 커서가 보이지 않지만.. 마우스 커서를 따라 마우스 커서의 위치에 스냅될 정점이나 선분이 있을 경우 빨간색(정점 스냅) 또는 파랑색(선분 스냅) 십자 표시를 해주게 됩니다.
이렇게 사용자가 편집된 사항을 다시 원본 대상인 SHP 파일에 저장하기 위해 아래의 코드가 사용됩니다.
LayerName은 편집 대상이 되었던 레이어의 이름이며 이 레이어 이름으로 얻어온 ShapeMapLayer의 SaveToEsriShpFile을 통해 원래 자신의 파일 경로로 저장을 하면 됩니다. 원래 자신의 파일 경로는 2번째 코드에서 GetConnectionString 매서드를 통해 얻어올 수 있습니다. 이상으로 편집 기능에 대한 API 설명을 마치도록 하겠습니다...
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/06/23 15:22
2010/06/23 15:22
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/600 |
|
|
|
|
|
|
|
범용 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에 대한 코드는 다음과 같습니다.
1번 코드를 통해 이미 추가한 레이어를 모두 제거하고, 2번 코드를 통해 img라는 레이어 이름으로 지정된 파일 경로에 대한 이미지 파일을 레이어로 추가합니다. 3번 코드는 레이어를 완전히 추가될때까지 대기합니다. 위의 코드에 대한 버튼을 클릭한 결과는 아래와 같습니다.
화면상의 이미지를 확대/축소/이동하는 이미지 버튼에 대한 코드는 앞서 이미 설명했으므로 여기서는 생략하도록 하고... 다음으로 월드 파일이 없는 JPG 파일을 추가해 보도록 하겠습니다. 여기서는 이미지 영상을 통해 추가한 레이어를 통해 이미지를 회색계열이나 반전.. 그리고 밝기나 명암, 감마값 설정등을 하기 위한 코드를 설명드리기 위함입니다. 이를 위해 지도 이미지가 아닌 보다 재미있는 이미지를 사용하도록 하겠습니다. Add JPG 버튼에 대한 코드는 다음과 같습니다. 앞서 Add GeoTiff 버튼와 이미지 파일명만 다를뿐 동일합니다.
실행 결과는 다음과 같습니다.
깜찍한 세끼 개구리에 대한 이미지입니다. 딱딱한 지도만 보다가 이런 이미지를 보니 기분이 발랄해 지는 기분이였는데요. 여러분은 어떠신지 모르겠습니다. 이제 이 이미지에 대해서 2가지 이미지 조정을 수행해 보도록 하겠습니다. 먼저 Grey 버튼에 대한 코드입니다.
이 버튼은 영상 이미지를 회색계열로 변경하는 기능입니다. 먼저 1번 코드를 통해 ImageMapLayer 타입의 객체를 얻어오고 Grey 속성값을 true/false로 지정하여 회색계열 여부를 지정합니다. 결과는 다음과 같습니다.
다음은 Invert 버튼에 대한 코드입니다.
앞서 Grey 버튼에 대한 코드와 매우 유사하며 단지 4번 코드에서 Invert 속성을 통해 이미지의 반전 여부를 지정합니다. 결과는 다음과 같습니다.
이외에도 ImageMapLayer의 속성중에 Gamma, Contrast, Brightness 값을 통해 각각 감마값을 통한 밝기 조절(범위: 0~무한대값), 명암조절(범위: -100~100), 밝기조절(범위: -100~100)을 수정할 수 있습니다. 이렇게 변형된 이미지를 다시 원래의 이미지 색조로 되돌리기 위해서 SetDefaultColor 매서드를 호출하기만 하면 됩니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/06/04 18:37
2010/06/04 18:37
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/594 |
|
|
|
|
|
|
|
| 공간 데이터의 가시화와 편집 그리고 공간분석 기능을 제공하는 GIS 엔진인 DuraMap-Xr은 편집 기능에 있어서.. 편집 대상을 GraphicLayer와 SHP 파일등과 같은 공간 데이터로 구성된 ShapeMapLayer로 지정할 수 있습니다. 편집 대상을 GraphicLayer로 하든지 아니면 ShapeMapLayer하든지.. 그 방법은 전혀 다르지 않습니다. 여기서는 간단히 별도의 공간 데이터를 필요로 하지 않는 GraphicLayer를 대상으로 사용자가 마우스를 이용하여 폴리곤을 그리고 그려진 폴리곤에 대한 간단한 공간 연산인 Union과 Buffer 기능을 위한 DuraMap-Xr의 API에 대해서 살펴보도록 하겠습니다. 먼저 아래와 같은 폼을 구성합니다.
Xr 맵 컨트롤과 총 5개의 버튼으로 구성되어 있으며 각 버튼은 왼쪽에서 오른쪽 순서대로 클릭하여 실행됩니다. 가장 먼저 편집 대상이 되는 그래픽 레이어를 추가하고 2개의 폴리곤을 그리기 위해 Draw Polygon 1과 Draw Polygon 2 버튼이 사용됩니다. 그리고 이렇게 그려진 두개의 폴리곤을 하나의 폴리곤으로 합하기 위한 Union 버튼과 다시 이렇게 합쳐진 하나의 폴리곤에 대해 Buffer 연산을 수행하기 위한 Buffer 버튼이 존재합니다. 가장 먼저 Add Graphic Layer 버튼의 코드는 아래와 같습니다.
1번 코드는 gl이라는 이름의 그래픽 레이어를 추가하고 gl이라는 레이어 이름이 중복되지 않을 경우 true를 반환합니다. 이렇게 레이어가 완전히 추가되면 6~24번 코드를 통해 하나의 폴리라인 그래픽 요소를 추가합니다. 실행 결과는 아래와 같습니다.
화면상에 추가한 그래픽 레이어에 점선 스타일의 폴리라인을 추가한 결과가 나타난 것을 알 수 있습니다. 이제 Draw Polygon 1 버튼에 대해 살펴보겠습니다. 이 버튼을 누르게 되면 지도 화면에 마우스를 이용하여 사용자가 폴리곤을 그릴 수 있습니다. 참고로 폴리곤을 완성시키기 위해 폴리곤의 마지막 좌표를 지정할때 마우스 더블클릭을 합니다. Draw Polygon 1 버튼의 코드를 살펴보겠습니다.
1번 코드는 gl이라는 그래픽 레이어를 편집 대상으로 지정합니다. 편집 대상으로 지정하는 것이 성공했다면 gl의 그래픽 레이어를 얻어와 FID가 1번인 대상을 제거합니다. 이는 Draw Polygon 1으로 그려진 그래픽 레이어의 FID가 1을 갖게 되는데 이 버튼이 눌러질때마다 FID가 1인 새로운 폴리곤을 그릴 수 있도록 하기 위함입니다. 7~8번 코드가 FID가 1인 새로운 폴리곤을 그리도록 지정하는 코드입니다. Draw Polygon 2 버튼도 이와 유사한데, 차이점은 7번 코드에서 AddNewRow의 두번째 인자 값을 1이 아닌 2로 지정하는 것만과 5번 코드에서 RemoveElement의 인자 값 역시 1이 아닌 2로 지정한 것이 다릅니다. 즉 Draw Polygon 2 버튼은 FID가 2인 폴리곤을 마우스를 통해 그릴 수 있도록 하는 것입니다. 이렇게 Draw Polygon 1과 Draw Polygon 2 버튼에 대한 코드를 입력한 뒤 실행하고 마우스를 통해 폴리곤을 그린 화면의 예는 아래와 같습니다.
위의 화면을 보면 2개의 길다란 폴리곤이 서로 겹쳐 있도록 그려졌습니다. 이제 이렇게 그려진 2개의 폴리곤을 하나의 폴리곤으로 합치는(Union) 기능을 하는 Union 버튼의 코드를 살펴보겠습니다.
2번과 3번 코드는 gl 그래픽 레이어에서 FID가 1과 2인 그래픽 요소를 가져오는 코드이며 이렇게 가져온 그래픽 레이어에 대해 공간 연산을 수행할 수 있는 기능을 제공하는 SpatialOperator 객체를 얻기 위한 코드가 5번과 6번입니다. 7번 코드는 두개의 폴리곤들에 대해 변환된 SpatialOperator의 Union을 사용하여 하나로 합치도록 하는 코드입니다. 합쳐진 그래픽 요소의 결과는 역시 SpatialOperator입니다. 이 SpatialOperator 타입의 결과를 FID가 3인 그래픽 요소로 변환하여 그래픽 레이어에 추가하는 코드가 9~12번 코드입니다. 결과는 아래와 같습니다.
결과를 보면 정확히 두개의 폴리곤이 하나의 폴리곤으로 합쳐진 것을 볼 수 있습니다. 이제 마지막으로 이렇게 합쳐진 폴리곤에 대해 Buffer를 수행하는 Buffer 버튼의 코드에 대해 살펴보겠습니다.
FID가 3번인 그래픽 요소를 가져와 공간 연산을 수행하기 위해 이 그래픽 요소를 SpaitalOperator 객체로 변환하여 Buffer 매서드를 호출해 Buffer 기능을 수행합니다. Buffer 연산에 사용하는 인자는 얼마나 Buffer 시킬지에 대한 거리값(50)과 정밀도(32) 값입니다. 정밀도 값이 클수록 더 많은 정점이 생성되어 더욱 정밀하게 Buffer된 결과가 생성됩니다. 결과는 아래와 같습니다.
끝으로 마우스로 폴리곤을 클릭하여 선택해 보기 바랍니다. 이렇게 선택된 상태에서 선택된 도형에 대한 편집이 가능합니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/05/25 13:42
2010/05/25 13:42
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/591 |
|
|
|
|
|
|
|
| 범용 GIS 엔진인 DuraMap-Xr은 사용자가 바로 필요로 하는 도형을 추가하고 편집하기 위한 그래픽 레이어를 제공합니다. 이 그래픽 레이어를 통해 사용자는 GIS 엔진에서 제공하는 공간분석과 공간연산을 위한 객체로 사용할 수 있으며 원하는 화면 구성을 위해 활용할 수 있습니다. 또한 그래픽 레이어에 추가된 도형은 쉽게 GIS에서 사용되는 공간 데이터로 변환되어 저장될 수 있습니다.
이 글은 DuraMap-Xr이 제공하는 그래픽 레이어를 추가하고 사각형, 원, 타원, 폴리곤, 폴리라인, 포인트 그래픽 요소를 코드를 통해 추가하는 방법에 대해 설명합니다. 코드로 추가할 수 있을 뿐만 아니라 마우스를 통해 그래픽 요소를 그려 추가할 수도 있으며 기존의 그래픽 요소를 마우스로 선택하여 편집 역시 가능합니다. 이러한 마우스를 통한 편집은 다른 포스트를 통해 설명하도록 하고 이 포스트에서는 코드를 통한 그래픽 요소 추가에 대한 API에 대해 살펴보겠습니다. 먼저 아래와 같은 화면을 구성합니다.
총 7개의 버튼과 DuraMap-Xr 엔진을 추가합니다. 첫번째 버튼인 Add Graphic Layer는 그래픽 요소를 추가하기 위한 그래픽 레이어 하나를 추가하고 나머지 5개의 버튼은 각 종류에 따른 그래픽 요소를 추가합니다. DuraMap-Xr은 임의의 개수의 그래픽 레이어를 자유롭게 추가할 수 있으므로 레이어 개념으로써 응용성있게 그래픽 요소를 구성할 수 있습니다. 이제 코드에 대해 살펴보도록 하겠습니다. 먼저 Add Graphic Layer 버튼에 대한 코드입니다.
1번 코드의 AddGraphicLayer를 통해 그래픽 레이어를 추가하며 첫번째 인자는 레이어의 식별자(ID)로써 레이어의 이름이며 두번째 인자는 연결문자열로써 여기서는 메모리상에 임시로 그래픽 레이어를 추가하므로 공백 문자열 값을 주었습니다. 2번 코드는 이렇게 추가한 그래픽 레이어가 메모리 상에 안전하게 생성되어 사용될 수 있을때까지 대기하는 코드입니다. 이제 이렇게 추가한 gl이라는 이름의 그래픽 레이어에 사각형 요소를 추가하기 위한 Rectangle 버튼에 대한 코드를 살펴보겠습니다.
1~5번까지가 사각형 그래픽 요소에 대한 구성 정보이며 이렇게 구성된 그래픽 요소는 7~19번 코드를 통해 그래픽 레이어에 추가됩니다. 이때 주의할 점은 그래픽 요소는 고유한 식별자로써 ID를 가지며 이 ID값은 15번 코드에서 AddElement의 첫번째 인자로 주어지게 됩니다. 추후 이 ID 값을 통해 이미 추가된 그래픽 요소를 얻어올 수 있습니다. 결과는 아래와 같습니다.
이제 Circle 버튼의 코드를 살펴보겠습니다. 이 버튼은 원 요소를 추가하는 버튼입니다. 코드는 아래와 같습니다.
코드의 전체적인 구성은 앞서 Rectangle 버튼의 코드와 동일합니다. 1~5번 라인이 원 요소를 구성하는 코드이며 그 다음 코드는 요소에 대한 고유한 ID 값을 지정한다는 것만 주의한다면 동일합니다. 결과는 아래와 같습니다.
다음은 타원을 추가하는 Ellipse 버튼에 대한 코드입니다.
역시 앞서 코드와 구조는 같으며 1~6번코드가 타원에 대한 그래픽 요소를 구성합니다. 결과는 아래와 같습니다.
다음으로 폴리곤을 추가하는 Polygon 버튼에 대한 코드를 살펴보겠습니다.
GIS 엔진으로써 OpenMa-Xr은 폴리곤에 대해 Ring과 Multi-Polygon을 지원합니다. 위의 코드가 구멍이 뚫린 개념으로써 Ring 형태의 폴리곤을 구성하고 있습니다. 결과는 아래와 같습니다.
다음은 폴리라인을 추가하는 Polyline 버튼에 대한 코드입니다.
결과는 아래와 같습니다.
이제 끝으로 포인트를 추가하는 버튼인 Point에 대한 코드를 살펴보겠습니다. 코드는 아래와 같습니다.
폴리곤처럼 포인트와 폴리라인 역시 멀티 포인트, 멀티 폴리라인 개념을 지원하며 위의 코드는 4개의 포인트로 구성된 멀티 포인트를 그래픽 요소로 추가하는 코드입니다. 결과는 아래와 같습니다.
마지막으로 이렇게 구성된 그래픽 요소를 모두 추가한 화면을 보이면서 이 포스트를 마치도록 하겠습니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/05/13 15:41
2010/05/13 15:41
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/588 |
|
|
|
|
|
|
|
| 수치 데이터로 구성된 데이터를 차트와 같은 그래프로 표현하여 사용자의 이해를 높일 수가 있습니다. 여기에 더해 통계 데이터로 구성되는 차트를 지도 위에 표현한다면 더욱 이해도를 높일 수 있을 것입니다. 이 글은 DuraMap-Xr에서 차트를 표현하는 API에 대해 설명합니다. 먼저 아래와 같이 버튼 4개와 Xr 맵 컨트롤을 폼에 추가합니다.
버튼의 구성 순서는 실행 순서와 같습니다. 먼저 Add Map Layer 버튼을 통해 서울시 지도를 레이어로 추가하고 다음으로 Add Chart Layer 버튼을 통해 차트 레이어를 추가합니다. 그리고 이렇게 추가된 차트 레이어에 수치 데이터를 통해 차트 요소를 추가하기 위하여 Add Chart Values 버튼을 클릭합니다. 그리고 차트의 범례를 추가하기 위해 Add Chart Legend 버튼을 클릭합니다. 먼저 Add Map Layer 버튼에 대한 코드는 아래와 같습니다.
동일한 SHP 파일로부터 2개의 레이어를 추가합니다. DuraMap-Xr은 동일한 지도 데이터를 통해 서로 다른 스타일로 그릴 수 있또록 지도 데이터를 공유할 수 있는 기능을 제공합니다. 1번 코드에서 원본 레이어를 추가하고 이 원본 레이어를 참조하기 위해 2번 코드에서 AddShapeMapLayer의 두번째 인자인 연결 문자열(Connection String)을 ref://로 시작하여 참조할 레이어의 이름을 덧붙인 형태로 지정합니다. 5번 코드부터는 이렇게 추가된 2개의 레이어의 스타일을 지정하는 코드입니다. 실행 결과는 아래와 같습니다.
다음으로 차트 레이어를 추가하는 코드를 살펴보겠습니다. 이 코드는 Add Chart Layer 버튼에 대한 코드입니다.
제법 긴 코드로 구성되어 있습니다. 차트 레이어에 지정할 수치 데이터의 구조와 차트를 그리기 위한 심벌을 정의하기 위한 코드입니다. 먼저 1~3번 코드가 차트 레이어를 추가하는 코드입니다. 그리고 4~7번 코드는 DuraMap-Xr에서 지원하는 차트 중에 파이 차트를 구성하도록 하는 코드입니다. 9~25번 코드는 파이차트를 그릴때 사용하는 색상 심벌을 정의하는 코드입니다. 여기서 사용할 파이 차트는 총 3개의 항목으로 구성되어 있으므로 채움 심벌과 라인 심벌을 각각 3개씩 정의합니다. 그리고 27~31번 코드가 바로 이 3개의 항목에 대한 정의입니다. 항목의 정의에서 앞서 생성한 색상 심벌을 각 항목에 지정하고 있는 것을 알 수 있습니다. 그리고 끝으로 29~33번 코드를 통해 차트의 구성 정보를 실제로 차트 레이어에 지정하는 합니다. 이 코드들은 내부적인 차트레이어를 구성하고 추가하는 코드이므로 화면상에 아무런 변화가 없습니다. 위의 코드에서 다음과 같은 RGB라는 사용자 정의 함수가 사용되고 있습니다.
이 함수는 손쉽게 RGB 값으로 C#의 색상을 지정하기 위한 유틸리티 함수입니다.
이제 실제로 차트에 대한 수치 데이터 값을 구성하는 코드가 필요합니다. 바로 Add Chart Values 버튼이 이러한 일을 수행하는 코드입니다. 차트 값은 파일로부터 읽어오는 것으로 하겠습니다. 사용할 데이터에 대한 파일은 chartdata.txt이며 내용은 아래와 같습니다.
총 25개의 줄로 구성되었으며 이는 서울시의 구가 총 25개이고 이들에 대한 수치값으로 구성되었기 때분입니다. 첫번째 컬럼인 서울시의 각 구에 대한 FID 값이며 나머지 3개의 컬럼은 앞서 설명한 3개의 항목에 대한 값입니다. 이제 버튼에 대한 코드는 다음과 같습니다.
파일을 열고 파일에 대한 텍스트 값을 읽어서 필요한 값을 파싱하는 C# 코드에 대한 설명은 생략하겠습니다. 중요한 부분은 20번 코드에서 차트가 표시될 위치를 얻어오고 텍스트 파일에서 읽어들인 수치 데이터를 21~28코드를 통해 지정합니다. 29번 코드가 실제로 이렇게 구한 차트의 표시 위치와 값을 지정하여 차트 항목을 추가하는 코드입니다. 아래의 그림은 실행 결과에 대한 이미지입니다.
이제 끝으로 차트의 범례를 추가하기 위한 Add Chart Legend 버튼에 대한 코드를 살펴보겠습니다.
중요한 부분만을 언급하면 25~31번 코드가 파이 차트에 대한 범례의 항목을 생성하여 범례에 추가하는 코드입니다. DuraMap-Xr은 범례에 대해 사용자가 원하는 다양한 요구 사항을 만족시키기 위하여 레이아웃 기반으로 범례의 구성 항목을 조립하는 형태로 범례를 구성하도록 되어 있습니다. 결과는 아래와 같습니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/05/05 21:17
2010/05/05 21:17
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/587 |
|
|
|
|
|
|
|
| 공간 상의 인구 데이터와 같은 공간 통계 데이터를 이용하여 주제도를 작성하는 기능은 GIS의 중요한 기능 중에 하나입니다. 예를들어서 각 지역에 대해 집계된 인구수를 지역 별로 비교하기 위해 단계별로 색상을 달리하여 주제도를 만들 필요가 있는데 DuraMap-Xr에서 이러한 방법에 대해 살펴보도록 하겠습니다.
필요로 하는 GIS의 기능이 정해지기 전에 먼저 파악되는 것이 아마도 데이터가 아닐까 싶습니다. 사용할 데이터는 집계구에 대한 인구수가 저장된 shp 파일로써 인구수 값에 대한 필드명은 I05_01입니다. 즉, 인구수 값에 대한 필드인 I05_01의... 값을 총 5개의 단계로 나누고 단계별로 색상을 달리하여 표현하는 주제도를 작성해 보도록 하겠습니다. 먼저 아래와 같은 폼을 디자인 합니다.
폼 위에 'Add Layer' 버튼과 'Set Theme' 버튼, 그리고 'Add Legend' 버튼이 존재하며 Xr 맵엔진이 배치되었습니다. Add Layer를 통해 앞서 설명했던 shp 파일을 레이어로 추가하고 Set Theme을 통해 통계 데이터에 대 주제도를 설정하며 끝으로 Add Legend를 통해 주제도에 대한 범계를 표시합니다. 먼저 Add Layer 버튼에 대한 코드는 다음과 같습니다.
저장된 pop.shp 파일을 통해 pop라는 이름의 레이어를 추가하는 코드입니다. 이미 다른 글들을 통해서 레이어를 추가하는 코드는 많이 살펴봤으므로 설명은 생략합니다.
다음은 Set Theme버튼에 대한 코드입니다.
1번 코드는 혹시 Xr 맵엔진의 렌더링 스레드를 통해 지도가 그려지는 중이라면 지도가 모두 그려질때까지 대기하라는 코드입니다. 이 코드가 필요한 이유는 지도를 그리고 있는데 갑작이 데이터를 변경시킬 경우 발생하는 문제를 피하기 위함입니다. 3~5번 코드는 앞서 추가한 레이어(pop)를 속성값의 범위에 따라 다른 심벌을 지정할 수 있는 주제도로 설정하고 값의 범위로 사용할 필드명(I05_01)로 지정하는 코드입니다. 그리고 7~19번 코드는 값의 범위를 총 5개의 그룹으로 만들 것이며 이 5개의 색상 심벌을 단계별 만들기 위한 코드입니다. 채움 심벌(FillSymbol)를 배열로 하여 총 5개를 만들고 외곽선 심벌(LineSymbol)에 대해서는 공용이므로 하나만 만듭니다. 그리고 이제 21~25번 코드를 통해 값의 범위와 범위를 만족하는 도형에 대한 그리기 심벌을 지정하는 코드입니다. AddRange의 첫번째와 두번째 값이 값의 범위이며 세번째와 네번째는 채움 심벌과 라인 심벌입니다. 그리고 다섯번째는 포인트 심벌로써 사용하는 데이터가 폴리곤이므로 포인트 심벌을 사용되지 않으므로 null 값으로 지정했습니다. 마지막 코드에서 Update 매서드를 호출하면 아래와 같은 결과가 나타납니다.
각 집계구의 인구에 따라 색상을 달리 표시된 것을 확인할 수 있습니다. 인구가 많은 지역은 어둠게.. 적은 지역은 밝게 표시되었습니다. 하지만 각 색상에 대해 어떤 값인지를 알수없는데, 이런 정보를 제공해주는 것이 바로 주제도에서의 범례입니다. 이제 Add Legend 버튼의 코드에 대해 살펴보도록 하겠습니다.
DuraMap-Xr의 범례는 자동화된 방식이 아니라 사용자가 직접 범례를 구성하도록 하는 방식을 제공합니다. LLS(Legend Layout System) 방식을 통해 사용가 직접 원하는 항목을 구성하여 범례를 구성하는 방식으로써 여기서는 다음과 같은 레이아웃으로 범례를 구성할 것입니다.
위의 레이아웃 설계를 보면 VerticalLayoutLegendElement를 최상위 레이아웃으로 시작해서 이 레이아웃 안에 다수의 LegendElement로 구성된 것을 살펴볼 수 있습니다. 앞서 속성값의 구룹을 총 5개로 나눴다고 했으므로 색상을 표시하기 위한 SolidColorFillBoxLegendElement 5개와 이 색상에 대한 설명을 위한 각각의 TextLegendElement 5개로 구성되어 있습니다. Add Legend 버튼의 코드를 살펴보는 것이 순서이겠지만.. 먼저 이러한 레이아웃 설계를 기반하여 작성된 코드의 결과를 살펴보는 것이 이해를 도울 것으로 생각되므로 Add Legend 버튼을 클릭했을때의 결과를 살펴보면 아래와 같습니다.
지도 화면의 우측한단에 범례가 추가된 것을 살펴볼 수 있으며 위의 범례에 대한 레이아웃 설계와 실제 표시된 범례를 비교해보면 이해가 더 쉬울 것입니다. 그럼 이제 이러한 범례를 표시하기 위한 Add Legend 버튼의 코드를 살펴보도록 하겠습니다.
3번 코드가 바로 범례를 추가하는 코드입니다. DuraMap-Xr에서는 범례를 레이어와 같은 독립된 개념으로 다루고 있다는 것을 알 수 있습니다. 8번 코드가 범례의 최외각 레이아웃인 VerticalLayoutLegendElement로써 vbox라는 이름을 지정하고 범례에 지정됩니다. 모든 범례의 구성 요소는 이름을 할당해야 하며 이 이름을 통해 각 범례의 구성 요소를 얻어와 삭제하거나 속성을 변경할 수 있습니다. 12~19번 코드는 범례의 제목을 표시하기 위한 TextLegendElement 객체를 만들고 있으며 21~23번 코드는 제목과 5개의 항목을 가시적으로 분리하기 위한 HorizontalBarLegendElement 객체를 생성하여 추가하고 있습니다. 그리고 25~40번 코드는 5개의 색상 및 설명을 위한 텍스트 항목을 추가하기 위한 코드입니다. 39번 코드는 색상에 대한 범례 요소와 텍스트 요소의 생성을 자동화하기 위한 별도의 매서드로써 다음과 같습니다.
이 매서드 역시 앞서 설명한 범례의 레이아웃 설계 그림을 기반으로 작성된 코드이므로 코드를 하나 하나 살펴보면 이해할 수 있으므로 자세한 설명은 생략하도록 하겠습니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/04/26 15:51
2010/04/26 15:51
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/586 |
|
|
|
|
|
|
|
DuraMap-Xr은 속성값에 대해 도형의 그리기 심벌을 다르게 지정하여 주제도를 작성할 수 있는 기능을 제공합니다. DuraMap-Xr에서 속성에 대한 주제도를 작성하기 위해 제공되는 주요 COM 클래스는 다음과 같습니다.
- MapThemeEqual
- MapThemeSimilarity
- MapThemeRange
- MapTheme3D
MapThemeEqual은 값이 정확히 일치하는 도형에 대한 심벌을 지정합니다. 그리고 MapThemeSimilarity는 값이 부분적으로 비슷하게 일치하는 도형에 대한 심벌을 지정합니다. 또한 MapThemeRange는 주어진 범위에 값이 포함되는 도형에 대한 심벌을 지정합니다. 끝으로 MapTheme3D는 도형의 속성값을 높이값으로 하여 도형을 입체적으로 표현합니다.
이 포스트는 이 네가지 주제도 작성 기능 중에서 유사한 값을 가지는 도형에 대한 심벌을 지정하는 MapThemeSimilarity에 대해 살펴 보도록 하겠습니다. 먼저 다음과 같은 폼을 디자인합니다.
단순하게 Xr 맵엔진과 Similarity Values ThemeMap이라는 제목의 버튼만이 존재합니다. 가장 먼저 코딩할 부분은 폼이 Load될때입니다. 다음은 폼의 Load 이벤트의 코드입니다.
lyr1이라는 이름의 레이어를 추가하며 추가되면 지도를 전체 크기로 확대합니다. 결과는 다음과 같습니다.
주제도가 속성과 밀접하게 관계되어 있으므로 이 레이어의 속성을 살펴보면 다음과 같습니다.
여기서 JIBUN이라는 필드값을 사용할 것이며 필드값중 '도'자와 '천'자가 들어간 도형에 대해 각기 다른 그리기 심벌을 지정하도록 하겠습니다. 참고로 '도'는 도로이며 '천'은 하천에 대한 지번의 부분 코드입니다. 아래는 이외에 다른 코드에 대한 내용에 대한 표입니다.
이제 Similarity Values ThemeMap 버튼의 클릭 이벤트에 대한 코드를 살펴 보겠습니다. 코드가 길지 않으니 전체 코드를 보이고 각 코드를 살펴보겠습니다.
먼저 1~3번 코드는 Load 이벤트에서 추가했던 레이어를 가져와 채움 심벌과 라인 심벌을 변경하고 있는 코드로써 채움 심벌(FillSymbol)의 Hollow를 true로 지정하면 도형의 채움을 무시하게 되고 라인 심벌(LineSymbol)의 Alpha를 0으로 주게 되면 라인 심벌을 그리지 않게 됩니다. 이렇게 지정한 이유는 주제도 기능에서 속성값에 대한 조건을 주게 되는데 조건에 만족하지 않는 도형에 대한 기본 심벌이 바로 이처럼 처음에 레이어에 지정된 심벌로 그대로 사용되기 때문입니다.
3~5번 코드가 레이어의 주제도 기능을 SimilarityTheme으로 설정하고 사용할 속성의 필드를 JIBUN이라는 필드명으로 지정합니다. 이 필드명은 앞서 레이어의 속성에 대해 언급했던 필드명입니다.
7~11번 코드는 속성값중 '도'자가 들어간 도형에 대한 심벌을 지정하기 위한 코드로써 먼저 채움심벌과 라인 심벌을 만들고 MapThemeSimilarity 객체의 AddStandard 매서드를 사용하여 조건값(%도%)과 사용할 심벌을 채움심벌, 라인심벌, 포인트심벌 순서대로 지정합니다. 여기서는 포인트 심벌을 사용할 필요가 없기 대문에 null을 주었습니다.
13~17번 코드는 7~11번 코드와 동일한 목적의 코드로 '천'자가 들어간 도형에 대한 심벌을 지정합니다.
마지막으로 Xr 맵엔진의 Update 매서드를 호출하면 다음처럼 결과가 나타나게 됩니다.
'도'자가 포함된 속성값을 가지는 도형은 지정한 심벌인 황색으로 표시되고 '천'자가 포함된 속성값을 가지는 도형은 파랑색으로 표시되며 조건에 만족하지 않는 도형들은 모두 레이어에 지정된 기본 심벌대로 그려지게 됩니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/04/23 17:08
2010/04/23 17:08
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/585 |
|
|
|
|
|
|
|
| DuraMap-Xr을 통해 SHP을 읽어 추가된 레이어의 타입은 ShapeMapLayer입니다. 이 ShapeMapLayer를 통해 수치지도에 대한 도형 데이터에 접근할 수 있는 테이블을 얻을 수 있고 이 테이블을 통해 각 도형에 대한 로우(Row)를 얻을 수 있습니다. 그리고 이 Row를 통해 도형의 종류뿐만 아니라 MBR과 도형을 구성하는 좌표의 목록을 얻을 수 있습니다. 이 글은 Xr에서 도형에 대한 정보를 얻기위한 방법에 대해 설명합니다. 먼저 아래와 같은 폼을 만듭니다.

Xr 맵 엔진과 Open SHP라는 버튼 그리고 ListBox 컨트롤이 배치되었으며 보이지는 않지만 SHP 파일을 읽기 위한 OpenFileDialog 컨트롤이 추가되어져 있습니다. 기본적인 실행 흐름은 OpenSHP을 클릭하면 Xr 맵 엔진에 추가할 SHP 파일을 선택하기 위한 파일 열기 대화상자가 표시되며 원하는 SHP 파일을 선택하게 되면 Xr 맵 엔진에 표시되며 동시에 ListBox 컨트롤에 SHP 파일을 구성하는 도형에 대한 MBR 좌표를 표시합니다. 가장 먼저 Open SHP 버튼의 코드를 살펴보도록 하겠습니다.
4~5번 코드를 통해 버튼을 두번 이상 눌렀을 경우 map이라는 이름의 레이어가 다시 추가되는 일이 없도록 기존의 map 이라는 이름의 레이어를 제거해주고 있습니다. 7~9번 코드는 선택한 SHP 파일을 map이라는 이름의 레이어로 추가하고 추가가 될때까지 기다렸다가 레이어를 화면상에 표시하도록 하는 코드입니다. 그리고 아직 정의되지 않았지만 가장 중요한 OutputVertexToListBox 함수를 통해 레이어를 구성하는 도형의 MBR을 표시하도록 합니다. 그럼 OutputVertexToListBox 함수에 대해 살펴보도록 하겠습니다.
비교적 짧게 구성된 함수이지만 코드 단위로 설명하면... 먼저 3~4번 코드는 map이라는 이름의 레이어가 존재하는지 검사하여 존재하지 않으면 바로 함수를 종료시키도록 합니다. 6~7번 코드는 map이라는 이름의 레이어를 얻어와 얻은 레이어의 도형 데이터를 가지고 있는 테이블을 가져와 IShapeTable이라는 인터페이스 타입에 저장하고 있습니다. 그리고 9~10번 코드는 테이블에 저장된 Row을 얻기 위한 준비작업으로써 Row을 얻기 위해서는 정수형 값인 FID와 Row를 저장할 인터페이스 타입인 IShapeRow의 변수를 준비하고 있습니다. 기본적으로 SHP 파일의 FID는 0에서부터 (Row의 개수 - 1)까지 존재합니다. IShapeTable의 GetRow에 옳바르지 않은 FID가 지정되면 null을 반환합니다. 11~23번 코드가 Row을 하나 하나 가져와 MBR을 얻어 listBox1 컨트롤에 문자열 형태로 구성하여 추가하는 코드입니다. IShapwRow를 통해 MBR과 좌표의 개수, 좌표를 얻을 수 이 수 있는 매서드를 제공합니다. 도형은 여러개의 부분으로 구성될 수 있는데.. 몇개의 부분으로 구성되었는지 역시 얻어올 수 있습니다. 이와 관련된 매서드는 GetVertex, GetVertexCountFromPart, GetVertexFromPart, PartCount, VertexCount, Vertex입니다. Vertex 프로퍼티는 도형을 구성하는 가장 첫번째 정점을 반환하는 편리성을 위해 제공됩니다. 다음은 필자의 PC에 저장된 SHP 파일에 대해 실행된 결과 화면입니다.

이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/04/18 20:38
2010/04/18 20:38
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/584 |
|
|
|
|
|
|
|
| GIS에서 공간 데이터는 도형에 대한 좌표값과 이 도형에 대한 속성 값으로 이루어져 있습니다. 여기서 속성 데이터는 데이터베이스의 테이블 구조와 동일하게 필드 정보와 필드에 해당하는 값에 해당하는 레코드 정보로 구성되어 있습니다. DuraMap-Xr에서 이러한 속성 데이터를 확인하는 API에 대해 살펴보기 위해 마우스로 화면상의 도형을 클릭하면 해당 도형의 속성값을 간단히 메시지 창에서 표현해 주는 예제를 작성해 보도록 하겠습니다. 먼저 다음과 같은 UI를 작성합니다.

총 6개의 버튼과 Xr 맵 컨트롤로 구성되어 있습니다. 첫번째 버튼은 shp 파일을 통해 레이어를 추가하기 위한 버튼(Add Layer)이며 이미지를 캡션으로 추가한 4개이 버튼은 마우스를 통해 지도를 조작하기 위한 전체 보기, 확대, 축소, 이동에 대한 버튼입니다. 끝으로 마지막 버튼(Identify)는 마우스로 화면상의 도형을 선택하면 해당 도형의 속성을 표시하도록 하는 버튼입니다. 먼저 Add Layer에 대한 코드는 로컬에 존재하는 shp 파일을 추가하는 코드로써 다음과 같습니다.
여기서는 행정동에 해당하는 shp 파일에 대한 레이어를 추가(다른 shp 파일을 사용해도 상관없음)하고 있으며 추가한 후에 바로 레이어의 그리기 심벌을 변경해주고 있습니다. 그리고 ZoomFullExtent를 호출하여 레이어 전체 보기를 수행하고 마우스의 조작 모드를 확대 모드로 설정하기 위해 MouseMode를 XrZoomInMode로 지정합니다.
다음으로 마우스를 통해 화면상의 지도를 조작하기 위한 4개의 버튼은 다음과 같습니다. 이미 DuraMap-Xr의 튜토리얼에서 소개했던 코드이지만 복습을 위해 다시 한번 살펴보면 다음과 같습니다.
먼저 첫번째 화면 조작 버튼인 전체 보기에 대한 코드입니다.
그리고 다음은 마우스로 사각영역을 지정해 지정한 영역을 확대해 주는 버튼에 대한 코드입니다.
그리고 다음은 역시 마우스로 사각영역을 지정하여 축소하는 버튼에 대한 코드입니다.
끝으로 지도를 마우스를 드래그 하여 이동하는 코드입니다.
이제 마지막으로 이 튜토리얼의 하일라이트인 Identify 버튼의 클릭 이벤트의 코드는 다음과 같습니다.
단지 마우스 조작을 XrNormalMode로 지정하고 있을 뿐이며 이렇게 지정된 마우스 조작 모드는 Xr 맵 엔진의 다음과 같은 LButtonUp 이벤트에서 처리해 주게 됩니다.
4번째 줄을 통해 Identify 버튼을 통해 지정된 마우스 모드(MouseMode)의 값(XrNormalMode)일 경우 마우스로 클릭된 지점의 도형에 대한 속성을 조회하는 코드가 실행됩니다. 6번째 줄의 코드인 GetFIDFromMousePoint는 지정된 이름에 해당하는 레이어에 대해 지정된 화면 좌표 상의 도형에 대한 FID 리스트를 반환하게 됩니다. GetFIDFromMousePoint의 마지막 4번째 인자를 통해 지정된 좌표에 존재하는 FID에 대해 첫번째 하나가 발견되면 바로 반환하도록 지시합니다. 8번째 코드를 통해 클릭된 마우스 지점에 대한 도형이 존재하는지를 파악하고 10번~23번 코드를 통해 해당되는 도형에 대한 속성값과 쿼리하여 메세지 창으로 표시합니다. 10번 코드를 통해 해당 레이어를 얻어오는 코드이며 11번 코드는 해당 레이어의 속성 테이블 객체를 얻어 오는 코드이고 12번 코드는 속성 테이블에 대한 필드 정보 객체를 얻어오는 코드이며 13번은 앞서 GetFIDFromMousePoint로부터 얻은 도형에 대한 FID를 값을 가져오는 코드입니다. 그리고 14번 코드는 FID에 해당하는 속성 레코드 객체를 가져오는 코드입니다. 그리고 16번 코드에서 21번 코드는 필드 이름과 필드에 대한 값을 얻어와 문자열로 구성하는 코드입니다. 아래의 결과는 실제 마우스를 통해 클릭한 지점의 도형에 대한 속성을 표시하는 결과 화면입니다.

이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/04/16 00:42
2010/04/16 00:42
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/582 |
|
|
|
|
|
|
|
Xr 맵엔진에 수치지도를 레이어로 추가하고 수치지도에 대한 속성값을 텍스트로 지도위에 표시하는 기능을 라벨 표시 또는 어노테이션 표시라고 합니다. DuraMap-Xr의 라벨 표시에 대한 API를 간단한 예를 통해 살펴 보도록 하겠습니다. 먼저 아래와 같이 버튼 3개와 Xr 컨트롤을 폼에 배치합니다.
총 3개의 버튼으로 구성되며 Add Layer는 ESRI의 shp 파일을 읽어 레이어를 추가합니다. 그리고 이 추가된 레이어에 대해 2개의 라벨을 추가하는 코드가 각각 'Add Label 1'과 'Add Label 2' 버튼에 해당합니다. Xr에서는 하나의 레이어에 대해 다수의 라벨을 표시할 수 있는 멀티 라벨링 기능을 제공합니다. 'Add Layer'의 코드는 아래와 같습니다.
실행을 하고 해당 버튼을 누르면 화면에 아무것도 표시되지 않습니다. DuraMap-Xr은 파일이나 지도서버로부터 데이터를 요청하면 데이터를 모두 받을때 OnLayerConnectionCompleted 이벤트가 발생하게 됩니다. 이 이벤트에 아래의 코드를 추가합니다.
즉, 지도 레이어가 완전하게 읽어진 후 지도를 화면에 꽉 채워 그리도록 합니다. ZoonFullExtent 호출 뒤에 바로 ZoomInFix를 호출하여 지도를 확대해 좀 더 화면에 꽉 차게 합니다. 이제 실행하고 해당 버튼을 클릭하면 아래처럼 지도가 표시됩니다.
이제 라벨을 추가하는 'Add Label 1' 버튼의 코드를 살펴보기 전에 이 shp 파일에 대한 속성 정보를 살펴보면 아래와 같습니다.
총 2개의 필드가 존재하며 'Add Label 1' 버튼에서는 SGG_NM 필드를 이용해 라벨을 표시하도록 하겠습니다. 'Add Label 1' 버튼에 대한 코드는 아래와 같습니다.
Xr 엔진의 Labels 프로퍼티 객체의 매서드인 AddLabel 매서드를 통해 라벨을 추가합니다. 인자는 2개로써 첫째는 대상 레이어의 이름이며 둘째는 라벨 문자값으로 표시할 필드명입니다. 지정할 필드명 양쪽으로 {와 }로 감싸야 합니다. 이는 DuraMap-Xr이 표현식을 통한 라벨 기능을 제공하기 때문입니다. 이렇게 추가된 라벨은 GetLabel을 통해 라벨 객체로써 얻을 수 있으며 이 객체를 통해 여러가지 속성을 제어할 수 있습니다. 실행해 보면 아래 그림과 같습니다.
이제 또 다른 라벨을 추가하는 'Add Label 2' 버튼에 대한 코드를 살펴보겠습니다. 이 코드는 앞서 설명한 'Add Label 1' 버튼의 코드와 유사합니다.
주의 깊이 살펴볼 만한 코드는 7번째 코드로 이는 라벨의 높이 만큼 위치를 이동시키라는 코드로 +1의 값은 아래 방향으로 높이 x 1 픽셀만큼 이동하라는 의미입니다. 이는 'Add Label 1' 버튼에서 추가한 라벨과 중복되어지는 것을 막기 위함입니다. 실행하여 버튼을 순서대로 눌러보면 아래 결과와 같습니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/04/09 20:10
2010/04/09 20:10
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/580 |
|
|
|
|
|
|
|
| Xr의 속성 중 레이어를 관리하는 객체인 Layers의 AddShapeMapLayer 매서를 통해 추가된 수치 지도 레이어의 색상 심벌 등을 지정하는 API에 대한 설명입니다.
먼저 개발환경에서 C#의 폼 어플리케이션 프로젝트를 생성하고 폼에 버튼들과 Xr 맵엔진을 올려 아래와 같이 화면을 디자인합니다.
상단에 4개의 버튼이 있는데, 왼쪽에서 오른쪽으로 순서대로 클릭하여 Xr 맵 컴포넌트에 그 반응을 살펴 보도록 하겠습니다. 첫번째 버튼인 Add Layers는 shp 파일로부터 레이어를 추가하는데 건물과 실폭도로에 대한 컨텐츠를 가지고 있습니다. 이 버튼의 클릭 이벤트는 아래와 같습니다.
레이어의 식별자로써 사용된 레이어의 이름인 '건물', '도로'를 통해 각 레이어 객체를 얻어와 그리기 정의 심벌을 변경함으로써 원하는 스타일의 지도를 그릴 수 있습니다. 먼저 건물 레이어의 심벌을 변경하는 버튼인 Symbol Building 버튼의 클릭 이벤트에 대한 코드는 아래와 같습니다.
ShapeMapLayer는 LineSymbol과 FillSymbol 그리고 PointSymbol 프로퍼티를 제공하며 이 프로퍼티를 통해 도형을 그리기 위한 심벌을 변경할 수 있습니다. 위의 코드는 도형의 선과 면에 대한 색상 심벌을 변경하고 있습니다.
다음은 '도로' 레이어에 대한 심벌을 변경하는 버튼인 Symbol Road에 대한 코드로써 건물 레이어의 심벌을 변경하는 것과 다르지 않습니다.
이제 끝으로 건물 레이어의 층수에 대한 값에 대한 속성을 이용하여 입체적으로 표현하기 위한 2.5D Building에 대한 버튼의 코드는 아래와 같습니다.
건물 레이어의 층수에 대한 값은 ABV_FL_CNT라는 이름의 필드에 해당하며 이 값은 층수이므로 미터 단위의 높이값으로 환산하기 위해 3.3이라는 가중치를 주는 코드입니다.
이렇게 총 4개의 버튼에 대한 코드를 통해 순서대로 버튼을 클릭하면 아래와 같은 결과가 Xr 지도에 표시됩니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/04/06 18:41
2010/04/06 18:41
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/578 |
|
|
|
|
|
|
|
DuraMap-Xr은 쉽게 ESRI의 SHP 파일을 생성할 수 있습니다. SHP 파일은 도형 정보와 속성 데이터가 별도의 파일로 분리된 파일 시스템으로 도형정보는 .shp 파일에 저장되고 속성정보는 .dbf 파일에 저장됩니다. 간단히 DuraMap-Xr에서 SHP 파일을 생성하는 예를 보이기 위해 아래와 같은 폴리곤 데이터를 만들어 보는 DuraMap-Xr의 API에 대해 살펴보겠습니다. 총 3개의 폴리곤으로 구성되어 있으며 속성에 대한 테이블의 필드 구조는 Name, Age, Height를 가집니다.
- Name은 문자열 타입
- Age는 정수 타입
- Height는 실수 타입
그림을 살펴보면 Name이 대길이는 도형은 가운데 구멍이 뚤린 Ring 형태입니다. 즉, 하나의 도형이 2개의 폴리곤으로 구성되는데 하나는 외각 폴리곤이고 두번째는 내부 폴리곤(Hole)입니다. 홍길동과 코난에 대한 도형은 하나의 폴리곤으로 구성되어 있구요.
DuraMap-Xr은 포인트, 폴리라인, 폴리곤 타입에 대한 SHP 파일을 생성할 수 있습니다. 여기서는 위의 그림에 해당하는 폴리곤 SHP 파일을 만들어 보겠습니다.
먼저 Visual Studio를 실행하고 윈도우즈 폼 응용프로그램에 해당하는 프로젝트를 시작합니다. 그리고 참조 추가를 통해 XrMapLib를 추가합니다. 제대로 되었다면 솔루션 탐색기의 참조에 다음 항목이 표시됩니다.
폼위에 버튼을 하나만을 올려 놓습니다. 이 버튼을 클릭하면 SHP 파일이 만들어 지게 됩니다. 지금부터는 클릭 이벤트에 대한 코드를 한줄 한줄 순서대로 소개하겠습니다. 만들고자하는 도형에 대한 그림과 비교하면서 잘 살펴보시기 바랍니다.
속성에 대한 필드를 정의하는 부분입니다. Name 필드를 위해 AddStringField 매서드를 호출했고 두번째 인자는 값의 최대 길이입니다. 그리고 Age 필드를 위해 AddIntegerField를 호출했고 두번째 필드는 정수값의 길이입니다. 즉 최대 9999까지의 값을 입력할 수 있습니다. 그리고 Height 필드를 위해 AddFloatField를 호출하는데 두번째 인자는 실수값의 길이이며 세번째 값은 소수부분에 대한 길이입니다. 지정한 값이 6과 2이므로 최대 999.99까지의 값을 지정할 수 있습니다.
위의 코드는 실제로 SHP 파일을 생성하는 코드로 Xr의 Tool 객체의 CreateEsriShpHandler를 이용하여 d:/ 폴더 위치에 polygon.shp 파일과 polygon.dbf 파일을 생성합니다. 두번째 인자는 생성하고자 하는 도형의 종류로써 여기서는 폴리곤(XrPolygon)을 지정했고 세번째 인자로 앞서 정의한 속성의 필드정의에 대한 객체를 넘깁니다. 성공적으로 파일이 생성되면 EsriShpFileHandler의 인스턴스가 반환되고 실패하면 null을 반환합니다. 실패한 이유로는 기존에 동일한 이름의 파일이 존재하거나 필드 정의가 잘못된 경우 등입니다. 다음의 코드는 성공적으로 파일을 생성했을때의 코드 부분입니다.
실제 좌표값과 속성값을 저장할 객체드를 생성합니다. CoordinateList는 다수의 포인트 좌표들로 구성되는 리스트이고 CoordListCollection은 다수의 CoordinateList를 포함하는 객체입니다. 여러개의 폴리곤으로 구성된 도형을 추가할때 CoordinateListCollection을 사용해야 하며 위의 예에서 "대길이"에 해당하는 도형을 위한 객체입니다.
홍길동에 해당하는 도형을 추가하는 코드입니다. 주의할점은 속성값의 지정순서는 필드의 정의 순서와 일치해야 합니다.
코난에 대한 도형을 추가하는 코드입니다. 앞의 홍길동에 대한 도형 추가 코드와 매우 유사합니다.
끝으로 대길이에 대한 폴리곤입니다. 이 도형은 2개의 폴리곤으로 구성되었다는 것을 앞서 그림을 통해 살펴보았습니다.
도형과 속성을 통해 원하는 도형들의 추가가 완료되었으면 가장 마지막으로 다음 코드를 호출하여 마무리합니다.
실제로 생성된 파일을 탐색기를 통해 살펴본 그림은 아래와 같습니다.
이 생성된 shp 파일을 DuraMap-Xr로 만든 BeautifyMap으로 살펴보면 아래와 같습니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/04/05 17:29
2010/04/05 17:29
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/577 |
|
|
|
|
|
|
|
DuraMap-Xr은 지도 데이터를 2가지의 큰 카테고리로 나눠 레이어 개념으로 관리합니다. 여기서 레이어(Layer)란 흔히 GIS에서 사용하는 용어와 동일한 의미를 가집니다.
- ShapeMapLayer : DXF, SHP 등과 같은 수치지도 지도 레이어
- GridMapLayer : 이미지, 라스터 등과 같은 그리드 지도 레이어
여기서는 ESRI에서 제시한 범용 수치지도 포맷인 SHP 파일을 추가하여 Xr 맵엔진에서 표시하는 API를 C#을 통해 설명합니다.
먼저 Visual Studio를 실행하여 C#의 Windows Forms 응용 프로그램 프로젝트를 생성 한 후에 폼에 XrMap 컨트롤과 지도뷰를 조작하기 위한 버튼을 다음 화면처럼 추가합니다.
이제 이 폼에 대한 Load 이벤트에서 Shp 파일을 통해 도형 지도 레이어를 추가하는 코드를 아래와 같이 작성합니다.
axXr1은 앞서 폼에 추가한 DuraMap-Xr 컨트롤의 이름입니다. AddShapeMapLayer는 2개의 인자를 받는데 첫번째는 레이어의 식별자로써 레이어의 이름이고 두번째는 공간데이터에 대한 연결 문자열로 파일경로로 적합한 연결문자열입니다. 이렇게 레이어를 추가한 뒤에 WaitForAllConnections을 호출하여 레이어를 추가하는데 필요한 공간데이터를 모두 읽을 때까지 대기합니다. 참고로 공간데이터를 읽는 코드는 스레드로 작동됩니다. WaitForAllConnections 매서드가 반환되면 모든 지도 레이어가 완벽하게 추가되었음을 보장하므로 지도를 화면에 꽉 차게 표시되도록 ZoomFullExtent를 호출합니다. 실행 결과는 아래와 같습니다.
이제 지도 뷰를 조작하기 위해 추가했던 전체 보기, 확대, 축소, 이동, 이전 보기, 보기 되돌리기 버튼에 대한 클릭 이벤트를 구성하는 코드를 살펴보겠습니다.
먼저 전체보기는 이미 앞서 설명드렸던 axXr1.ZoomFullExtent()가 해당되어 아래와 같습니다.
그리고 현재 보이는 지도를 확대하기 위한 확대 버튼의 코드는 다음과 같습니다.
그리고 축소 버튼의 코드는 다음과 같습니다.
그리고 지도를 이동하는 코드는 다음과 같습니다.
그리고 지도에 대한 뷰의 변화에 대한 Undo 기능에 대한 버튼인 이전 보기의 코드는 다음과 같습니다.
이전보기에 대한 반개 기능은 보기 되돌리기 버튼의 코드는 다음과 같습니다.
이상으로 SHP 파일을 표시하고 사용자가 마우스를 통해 표시된 지도를 조회해 보는 기능에 대해 간단히 살펴보았습니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/04/01 16:49
2010/04/01 16:49
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/576 |
|
|
|
|
|
|
|
| DuraMap-Xr은 COM을 지원하는 모든 개발환경에서 사용할 수 있으며 여기서는 가장 많이 사용되는 언어인 C#을 이용해 Xr을 이용해 보도록 하겠습니다. 먼저 Xr을 Visual Studio의 도구 상자에 등록하기 위해 도구상자 툴박스에서 마우스 오른쪽 버튼을 눌러 팝업창을 띠운후 항목선택(I)를 실행합니다.
그러면 다음과 같은 창이 나타나며 COM 구성요소 탭에서 XrMapControl Class을 선택해 줍니다. 정상적으로 XrMap.dll을 등록했다면 표시되지만 만약 정상적으로 등록했음에도 보이지 않는다면 찾아보기(B) 버튼을 실해앟여 XrMap.dll을 찾아줍니다.
도구 상자에 제대로 추가되면 아래와 같이 DuraMap-Xr 엔진의 아이콘이 표시됩니다.
기본적으로 다른 개발환경에서도 이와 비슷한 절차로 Xr 엔진을 등록하게 됩니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/04/01 16:28
2010/04/01 16:28
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/575 |
|
|
|
|
|
|
|
아래의 그림은 Xr 맵 솔루션의 구성 요소 중 지도 데이터 서비스와 지오프로세싱 및 편집 서비스를 담당하는 XrGeoService의 개략적인 구조입니다. 제공하는 지도 데이터는 미리 렌더링된 일정 크기의 타일 지도 이미지와 수치지도 데이터와 관련된 속성데이터입니다.
클라이언트의 요청(지도데이터 서비스, 편집 서비스, 지오프로세싱 서비스)을 원할하게 처리하기 위해 스레드를 적절하게 분배했으며 포퍼먼스를 극대화 하기 위해 자체적으로 HTTP를 사용하는 웹서버 기능을 내장하고 있습니다. Geodatabase를 통해 다양한 데이터소스에 접근할 수 있으며 대략적인 구조는 아래 그림과 같습니다.
추상화된 Access를 통해 파일, 다양한 상용 DBMS를 지원합니다. 추후 ArcSDE를 통한 지원할 예정이며 XrGeoService는 자바로 개발되어 ArcSDE를 손쉽게 지원할 수 있습니다.
DataUpdater를 통해 원격으로 공간 데이터를 편집할 수 있으며 편집 이력에 대한 시간대별 관리를 지원하여 워하는 시점으로 Rollback이 가능합니다.
XrGeoService의 장점은 공간데이터의 편집 서비스와 다양한 공간데이터베이스를 손쉽게 지원하는 것뿐만 아니라 공간 데이터를 이용한 공간분석 기능인 지오서비스(GeoService) 기능을 제공합니다. 아래의 그림은 GeoprocessingControl을 통해 제공되는 지오서비스에 대한 그림입니다.
원활하고 정확한 지오프로세싱을 위해 방대한 공간 데이터와 속성 데이터가 필요한데 이런 데이터군을 관리하는 서버에서 지오프로세싱을 처리하는 것이 옳바르며 결과만을 클라이언트에게 전송해주는 방식입니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/03/16 15:47
2010/03/16 15:47
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/571 |
|
|
|
|
|
|
|
Xr 맵엔진을 구성하는 핵심 패키지는 위의 다이어그램에서 보이는 것처럼 Data, View, Access, Edit가 있고, 이외에 공통 모듈인 Common과 외부 라이브러리 모듈 패키지인 Extern이 존재합니다. 예전에는 하나의 프로젝트에 모든 패키지를 묶었으나 종속성을 최대한 줄이기 위하여 이번 Xr 맵엔진 개발에서는 각 패키지를 별도의 프로젝트로 분리시켰습니다.
각 모듈에 대해 간단하게 설명을 하면... Access는 파일이나 서비스로부터 데이터를 가져오고 보내는 일을 담당하며 이렇게 주고 받은 데이터를 Data 모듈에서 제공하는 데이터 타입의 인스턴스를 생성합니다. View는 Data를 화면상에 그리는 역활을 하는 모듈이며 Edit는 Data를 편집하고, 편집하기 위해 화면상에 사용자의 입력을 반영하기 위해 View 모듈을 사용하고 이렇게 편집된 데이터를 파일이나 서버에 반영하기 위해 Access 모듈을 사용합니다.
끝으로 위의 그림은 앞서 글로만 잠시 설명했던 두개의 패키지 모듈입니다. Extern은 서드파티 개발자로부터 제공받은 외부 라이브러리로써, 예를 들어 ziplib나 shapelib 등이 있습니다. 그리고 Common은 공통적인 데이터 타입이나 메시지 상수, 매크로 정의, 유틸리티 핼퍼 함수 클래스들의 모음입니다. 이 Extern과 Common은 필요할 경우 전역적으로 참조되는 모듈입니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/03/09 11:41
2010/03/09 11:41
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/569 |
|
|
|
|
|
|
|
파일 크기가 작다고해서 효율성이 뛰어나다는 것은 아닙니다. 지오서비스의 Xr 맵엔진이 사용하는 수치지도 포맷인 XrV와 속성데이터 포맷인 XrT는 네트워크 서비스에 최적화하기 위해 파일 크기를 최소화하였습니다. 물론 압축은 하지 않습니다. 압축에 대한 트레이드오프가 발생하는데.. 압축을 하면 크기가 줄어 네트워크 전송에 대한 속도를 단축할 수 있지만 압축을 하고 압축을 푸는 시간을 고려하면 이러한 시간 단축에 대한 이점이 상쇄되는지라 압축에 대한 선택은 파일 포맷에서 결정하지 않고 이 파일을 사용하는 클라이언트 어플리케이션의 책임으로 넘겼습니다. ESRI가 처음부터 SHP와 DBF는 네트워크 통신을 통한 서비스 기반으로 설계되지 않았으므로 이러한 크기 최적화가 거의 되어 있지 않습니다.
위의 그래프는 150MB의 DBF 파일과 100MB의 SHP 파일을 지오서비스의 지도 파일(XrV, XrT)로 변환하여 크기를 서로 비교한 것입니다. 벡터 데이터의 경우 절반정도로 줄었고 속성 데이터의 경우 1/5로 상당히 줄었음을 알 수 있습니다.
Xr 맵엔진의 서버를 개발하기에 앞서 서버의 퍼포먼스를 최대화 하기 위해 기반이 되는 데이터를 최적화하는 작업을 하면서 SHP와 DBF 간의 파일 크기면에서 살펴보았습니다.
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*
|
김형준(Dip2K)
2010/02/28 16:47
2010/02/28 16:47
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/558 |
|
|
|
|
«
2010/07
»
| 일 |
월 |
화 |
수 |
목 |
금 |
토 |
| |
|
|
|
1 |
2 |
3 |
| 4 |
5 |
6 |
7 |
8 |
9 |
10 |
| 11 |
12 |
13 |
14 |
15 |
16 |
17 |
| 18 |
19 |
20 |
21 |
22 |
23 |
24 |
| 25 |
26 |
27 |
28 |
29 |
30 |
31 |
|
Total : 659265
Today : 81
Yesterday : 451 |
|
|
|