지도 엔진의 라벨 회전 기능

오늘 또 김연아의 무결점 환상 연기.. 단 한차례의 NG도 없는.. 역대 최고의 점수를 획득했습니다. 정말 자랑스럽습니다..!

GIS 데이터를 그래픽 요소와 문자 요소를 기준으로 살펴보면 도형 데이터와 속성 데이터로 구분됩니다. 이때 도형에 대한 속성을 화면상에 표시하는 것을 라벨(Label) 또는 주기(Annotation)이라고 하는데.. 이 라벨을 표현하는 방법 또한 다양합니다. 단순히 속성 값을 표시하는 것에서 부터.. 다수의 속성을 표현식으로 조합하여 표현하는 방식과 멀티 라인 속성 방식.. 그리고 폴리라인을 따라 회전하는 표현 방식이 있습니다.

사용자 삽입 이미지
위의 이미지는 Xr 맵엔진에서 각 도형에 해당되는 속성을 도형에 따라 회전하며 라벨 텍스트를 표현하는 방식입니다. 이런 표현 방식은 위의 이미지처럼 도로명을 표현할때 매우 효과적인 방식입니다. Xr 맵 엔진은 지도 타일 이미지를 전문적으로 렌더링하기 위한 1차 목표를 추구하기 위한 맵 엔진입니다. 최근 RIA를 기반으로 한 지도 엔진 개발을 최종 목표로 하고 있는 프로젝트에서 Xr 맵 엔진은 첫 관문으로써 매우 중요한 의미를 가지고 있습니다.

[GIS] ArcObjects, 도형의 좌표 구하기

ArcObjects를 통해 SHP 파일을 읽어서 만든 레이어를 화면상에 표시한 후… 이 레이어를 구성하는 도형(Shape) 좌표를 구하는 방법을 정리해 보았습니다. ArcObjects에서 제공하는 Map 컨트롤을 통해 SHP 레이어가 하나 추가되었다고 가정하겠습니다. 참고로 이 포스트는 레이어가 폴리곤 도형으로 구성된 레이어를 대상으로 합니다.

가장 먼저 해야할 일은 지도 컨트롤이 가지고 있는 레이어를 가져오는 일입니다. 가져올때 도형 정보에 접근해야 하므로 IFeatureLayer 인터페이스 타입으로 가져와야 합니다.

ESRI.ArcGIS.Carto.IFeatureLayer pFL;
pFL = axMapControl1.get_Layer(0) as ESRI.ArcGIS.Carto.IFeatureLayer;

이렇게 가져온 IFeatureLayer 변수인 pFL을 통해 각각의 Feature를 얻어오기 위해 IFeatureClass와 IFeatureCursor를 이용합니다.

ESRI.ArcGIS.Geodatabase.IFeatureClass pFClass;
pFClass = pFL.FeatureClass;

ESRI.ArcGIS.Geodatabase.IFeatureCursor pFCursor;
pFCursor = pFClass.Search(null, false);

이제 레이어를 구성하는 Feature를 읽을 수 있는 준비가 되었습니다. 아래의 반복문을 통해 각각의 Feature를 순회하면서 원하는 좌표를 읽게 됩니다.

ESRI.ArcGIS.Geodatabase.IFeature pFeature;            
while((pFeature=pFCursor.NextFeature()) != null) {
    ....
}

아래의 코드가 위의 코드의 반복문 사이(while문)에 들어가는 코드입니다. 도형은 Point의 집합이므로 IPointCollection 인터페이스 타입이 필요하며 각 포인트 좌표값과 관련 정보를 얻기 위해 IEnumVertex 인터페이스가 필요합니다.

    ESRI.ArcGIS.Geometry.IPointCollection pPC;
    pPC = pFeature.Shape as ESRI.ArcGIS.Geometry.IPointCollection;

    ESRI.ArcGIS.Geometry.IEnumVertex pEV = pPC.EnumVertices;

    ESRI.ArcGIS.Geometry.IPoint pPt;
    int outPartIndex;
    int vertexIndex;
    listBox1.Items.Add("FID: " + pFeature.OID);
    for(int i=0; i<pPC.PointCount; ++i) {
        pEV.Next(out pPt, out outPartIndex, out vertexIndex);
        listBox1.Items.Add("    Part Idx :" + outPartIndex + 
            " Vertex Idx : " + vertexIndex + " (" + pPt.X + "," + pPt.Y + ")");
    }

비록 이 포스트의 글은 폴리곤 레이어에 대한 내용이지만 이 보다 간단한 포인트나 폴리라인에 대해서도 쉽게 좌표를 읽을 수 있습니다. 마지막으로 아래는 위의 코드들을 실행했을때의 결과 입니다.

사용자 삽입 이미지