이번에 개발중인 맵 엔진이 적용된 프로젝트에 사용될 지도 모양입니다. 개발자가 아닌 디자이너 분이 지도 색상과 도형 심벌 및 레이어 구성을 했습니다. XGE 지도 엔진으로 만든 XGEyes라는 툴을 이용해 작업을 했고, 모두 개발중인 맵 엔진이 실시간으로 만들어낸 지도 이미지입니다. 한번 살펴보시길 바랍니다.






공간정보시스템 / 3차원 시각화 / 딥러닝 기반 기술 연구소 @지오서비스(GEOSERVICE)
이번에 개발중인 맵 엔진이 적용된 프로젝트에 사용될 지도 모양입니다. 개발자가 아닌 디자이너 분이 지도 색상과 도형 심벌 및 레이어 구성을 했습니다. XGE 지도 엔진으로 만든 XGEyes라는 툴을 이용해 작업을 했고, 모두 개발중인 맵 엔진이 실시간으로 만들어낸 지도 이미지입니다. 한번 살펴보시길 바랍니다.





간혹, 사실은 거의 대부분.. 가지고 있는 Shape 파일의 속성 정보인 DBF 파일이 내용에 비해 그 용량이 매우 크게 느껴질때가 있습니다. 하나의 예로 아래는 제가 가지고 있는 62MB 크기의 DBF 파일의 덤프 내용입니다. 가장 윗부분에 필드 이름이 정의되어져 있고, 그 아래로 쭈욱~ 값들이 기록되어져 있는데.. 실제 내용보다는 빈문자열이 훨씬 많습니다. 이렇게 된 이유는, 특히 문자열 필드의 경우 길이를 기본적으로 255자로 정의하고 DBF를 생성했기 때문입니다.

아래는 이런 불성실한 ^^; DBF 파일의 용량을 줄여주는 툴입니다. 필드값을 저장할 수 있는 필드의 최대 길이를 자동으로 계산해 줌으로써 사용자가 따로 계산할 필요가 없습니다. 또한 저장할 필드를 따로 선택해 저장시킬 수 있습니다.

위의 툴을 이용해 생성된 DBF 파일의 덤프 내용은 아래와 같습니다. 용량이 62MB에서 3.45MB로 꽤나 많이 줄었습니다.

이 툴을 만들게 된 목적은 개발중인 맵 엔진(XGE)에 데이터를 제공하는 웹방식의 데이터서버가 관리하고 있는 속성 데이터를 최적화시킬 목적으로 만들게 되었습니다. XGE 지도 엔진을 만들기 위한 Core 라이브러리를 이용해 제작했습니다.
DXF를 ESRI의 SHP 파일로 변환해주는 툴입니다. 수치지도 DXF 파일과 내보낼 레이어를 선택하고, 변환될 Shape의 종류를 선택해주면 Shape 파일로 생성해 주는 간단한 툴입니다. 개발중인 맵 엔진에 DXF 수치지도를 표시하는 기능에 대비해, 회사에서 DXF를 Shape 파일로 변환해야할 일이 생겨서 겸사 겸사 만들어 보았습니다. Shape의 속성은 Layer 명 하나만 만들어 집니다.

사용하기 전에 알면 좋은 점이.. DXF 수치지도를 Point나 Polyline, Polygon으로 내보기기 할때 DXF에서 이용할 Enitity입니다.
아래는 화면은 이 툴을 이용해 실제 수치지도를 등고선 레이어 7XXX 대를 폴리라인으로 내보내기 해서 ArcMap으로 살펴본 화면입니다.

