DuraMap-Xr 소개 및 다운로드

듀라맵은 3.5MB 크기의 단 하나의 dll 파일로 구성되어 있는 매우 작은 크기의 경량 지도 엔진입니다. 꼭 필요한 기능만을 담아 최적화 되어 있으며 빠른 퍼포먼스를 제공합니다. 듀라맵은 GIS 맵엔진으로써 작지만 매운 꼬추라고 할 수 있겠습니다. 프로그래밍이 가능한 분이라면 DuraMap-Xr을 이용하여 GIS 시스템 개발은 물론 공간 데이터를 다양하게 생성하고 가공할 수 있으며 공간분석 알고리즘을 실제로 구현할 수 있는 API를 제공합니다.

DuraMap-Xr은 COM을 지원하는 프로그래밍 언어에서 사용할 수 있는 컴포넌트이며 VB, Delphi, C#, C++을 이용하여 C/S 기반의 어플리케이션을 개발할 수 있으며 HTML과 자바스크립트를 이용하여 웹브라우저에서 운영되는 웹 GIS 시스템을 쉽게 개발할 수 있습니다(하지만 저희는 ActiveX인 듀라맵을 이용하여 웹기반의 시스템 개발을 권장하지 않습니다). DuraMap-Xr은 기본적으로 다음과 같은 큰 범주의 기능을 제공합니다. (자세한 내용에 대해서 각 항목 클릭 가능)

위의 기능은 DuraMap-Xr 맵 엔진을 통해 로컬에 저장된 공간 데이터를 대상으로 수행되는 기능이며 동시에 원격으로 분리된 서버로부터 제공되는 공간 데이터에 대해서도 동일하게 지원됩니다. 공간 데이터 서비스는 GeoService-Xr 공간서버로부터 제공됩니다.

듀라맵에서 항공영상 또는 위성영상(geotiff)을 자체포맷 형태로 표시하고 싶을 경우 변환툴은 다음 url을 통해 다운받으실 수 있습니다.

듀라맵(DuraMap-Xr)과 블랙포인트(BlackPoint-Xr)의 항공영상(위성영상) 자체 포맷 변환툴

DuraMap-Xr은 단일 파일(DuraMap-Xr.dll)로 구성됩니다. 기능을 확장할 수 있는 플러그인 기능 개발을 위한 COM 객체도 이 파일 안에 포함합니다. DuraMap-Xr을 설치하기 위해서는 아래의 URL에서 설치 프로그램을 통해 쉽게 하실 수 있습니다.

DuraMap-Xr 설치자 프로그램   

설치자 프로그램을 사용하지 않고 직접 DuraMap-Xr.dll을 등록하고 설치하기 위해서는 다음과 같은 절차로 할 수 있습니다.

(등록방법 동영상)   

  1. DuraMap-Xr.dll을 다운로드(지오서비스 자료실)받습니다. 
  2. DuraMap-Xr.dll을 원하는 폴더에 저장합니다.
  3. 명령 프롬프트 창을 실행합니다. (비스타 또는 윈7에서는 관리자 권한으로 실행)
  4. 명령 프롬프트 창에서 DuraMap-Xr.dll이 저장된 폴더로 이동합니다.
  5. regsvr32 DuraMap-Xr.dll을 입력하여 등록합니다.

아래의 그림은 명령 프롬프트 창에서 XrMap.dll을 등록하는 화면입니다. (D:\ 드라이브의 DuraMap 폴더에 DuraMap-Xr.dll 복사된 경우의 예)

사용자 삽입 이미지

성공적으로 등록이 되면 다음과 같은 메세지가 표시됩니다.

사용자 삽입 이미지

등록이 완료되면 C# 또는 C++, 델파이, VB나 IE에서 자바 스크립트를 이용하여 DuraMap-Xr을 사용할 수 있습니다. 끝으로 DuraMap-Xr의 API에 대한 튜토리얼은 다음 URL과 같습니다.

DuraMap-Xr 글 검색

또한 DuraMap-Xr에 대한 질문과 개선점에 대한 건의는 hjkim@geoservice.co.kr로 메일 주시기기 바랍니다.

[GIS] DuraMap, 듀라맵 3.1.0.1 버전업

