[GIS] SHP를 Point Type의 KML로 변환

포인트, 폴리라인, 폴리곤에 대한 SHP를 KML 포맷으로 변환할 수 있는 유틸리티입니다. 선택 기능으로써 SHP의 속성값을 라벨로 표시할 수 있는 기능도 제공됩니다. SHP 파일의 좌표계는 WGS84 경위도 좌표계여야 합니다.

사용자 삽입 이미지

위의 프로그램으로 SHP 파일을 KML로 내보내 구글어스에서 살펴본 화면은 아래와 같습니다. 처음 화면은 기본 화면이며 두번째 화면이 변환된 KML과 함께 표현한 것입니다.

사용자 삽입 이미지
사용자 삽입 이미지
참고로… 이 툴은 오픈소스인 ShapeLib를 이용해 SHP 파일의 도형 정보와 속성 정보를 읽어 만들었습니다. ShapeLib는 http://cafe.naver.com/gisdev에서 자세한 사용법을 알 수 있으니 SHP 파일을 처리할 필요가 있으신 분은 한번 참조해 보시기 바랍니다.

참고로… 이 프로그램을 만들면서 찾은 정보입니다. 먼저 Visual C++ 2005 이상에서 MFC 대화창 기반의 어플리케이션 개발 시에 XP 테마를 적용하기 위해서는 다음 코드를 임의의 헤더 파일이나 소스 파일에 포함해야 합니다.

#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

그리고 KML 파일의 내용은 utf-8로 인코딩되어야 하며 C/C++에서 ansi 문자셋를 utf-8 문자셋으로 변환하기 위해 사용한 코드는 아래와 같습니다.

void CPoint2KmlDlg::SaveAsUTF8(FILE *pFile, char *pszCode)
{
    int  nLength, nLength2;
    BSTR bstrCode; 
    char *pszUTFCode = NULL;

    nLength = MultiByteToWideChar(CP_ACP, 0, pszCode, 
        lstrlen(pszCode), NULL, NULL); 
    bstrCode = SysAllocStringLen(NULL, nLength); 
    MultiByteToWideChar(CP_ACP, 0, pszCode, lstrlen(pszCode), bstrCode, nLength);

    nLength2 = WideCharToMultiByte(CP_UTF8, 0, bstrCode, -1, pszUTFCode, 
        0, NULL, NULL); 
    pszUTFCode = (char*)malloc(nLength2+1); 
    WideCharToMultiByte(CP_UTF8, 0, bstrCode, -1, pszUTFCode, 
        nLength2, NULL, NULL); 

    fprintf(pFile, "%s", pszUTFCode);

    SysFreeString(bstrCode);
    free(pszUTFCode);
}

첫번째 인자는 출력할 파일의 핸들이며 두번째는 널문자로 끝나는 ansi 문자 배열을 넘겨주게 되면 utf-8로 변환되어 저장됩니다. 위의 코드의 출처는 http://skorea.tistory.com/43 입니다.

[GIS] DBF 필드값 최적화시켜 용량 대폭 줄여주는 툴, OptimizeDBF

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

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

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

사용자 삽입 이미지
이 툴을 만들게 된 목적은 개발중인 맵 엔진(XGE)에 데이터를 제공하는 웹방식의 데이터서버가 관리하고 있는 속성 데이터를 최적화시킬 목적으로 만들게 되었습니다. XGE 지도 엔진을 만들기 위한 Core 라이브러리를 이용해 제작했습니다.

[GIS] DXF를 ESRI Shape로 변환해주는 툴, DXF to SHP

DXF를 ESRI의 SHP 파일로 변환해주는 툴입니다. 수치지도 DXF 파일과 내보낼 레이어를 선택하고, 변환될 Shape의 종류를 선택해주면 Shape 파일로 생성해 주는 간단한 툴입니다. 개발중인 맵 엔진에 DXF 수치지도를 표시하는 기능에 대비해, 회사에서 DXF를 Shape 파일로 변환해야할 일이 생겨서 겸사 겸사 만들어 보았습니다. Shape의 속성은 Layer 명 하나만 만들어 집니다.

사용자 삽입 이미지
사용하기 전에 알면 좋은 점이.. DXF 수치지도를 Point나 Polyline, Polygon으로 내보기기 할때 DXF에서 이용할 Enitity입니다.

  • Point : CAD의 INSERT 엔티티를 사용
  • Polyline : CAD의 POLYLINE 엔티티를 사용
  • Polygon : CAD의 POLYLINE 엔티티를 사용하며, 폐합된 엔티티만을 Polygon으로 내보냄(만약 Force Close-Polygon을 체크하면 강제로 폐합시키고 모든 엔티티를 내보냄)

아래는 화면은 이 툴을 이용해 실제 수치지도를 등고선 레이어 7XXX 대를 폴리라인으로 내보내기 해서 ArcMap으로 살펴본 화면입니다.

사용자 삽입 이미지
이 툴은 XGE 지도 엔진을 이용하지 않고, XGE 지도 엔진을 구현하기 위한 Core 라이브러리를 이용해 개발하였습니다. C++로 개발된지라 .NET 2.0 역시 필요치 않습니다.