[GIS] IDW 구현에 대한 실행 결과

먼저 입력 데이터는 아래와 같습니다. 15개 정도 되는 포인트 데이터로 각각 값을 가지고 있습니다. 이제 나머지 지점에 대해서도 IDW를 이용해 값을 예측해 보도록 하겠습니다.

사용자 삽입 이미지
먼저 IDW 공식에서 power 파라메터의 값을 0.9와 1.2, 2.6, 4.0으로 산출한 결과입니다.  보간된 지점은 색상으로 표시하였습니다. 값이 높은 지점은 완전 불투명한 빨강색, 낮은 지점은 완전 투명한 초록색입니다.

먼저 pow = 0.9 인 경우입니다.

사용자 삽입 이미지
IDW 공식을 설명할때 pow값의 범위에 따라 보간된 양상이 다르다… 라고 언급했는데, 이 pow의 값이 달라지면서 어떤 양상을 보이는지 살펴 보시길 바랍니다. 다음은 pow = 1.2 입니다.

사용자 삽입 이미지
그리고 pow = 2.6 입니다.

사용자 삽입 이미지
끝으로 pow = 4.0 입니다.

사용자 삽입 이미지
pow가 클 수록 값이 넓게 퍼지면서 보간되는 모습입니다. 보간할 값의 특성에 따라 알맞은 pow 값을 결정해줘야함을 알 수 있습니다. 끝으로… 위의 IDW 구현에 대한 결과 이미지는 XGE 엔진의 확장 기능 형태로 개발되었습니다. 이미지 결과를 확인하기 위해 IDW 구현에 대해 독자적인 프로젝트로 구현하지 않고 현재 개발중인 맵 엔진을 이용하였습니다. 혹시 IDW를 자신의 프로젝트에 적용하고자 한다면 저에게 멜 주시길 바랍니다. IDW를 구현해 보면서, 이 IDW를 실시간 지형 생성 프로젝트에 적용해도 괜찬은 결과를 얻을 수 있겠다는 생각이 들었습니다. 몇개의 높이값만으로도 결정되지 않은 더 많은 지점의 자연스러운 높이를 쉽게 구할 수 있으니 말입니다.

[GIS] IDW(Inverse Distance Weighting)

IDW는 이미 알고 있는 값으로부터 알고자 하는 값을 보간하는 방법입니다. IDW를 사용하여 주어진 점 x에 대한 보간된 값 u를 결정하는 일반화된 형태의 보간 함수는 다음과 같습니다.

사용자 삽입 이미지
N은 이미 알고 있는 값의 개수, w는 가중치의 값, u는 앞서 말한 계산되어 나온 보간된 값입니다. IDW에서 중요한것은 가중치의 값에 해당되는 w에 대한 함수가 여러개 존재하며, Spepard 방식과 Liszka 방식 그리고 이들의 변종이 존재합니다. 여기서는 Spepard 방식에 대한 w값에 대해서만 살펴 보겠습니다.

사용자 삽입 이미지
위의 식이 Spepard님이 정의한 가중치 w의 값입니다. d는 보간하고자 하는 지점(x)와 이미 알고 있는 지점(xk) 사이의 공간적 거리입니다. 바로 거리(Distance)의 역(Inverse)에 대한 가중치(Weighting)라는 의미로 IDW가 된 것입니다.

p는 0보다 큰 실수값입니다. 이 p값의 범위에 따라 전체적인 보간된 양상이 다양하게 결정됩니다. p의 범위가 0~1이면 전체적인 양상이 좁고 날카로우며 1보다 크면 넓고 부드럽게 퍼져서 보간이 됩니다. 눈에 보이는 보간된 양상을 글로써 표현하려니 한계가 있는데… 이 부분에 대해서 실제 구현을 통해 살펴보도록 하겠습니다.

끝으로 IDW처럼, 이미 알고 있는 값을 통해 다른 값을 추정(보간)하는 방법 중 Kriging 기법이 있습니다. 기회가 닿는 다면 이 Kriging 기법에 대해서도 논의해 보고 싶습니다.

[GIS] 개발중인 맵 엔진으로 표현한 통계 지도

간단하게 서울시 행정구역도와 가상의 데이터를 이용해서 구성해본 통계 지도입니다. 먼저 첫번째와 두번째는 남자, 여자, 노인이라는 항목에 대한 인구수를 가상의 데이터로 하여 Bar Chart 형식으로 표현한 내용이며 두번째는 동일한 주제로 하여 Pie Chart 형태로 표현한 화면입니다.

사용자 삽입 이미지
사용자 삽입 이미지
그리고 아래, 세번째는 실제 아파트의 밀집 정도를 색상 밀도도로 표현한 것입니다. 그리고 네번째는 표현한 밀집도를 등가선을 추출해 표현한 것입니다. 밀도도와 등가선을 추출하는 기능은 개발중인 맵 엔진에 Plug-In 할 수 있는 별도의 확장 기능 개념으로 개발하였습니다.

사용자 삽입 이미지
사용자 삽입 이미지
아래는 좀더 좁은 간격으로 등가선을 딴 결과 화면입니다.

사용자 삽입 이미지
이외에도 개발중인 맵 엔진를 이용하여 지도 위에 다양한 형태의 통계치를 표현할 수 있습니다.

보간 – Catmull-Rom Spline

많은 스플라인의 종류 중에 하나인 큐빅 스플라인을 1차원의 보간에 적용하는 것에 대해 살펴보겠습니다. Catmull-Rom 스플라인을 구성하는 구분된 부드러운 곡선들을 나타내는 키 프레임 집합을 가지며 모든 키는 곡선 상에 위치합니다. 이 루틴을 사용하기 위해서 4개의 키 프레임 값이 필요합니다. 이 4개의 키 값을 v0, v1, v2, v3라고 하고, 여기에 보간을 위하여 v1에서 v2 사이의 지정된 0~1까지의 범위를 가지는 실수값 x가 존재합니다. 아래의 f(x)의 반환값은 x값에 의해 결정이 됩니다.

사용자 삽입 이미지
여기서 M은 다음처럼 정의됩니다.

사용자 삽입 이미지
아래의 이미지는 v1에서 v2 사이의 곡선의 한 예를 나타난 것입니다. 이 곡선은 위의 수식에서 x 값을 0에서 1.0 사이의 값을 이용해 얻을 수 있습니다.

사용자 삽입 이미지

아래의 코드는 위에서 설명한 내용을 C언어로 구현한 것입니다.

/* Coefficients for Matrix M */
#define M11  0.0 
#define M12  1.0
#define M13  0.0
#define M14  0.0
#define M21 -0.5
#define M22  0.0
#define M23  0.5
#define M24  0.0
#define M31  1.0
#define M32 -2.5
#define M33  2.0
#define M34 -0.5
#define M41 -0.5
#define M42  1.5
#define M43 -1.5
#define M44  0.5

double catmullRomSpline(float x, float v0,float v1, float v2,float v3) {
    double c1,c2,c3,c4;

    c1 = M12*v1;
    c2 = M21*v0 + M23*v2;
    c3 = M31*v0 + M32*v1 + M33*v2 + M34*v3;
    c4 = M41*v0 + M42*v1 + M43*v2 + M44*v3;

    return(((c4*x + c3)*x +c2)*x + c1);
}

이 글의 원문은 http://www.lighthouse3d.com/opengl/maths/index.php?catmullrom 입니다.