듀라맵이 3.1.0.1로 버전업 되었습니다. 추가된 기능 2가지와 해결된 오류입니다. 먼저 해결된 오류는 윈도우즈 XP에서 편집시 잦은 다운현상을 해결하였습니다. 이 문제에 대한 이유는 XP와 비스타(Windows 7 포함)에서 동기화 객체인 CriticalSection의 작동에 차이가 발생하는 것에 원인이 있었습니다. 그리고 추가된 기능 2가지는 다음과 같습니다. 첫번째로 사용자가 정의한 도형을 포인트 심벌로 사용할 수 있게 되었습니다. 그리고 두번째는 폴리곤의 라벨 표시에서 항상 폴리곤 위에 표시되도록 개선함으로써 라벨의 가시성을 향상시켰습니다.

먼저 사용자 정의 도형을 포인트 심벌로 지정하는 기능은 추후 CAD 데이터를 완벽하게 지원하기 위한 기능으로 CAD에서는 포인트에 대해 Block Symbol 기능과 유사합니다. 이 기능은 추후 CAD 데이터(DXF 파일)을 지원하는 기능을 추가할때 이 기능이 유용하게 사용될 예정입니다.

사용자 삽입 이미지
그리고 라벨 표시에서 항상 폴리곤 위에 표시되도록 개선한 기능은.. 기존에 폴리곤의 라벨은 항상 도형의 무게중심점(Centroid)를 기준으로 라벨을 표시하도록 하였으나 가끔 폴리곤 밖으로 라벨이 표시되는 현상이 발생하여 항상 도형 안에 라벨이 표시되도록 한 기능입니다. 위의 이미지에서 첫번째는 일반적인 도형의 무게중심점 위치에 라벨을 표시하도록 한 이미지이고 두번째가 이번에 새롭게 개선된 라벨 표시에 대한 이미지입니다.

추가된 새로운 기능에 대한 API 사용방법에 대해서는 추후 별도의 글을 통해 소개드리도록 하겠습니다.

[GIS] DuraMap-Xr, 자체포맷 항공영상(XrR) 추가하기

듀라맵은 대용량의 항공영상을 자체포맷으로 변환하여, 변환된 자체포맷을 최소한의 메모리를 사용하고 빠른 속도로 표출할 수 있습니다. 변환된 자체포맷은 XrR이라는 확장자를 갖습니다. 이 글은 XrR 파일을 레이어로 추가하는 방법에 대한 예제입니다. 먼저 다음과 같은 폼을 디자인합니다.

사용자 삽입 이미지

폼에는 듀라맵 컴포넌트와 Add XrR Layer라는 버튼이 있으며 OpenFileDialog 컴포넌트가 있습니다. 이 글에서 작성되는 코드는 모두 Add XrR Layer 버튼의 클릭 이벤트가 전부이며 아래와 같습니다.

openFileDialog.Filter = "XrR Files(*.XrR Files)|*.xrr";
DialogResult DR = openFileDialog.ShowDialog();
if (DR == DialogResult.OK)
{
    String FileName = openFileDialog.FileName;
    String LayerName = FileName;

    axXr1.Layers.AddTileMapLayer(LayerName, FileName);
    axXr1.WaitForAllConnections();

    axXr1.ZoomFullExtent();
}

XrR 파일을 레이어로 추가하기 위한 매서드는 AddTileMapLayers 입니다.  아래는 XrR 레이어를 하나 추가한 결과 화면입니다.

사용자 삽입 이미지

[GIS] DuraMap-Xr, 선택된 도형 하이라이팅 시키기

2011년 새해.. 첫번째 1월입니다! 뭔가 새로운 마음 가짐으로.. 일에 전념하려는 의지와는 다르게 여러가지로 집중하지 못했던 시간이 새해까지 계속 이어져왔는데요. 이런 문제를 극복하기 위한 방법을 여러가지로 고민하다가.. 문득 다음과 같은 아이디어가 떠올랐답니다.

“Be Activated For Yourself”

이 아이디어의 약빨이 조금 먹히는 거 같습니다. 다행이도 말입니다. 해서….. 오랜만에 듀라맵에 대해 그간 질문으로 올라왔던 내용 중에 하나에 대해서 예제를 만들어 글로 올려봅니다.