이 툴은 XGE 지도 엔진을 이용하지 않고, XGE 지도 엔진을 구현하기 위한 Core 라이브러리를 이용해 개발하였습니다. C++로 개발된지라 .NET 2.0 역시 필요치 않습니다.
폴리곤에 높이를 줘서 입체적으로 표현하는 방법을 소개합니다. 일단 주어진 폴리곤 데이터는 아래와 같다고 가정을 합니다. 실제 적용된 결과는 높이값을 가진 폴리곤 데이터의 입체화 를 살펴보시길 바랍니다.
이 폴리곤에 일정한 높이값을 주어 아래처럼 표현하는 예를 통해 설명하겠습니다.
높이값을 주어 위의 그림처럼 표현하기 위해 옆면과 윗면을 높이값을 이용해 그려준 것 뿐입니다. 매우 간단하지요.. 끝?
하지만 이렇게 매우 단순하지 않습니다. 처음 폴리곤은 4각형이므로 옆면이 모두 4개인데, 이 4개의 옆면을 우리가 바라보는 시선 거리 중 긴것 순서대로 그려줘야 입체적으로 보입니다. 하지만 이것도 문제가 있습니다. 즉, 4개의 면이 모두 보이는게 아니고, 위의 경우는 딱 2개만 보입니다. 즉, 속도 효율성을 위해서 보이는 옆면만을 그리되, 그리는 순서는 시선의 거리가 긴것을 먼저 그려야 합니다. 시선의 거리가 길다라는 의미는 쉽게 말해.. 멀리 있는 옆면을 먼저 그려야한다는 것입니다.
결국 절차는 아래와 같습니다.
먼저 옆면중에서 보이는 면만을 골라 내는 방법은.. 일단 시선축이라는 것을 정의해야 합니다. 시선축은 폴리곤을 구성하는 좌표 중에서 가장 작은 y값을 가진 좌표를 지나는 x축과 평행한 선분입니다.
위의 예 같은 경우는 아래의 그림처럼 시선축(빨간색 선)을 정의할 수 있습니다.

이제 다음으로 폴리곤을 구성하는 각 선분(위의 예는 4개의 선분)에 대해 그 선분의 중점과 시선축과 수직선을 그려 봅니다. 이 수직선을 시선방향선이라고 하겠습니다. 아래의 그림이 폴리곤을 구성하는 하나의 선분(빨간색)의 중심점에서 시선축으로 시선방향선을 그려본 것인데.. 폴리곤을 구성하는 4개의 선분 중에서 2개와 교차하는 것을 알 수 있습니다.
하지만 여기서 중요한 예외 사항이 있는데.. 그것은 처음 기준이 되는 폴리곤을 구성하는 선분과의 중점과 시선축과의 거리(SL)이 선분을 구성하는 시작점이나 끝점과 시선축과의 거리보다 작다면 시선방향선과 교차하지 않는다고 가정을 합니다. 결과적으로 위의 경우는 시선방향선이 2개의 선분과 만나지만 1개만 만나는 것이 됩니다.
아래는 나머지 3개의 선분에 대한 시선 방향선을 표시한 그림들입니다.



이를 토대로, 유추를 해보면.. 교점의 수가 홀수인 경우가 보이는 옆면이고 짝수인 경우는 않보이는 옆면이라는 것을 알 수 있습니다.
이제 보이는 옆면을 고르는 것은 끝났고, 두번째 절차인 골라낸 옆면 중에 멀리는 있는 것부터 그리는 것은 골라낸 옆면에 대해 거리값, 위의 설명에서 SL의 값을 이용해 내림차순으로 정렬하여 정렬된 순서대로 옆면을 그리면 됩니다.
그리고 마지막 세번째 절차는 단순히 기존의 폴리곤을 y축으로 높이 값만큼 올려 그려주기만 하면 됩니다.
이해가 되셨는지 모르겠습니다. 이해가 되지 않는 부분에 대해서는 댓글을 통해 물어보시길 바랍니다.
꽤 오래전부터 이 기능을 추가해야지 하고 벼르던 차에.. 회사에서 수주한 프로젝트에서 실제로 이 기능이 적용되어야 한다고 하여.. 이제서야 추가하게 되었습니다.
나름대로 만족스럽기는 하지만… 실제 프로젝트에 적용되었을 경우에 한가지 큰 개선이 필요합니다. 그 개선은… 높이값을 가진 폴리곤 레이어가 하나가 아닌 여러개의 레이어로 구성되었을때 여러개의 레이어들의 각 폴리곤들을 옳바른 순서대로 그려내도록 하는 것입니다. 물론 여러개의 레이어를 하나의 레이어로 합쳐 버리면 될 일이지만…
게다가 이 글을 포스팅 하려고 지도이미지를 캡쳐받았는데… 바로 버그가 눈에 띱니다.. =_=;

화면 가운데 쯤… 잠원한신7차 308호.. 옆면이 그려지지 않았네요.. 이 버그를 지금이 아닌, 다음에.. 잡을겁니다..
3일후인, 9월 5일에 버그를 잡았습니다. 원인은 옆면을 그리기 위해 거리값으로 정렬을 해야하는데 동일한 거리값에 대해 기존의 값이 사라져 버리기 때문입니다. 조만간에.. 2차원인 Shape 파일을 위처럼 입체적으로 표현하는 알고리즘을 공개할까 합니다.