[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] SHP를 Point Type의 KML로 변환”에 대한 7개의 댓글

  1. 성각님, kml도 xml이니… 이 데이터안에서 좌표만을 추출해 내는건 어렵지 않습니다. 아마도 이런 종류의 작업이 필요하신 분들이 많을듯한데요. gps 로그 좌표를 가지고 있는 kml 데이터를 주시면 한번 보내주시기 바랍니다. 살펴보고 어렵지 않다면 편리하게 사용할 수 있도록 만들어 보겠습니다.

  2. 안녕하세요?
    좋은 프로그램 만들어 주신 덕분에 제 삶이 조금은 더 윤택해져서 좋아하고 있습니다.
    다름이 아니라 위와 같은 방법으로 만들어서 사용중인데요, 회사의 이름으로 라벨을 붙여 쓰고 있는데, 이 회사 이름을 클릭하면 주소가 보여질 수 있는 방법은 없을까요?
    구글상에선 보이질 않아서요…
    구글상의 문제일 수 있는데 제가 모르는 것일지도 모르겠네요…
    모쪼록 답변 부탁드리겠습니다. 감사합니다~^^

    1. 회사 이름을 클릭하면 풍선창(팝업)을 띠워.. 이 팝업에 원하시는 정보를 html로 채울수있습니다. 이 html에 링크를 걸수도 있구요. 이와 관련해 작업해 놓은 것을 예로 들면..

      ?은부동산중개경매컨설팅

      ?광호(?동))

      ?산 ?구 ?동 279-6
      052-?65-?900
      017-?72-?959

      ]]>

      grade3
      129.2875323,35.5371923

      위의 description 태그 안에 html로 제공하고자 하는 정보를 넣을수있습니다. 이미지든.. 뭐든 html로 가능한 모든 것이 가능합니다.

  3. 안녕하세요.
    어제 메일 보냈던 김용욱입니다.
    몇일동안 다른곳을 찾아다녔는데 이곳에 찾는 내용이 있었네요 ^_^;;
    geocoder와 point2kml 프로그램을 통해서 placemark를 구글지도에 올리는데는 성공을
    하였습니다만 label이 지도상에 보여지지가 않습니다.
    위의 지도처럼 placemark와 label이 동시에 보여야하는데 현재 구글지도에서는
    동일하게 구현이 되지않습니다.
    위성사진에서는 라벨을 선택하게 되어있으나 구글지도상의 도시나 호수등만 표시되고
    KML파일로 올린 파일의 라벨은 보이지 않습니다.
    구글지도 왼쪽창이나 직접 placemark를 클릭하면 수정창에서 보이기는 합니다만
    위의 화면처럼 바로 볼수는 없는지요?
    구글지도가 바뀌어서 그럴수도 있다는 생각이 듭니다만
    도움요청해 봅니다.
    공유해주신 자료를 정말 잘 사용하고 있습니다. 감사합니다. ^_^

    1. 흠……… 구글어스에서는 kml을 통해 이 글의 포스트처럼 가능한데… 웹 기반의 구글맵에서는… 저도 잘 모릅니다.. 구글맵의 OpenAPI를 한번 살펴보시기 바랍니다..

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다