그 질문이란게 뭔고 하니… SHP 파일로 추가된 지도를 구성하고 있는 도형 중에 하나를 마우스로 클릭했을때 클릭된 도형의 ID 값을 얻어오는 것은 알겠는데.. 방금 선택된 도형을 다른 색상으로 그려 하이라이팅 하고 싶다라나 어쩐데나… 라는 질문입니다. 제 답변은 언제나.. “그래픽 레이어를 이용하세요.” 였습니다. 네, 다른 방법이 더 몇가지 있겠지만.. 바로 이 방법에 대해서 실제로 구현해 보도록 하겠습니다. 먼저 다음과 같이 폼을 디~~~ 자인합니다!

사용자 삽입 이미지
듀라맵과 버튼 그리고 텍스트박스 컨트롤이 조신하게… 자리를 잡고 있습니다. 먼저 Add Layer 버튼은 다음과 같이 코딩합니다.

xr.Layers.AddShapeMapLayer("shp", "D:/__Data__/seoul.shp");
xr.Layers.AddGraphicLayer("gl", "");
xr.WaitForAllConnections();

xr.ZoomFullExtent();
          
xr.MouseMode = XrMapLib.XrMapViewModeEnum.XrNormalMode;

네, shp 파일을 통한 레이어와 그래픽 레이어를 추가하는 코드로 구성되어져 있습니다. 실행하고 버튼을 누르면 짜잔~ 하게 지도가 나타나겠지요. 이제 나타난 지도를 구성하는 도형을 마우스로 눌렀을때 어떤 도형이 눌러졌는지.. ID를 텍스트박스 컨트롤에 표시하고 듀라맵에는 선택된 도형을 다른 심벌로 표시하도록 하겠습니다. 듀라맵의 마우스 업! 이벤트에 대한 코드를 다음과 같이 쭈욱~~ 코딩해 봅니다.

private void xr_OnLButtonUp(object sender, 
    AxXrMapLib._IXrMapControlEvents_OnLButtonUpEvent e)
{
    // 레이어가 존재한다면..
    XrMapLib.ShapeMapLayer lyr = xr.Layers.GetLayerAsShapeMap("shp");
    if(lyr != null)
    {
        // 마우스로 클릭된 (x,y)좌표에 존재하는 shp 레이어의 도형 ID를 구함
        XrMapLib.ValueList FIDs = xr.GetFIDFromMousePoint("shp", e.x, e.y, true);
        // 선택된 도형이 있다면...
        if (FIDs.Count != 0)
        {
            int FID = FIDs.GetValueAsInteger(0);
            // 선택된 도형을 텍스트박스에 표시
            txtFID.Text = FID.ToString();

            // 선택된 도형의 좌표를 얻기 위해 ShapeRow를 구함
            XrMapLib.ShapeRow row = lyr.ShapeTable.GetRow(FID);

            // 그래픽 레이어에 추가할 폴리곤 그래픽 요소를 생성
            XrMapLib.PolygonGraphicElement polygon 
                = new XrMapLib.PolygonGraphicElement();
            XrMapLib.CoordinateListCollection clc 
                = new XrMapLib.CoordinateListCollection();
            
            // 폴리곤 그래픽 요소의 정점을 구성
            int cntParts = row.PartCount;
            for (int iPart = 0; iPart < cntParts; ++iPart)
            {
                XrMapLib.CoordinateList cl = new XrMapLib.CoordinateList();
                int cntVertex = row.GetVertexCountFromPart(iPart);
                for (int iVertex = 0; iVertex < cntVertex; ++iVertex)
                {
                    XrMapLib.Coordinate coord 
                        = row.GetVertexFromPart(iPart, iVertex);
                    cl.Add(coord.X, coord.Y);
                }
                
                clc.Add(cl);
            }

            polygon.SetPolygonList(clc);
 
            // 폴리곤 그래픽 요소의 그리기 심벌을 지정
            polygon.LineSymbol.Width = 3;
            polygon.LineSymbol.Color = RGB(255, 128, 0);
            polygon.FillSymbol.Color = RGB(255, 128, 0);
            polygon.FillSymbol.Alpha = 100;
            
            XrMapLib.GraphicLayer gl = xr.Layers.GetLayerAsGraphic("gl");
            // 예전에 추가한 그래픽 요소는 모두 제거하고 새로운 그래픽 요소를 추가
            gl.RemoveAllElements();
            gl.AddElement(0, polygon as XrMapLib.GraphicElement);

            // 다시 그림!
            xr.Update();
            return;
        }
    }

    txtFID.Text = "NA";
}

