[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] 분석 결과와 배경 지도

오늘 급작스레 구현해 본 기능인데… 어떤 공간 위에 여러가지 데이터를 가지고 분석한 결과를 표출할때… 배경이 되는 지도와 분석 결과가 뒤섞여… 분석 결과가 한눈에 들어오지 않는 경우가 있는 듯합니다.

사용자 삽입 이미지

그래서 배경이 되는지도의 색상을 빼고, 분석 결과만 색상을 적용하도록 했습니다. 물론.. 사용자가 원하는 시점에서 배경 지도의 색상을 적용하고 뺄 수 있도록 한 것이구요. 매우 단순한 아이디어지만… 사용자에게는 매우 좋은 기능으로 생각됩니다..

위의 이미지는 배경지도위에 어떤 주제를 가지는 밀도 분석 결과를 함께 표현한 것입니다. 지도 엔진은 오픈메이트의 지도 엔진인 XGE를 이용해서 밀도 분석은 XGE에 플러그인할 수 있는 확장 기능으로 수행했습니다.

참고로… 위의 이미지에 해당하는 프로그램인 Clone은 XGE를 이용해 만든 간단한 C/S 프로그램입니다. 여러가지 공간분석기능을 기본도 위에서 수행할 수 있는 GIS 분석용 프로그램입니다. 언제 시간이 되면… XGE를 이용해 만든 여느 프로그램처럼… 소스를 공개할 예정입니다.

[GIS] 개발 맵 엔진, Kernel Density 그림 개선

개발 맵 엔진의 확장 기능 중에 밀도 분석에 대한 기능이 있습니다. 지도 엔진을 설계할 당시에 파일럿 성격으로 만들고, 이를 별다른 고민이나 개선없이 확장 기능 단으로 수용을 해서인지… 여러가지로 문제가 있었나 봅니다. 문제가 꽤 되는데…. 그 중에 2가지만 언급한다면…

  • 적은 포인트의 개수에 대해 밀도 그림으로써 의미가 없는 결과를 냄
  • 기존에 존재 하는 GIS 밀도 분석 기능(ArcGIS)에 비해 속도가 매우 느림

먼저 첫번째에 대해서는 이런 저런 고민으로 절충안을 내어 개선을 했습니다. 실제로 이전의 개발 맵 엔진의 밀도분석에 대한 확장 기능으로 포인트 수가 10개정도 되는 공간을 대상으로 수행해 보면, 전혀 엉뚱한 결과가 도출되었습니다. 아래는 개선되기 이전의 결과 입니다.
사용자 삽입 이미지
그리고 아래는 동일한 해상도, 동일한 검색반경을 이용한 개선된 밀도 분석에 대한 결과 그림입니다.

사용자 삽입 이미지

그리고 아래의 두 그림은 개선된 밀도 분석 기능을 통해 만들어본 실제 의미있는 포인트에 대한 밀도 분석입니다. 여기서의 의미는 서울시에 존재하는 아파트 중 매매가가 6억 이상인 아파트에 대한 포인트로써, 데이터는 오픈메이트에서 보유하고 있는 데이터입니다. 실제로 국내에서 가장 정확하고 중요한 인문/사회에 대한 데이터와 특히 아파트에 대한 데이터는 오픈메이트가 보유하고 있는 데이터가 최고가 아닌가 싶습니다.

사용자 삽입 이미지
사용자 삽입 이미지
끝으로, 공간 상의 밀도 분석은 공간 상에 의미 있는 데이터가 어떤 분포 양상을 띠는지에 대한 경향을 분석하는 기능으로, 비지니스 분야의 GIS를 활용한 분석에서는 매우 큰 비중을 차지 하고 있는 분석 기능입니다.

아..! 그리고 속도에 대한 개선은 아직 이루지 못했습니다. 하지만 일단 개선할 곳을 찾기는 했는데.. 개선하기가 약간 복잡하여 추후 문제가 될 경우 개선할 예정입니다.

[GIS] 가중치 최소 비용 경로 분석을 이용한 차량 이동 시간

가중치 최소 비용 경로 분석을 이용하여 특정 위치에 대해 차량으로 이동할 경우 소요되는 시간에 대한 영역을 분석하는 기능에 적용해 보았습니다. 가중치는 차량이동속도로 하였습니다. 절차는 다음과 같습니다.

사용자 삽입 이미지
먼저 벡터 데이터로 도로망에 대한 폴리라인 데이터와 한강 수계에 대한 폴리곤 데이터를 추가합니다.

사용자 삽입 이미지
그리고, 이 두 벡터 데이터를 라스터 데이터로 변환합니다. 이때 도로망에 대한 셀값은 차량의 이동속도 값을 주는데, 여기서는 30km/h로 합니다. 그리고 수계는 차량이 들어갈 수 없으므로 NULL 값을 줍니다. 그리고 그 이외의 셀들은 도보 속도인 4km/h로 줍니다. 변환한 위의 화면을 확대해 보면 라스터로 변환된 것을 확인할 수 있습니다.

사용자 삽입 이미지
바로 파랑색이 차도이며 30의 값을 가지고, 회색은 4의 값을 가집니다.

사용자 삽입 이미지
이제 목적지가 되는 포인트를 먼저 추가하고 가중치 최소 비용 경로 분석을 수행합니다. 목적지 포인트는 화면상에 노란색 원이 그에 해당하고, 가중치 최소 비용 경로 분석에 대한 결과는 위처럼 회색계열의 새로운 라스터 데이터 레이어가 생성됩니다. 분석된 셀값에는 거리에 대한 값이 반영되어 있으므로 이 거리의 값을 제거하기 위해 셀의 크기로 나누어 시간 값만 남게 합니다.

최종적으로 등고선 추출 기능(개발 맵 엔진의 확장 기능 중의 하나)를 이용하여 15분과 35분에 대한 차량이동시간을 추출한 화면이 아래와 같습니다.

사용자 삽입 이미지
바로 위의 그림에서 추출된 영역이 목적지 포인트에 도달하는데 소요되는 최대 시간으로 각각 최대 15분이 소요되는 영역과 35분이 소요되는 영역을 나타내고 있습니다.

이 가중치 최소 비용 경로 분석은 적용하는 가중치에 따라 공간상의 이동에 대한 매우 다양한 분야에 적용할 수 있는 GIS 공간 분석 방법입니다.