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