먼저 텍스트 박스 컨트롤의 이름은 txtFID입니다. 이 코드의 핵심은 선택된 도형의 ID를 통해 도형의 좌표를 얻어오고.. 이 좌표를 이용해 그래픽 레이어의 요소를 생성해서 그래픽 레이어에 추가한다는 내용입니다. 쉽죠? 물론 여기서는 폴리곤 도형만을 대상으로 하고 있습니다. 포인트, 폴리라인에 대해서는 알아서.. 잘~ 응용을 해보시기 바랍니다! 실행 결과를 하나 살펴보면 아래와 같습니다.

사용자 삽입 이미지

[GIS] DuraMap-Xr, 그림 아이콘을 지도 위에 표시하기

포인트 SHP 파일을 듀라맵에서 표현할때 그리기 심벌로 이미지를 적용하고자 할때가 있습니다. 듀라맵에서 포인트 심벌로 제공하는 이미지 파일의 종류는 bmp, jpg, 투명 배경을 지원하는 gif, 알파값을 지원하는 png입니다.

다음 코드는 포인트 타입의 SHP 파일을 레이어로 추가하고 심벌로 png 파일을 지정하는 코드 예입니다.

axXr1.Layers.AddShapeMapLayer("lyr", "D:/__Data__/주기.shp");
axXr1.WaitForAllConnections();

if (axXr1.Resources.AddImageResource("img", "d:/__data__/redmark.png"))
{
    axXr1.Layers.GetLayerAsShapeMap("lyr").
        PointSymbol.SetImage("img", axXr1.Resources);
}

axXr1.Update();

1번 코드는 주기.shp 파일을 lyr이라는 이름의 레이어로써 추가하는 것이고, 2번 코드는 추가할 레이어의 준비가 완료될때까지 기다리는 코드이며.. 4번 코드에서 readmark.png를 심벌로 사용하기 위해서 img라는 id로 리소스로 추가해 주는 코드입니다. 그리고 6번 코드가 바로.. 가장 핵심적인 코드로 포인트 심벌을 지정해 주는 코드입니다.

사용자 삽입 이미지

위의 그림은 위에서 제시한 코드에 대한 실행 결과로.. 코드는 “SHP Layer” 버튼의 클릭 이벤트에 존재합니다.

경우에 따라서는 SHP 파일처럼 이미 준비된 포인트 데이터가 아닌.. 그때 그때마다 위치가 가변적인 곳에 이미지 심벌을 표시해야하는 경우도 있습니다. 이때는 그래픽 레이어를 사용하며.. 이때의 경우 다음의 예제 코드를 응용하여 기능을 개발할 수 있습니다.

axXr1.Layers.AddGraphicLayer("gl", "");
axXr1.WaitForAllConnections();

IPointGraphicElement gr = new PointGraphicElement();
CoordinateList cl = new CoordinateList();
cl.Add(350, 20);

gr.SetPointList(cl);

axXr1.Resources.AddImageResource("img", "d:/a.png");
gr.PointSymbol.SetImage("img", axXr1.Resources);

axXr1.Layers.GetLayerAsGraphic("gl").AddElement(0, gr as GraphicElement);

axXr1.Update();

그래픽 레이어는 레이어를 구성하는 요소마다 심벌을 지정할 수 있습니다. SHP 파일을 통해서 이미지 심벌을 지정하는 코드처럼 먼저 Resouces의 AddImageResource 매서드를 통해 이미지 리소스를 먼저 추가하고 심벌을 지정해 주면 됩니다. 이미 짐작할 수 있겠지만.. 이미지 리소스는 한번만 추가해주고 재활용할 수 있습니다.