[GIS] 폴리라인 SHP을 KML로 변환

폴리라인 타입의 SHP 파일을 KML로 변환할 수 있는 툴입니다. 요즘 부쩍 KML에 대해 관심이 높습니다. OGC에서 표준으로 채택된 포맷인지라…. 활용도도 매우 높을거란 판단에서 인듯 합니다. 잠시 시간을 내어 만들어 보았습니다. 아래는 툴의 실행화면인데…. 사용법은 매우 간단합니다. 폴리라인 타입의 SHP 파일과 저장할 KML 파일 이름을 지정해 주면됩니다.

사용자 삽입 이미지

만약 폴리라인 타입이 아닌 폴리곤 SHP을 지정했을 경우에도 폴리곤이 아닌 폴리라인으로 내보내집니다. 하지만 포인트의 경우 그 결과가 어떻게 될지 모르겠습니다. 좌표계는 구글어스에서 사용하는 WGS84 경위도 좌표계로 저장된 SHP 파일일 경우에 제대로 구글어스에서 중첩됩니다. 아래는 위의 툴로 내보낸 SHP 파일을 구글어스에서 함께 표현한 화면입니다.

사용자 삽입 이미지
혹… 필요로 하시는 분들에게 도움이 되셨으면 좋겠습니다.

[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 입니다.