[GIS] Sutherland-Hodgman Polygon Clipping 알고리즘

하나의 매우 큰 폴리곤의 일부를 화면상에서 확대할 경우에 렌더링 속도가 매우 느려질 수 있습니다. 예를 들어 한반도 전역을 아우르는 큰 하천 수계를 하나의 폴리곤으로 구성되어 있을 경우에.. 이 폴리곤을 화면상에 모두 그려지도록 할 경우 렌더링 속도에는 큰 문제가 없으나 이를 점차적으로 확대해 갈수록 그리기 속도는 점점 더… 그리고 훨씬 느려지게 됩니다.

이런 현상을 막기 위한 가장 좋은 방법은 화면 밖으로 벗어나는 대부분의 폴리곤 영역을 날려 버리는 것입니다. 바로 이때 적용할 수 있는 효율적인 알고리즘이 Sutherland-Hodgman Polygon Clipping 알고리즘입니다.

아래의 그림을 살펴보면 사각형 영역의 폴리곤과 잘려나갈 폴리곤이 존재합니다. 사각형 영역의 폴리곤은 모니터 영역이라고 생각하면 이 알고리즘을 실제 지도 엔진단에 적용할 때 이해가 쉽겠습니다.

사용자 삽입 이미지
위의 상황에서 Sutherland-Hodgman Polygon Clipping을 적용한 결과는 아래와 같습니다.

사용자 삽입 이미지
여기서 주의할 점은.. 이 알고리즘은 단지 폴리곤 렌더링에 적용할만하다 라는 점입니다. 이외의 부분에 대해서는 다른 알고리즘을 적용하기 바랍니다. 그 이유를 간단히 살펴보면 하나의 폴리곤을 화면 사각형에 대해 클리핑할때 다수의 폴리곤으로 분할되는 경우가 많은데 Sutherland-Hodgman Polygon Clipping 알고리즘은 다수의 폴리곤으로 분할하지 못하고 그 결과 역시 오직 하나의 폴리곤으로 클리핑하게 됩니다. 하지만… 그리기 위한 기능에서만큼은 그 어떠한 클리핑 알고리즘보다 빠른 퍼포먼스를 제공하므로 실제 적용할만한 알고리즘입니다.

이 알고리즘에 대한 소스 코드를 클래스화하여 제공합니다. 간단히 아래처럼 적용하면 원하는 결과를 얻을 수 있으리라 생각됩니다. 사용하는 좌표는 화면 좌표계입니다.

PolygonSHClipping clip;

// 폴리곤 구성(시작점과 끝점은 같아야 함)
clip.AddPoint(100, 100);
clip.AddPoint(200, 100);
clip.AddPoint(200, 200);
clip.AddPoint(100, 200);
clip.AddPoint(100, 100);

// 클리핑 사각영역 지정
clip.SetClippingWindow(0, 0, 150, 150);

// 클리핑
clip.Clip();

// 이후 클리핑된 영역을 그리기 위해서 다음 코드를 호출할 수 있다.
clip.DrawOutput(hdc);

이 소스 코드의 활용과 위의 이미지에 대한 대한 데모에 대한 전체 코드는 아래를 통해 다운로드 받을 수 있습니다. 마우스 왼쪽 버튼으로 폴리곤을 구성하고 오른쪽 버튼을 누르면 클리핑된 폴리곤이 화면상에 표시됩니다.

[GIS] Xr로 만든 지도 이미지 세번째..

요즘 일하다가 머리도 식힐겸해서 Xr을 기반으로 해 만든 지도 이미지 저작툴로 이미지를 만들어 봅니다. 하나는 어제 만들어 본거고…. 또 하나는 오늘 만들어 본 이미지입니다. 살짝 살펴보시면 좋겠습니다.

첫번째 이미지는 총 3개의 shp 파일을 이용해 만든 지도 이미지입니다. 데이터는 가공하지 않은… 그대로 사용했습니다. 건물, 실폭도로, 도로중심선 shp 파일을 이용하였습니다.

사용자 삽입 이미지
사용자 삽입 이미지
그리고 위의 이미지는 단 하나의 shp 파일을 이용해 만든 이미지로 서울시 행정구 shp 입니다. Xr 맵엔진은 라벨에 다수의 필드명을 지정해 표현식을 지정할 수 있도록 되어 있습니다. 이런 기능을 이용해 단 하나의 shp 파일을 이용해서도 행정구역 이름에 대해 한글명과 영문명을 함께 표현할 수 있습니다.

[GIS] Xr로 만든 간단한 지도 이미지..

서울시의 구에 대한 shp 파일 하나만을 가지고 Xr 맵엔진에서 표출해 본 지도 이미지 입니다. 디자이너를 위한 지도 데코레이션 툴을 만들고 있는 중에… 머리도 복잡하여 한번 테스트 겸 간단히 만들어 보았는데.. 아직은 많은 부분에서 밋밋한 분위기입니다만.. 좀더 다양한 레이어와 POI 그리고 아이콘 등으로 장식을 하면 보다 이쁜 지도 이미지가 나오지 않을까 기대를 해봅니다.
사용자 삽입 이미지
지금 개발하고 있는 디자이너를 위한 툴은 Xr 맵엔진을 기반으로 해 만든 툴로써 추후 지도 타일 이미지를 만들기 위한 툴입니다. 추후 개발할 RIA 기술을 적용한 엔진에서 사용할 지도 이미지를 만들기 위한 목적으로 개발되고 있습니다.

참고로 이툴에 사용되는 Xr  클라이언트 맵엔진은 오픈소스를 목적으로 개발하고 있습니다. 추후 어느 정도 안정화되고 가닦이 잡히면 소스를 공개할 예정입니다. 소스를 공개하는 이유는 향후 보다 많은 분들의 의견 수렴을 받기 위함입니다. 기능적인 부분에서 뿐만이라 지도 이미지의 비주얼적인 모습에 대한 조언을 듣고 적당하다면 적극적으로 수렴할 계획입니다.

그리고 아래는 도로 중심선(Polyline) 데이터에 대한 하나의 shp 파일을 이용해 만들어본 지도 이미지입니다.

사용자 삽입 이미지
참고로 아래는 예전에 올렸던, Xr 맵 엔진을 이용해 만든 지도 이미지입니다. 이 글과 연관이 깊어 다시 한번 함께 올려봅니다.
사용자 삽입 이미지

지도 엔진의 라벨 회전 기능

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

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

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