GRIDDATA 함수를 사용한 2차원 데이터의 근사 [2]
* 앞선 게시물 [1]에서 이어집니다.
따라서 이런 경우에는 다른 알고리즘을 시도해봐야 합니다. 물론 나머지 9개 중 어느 것이 가장 좋을지는 판단이 쉽지 않습니다. 그리고 각 알고리즘마다 필요한 키워드들의 종류도 다르고, 어떤 경우에는 QHULL, GRID_INPUT 등 다른 과정이 추가로 필요할 수도 있습니다. 이런 부분들까지 여기서 커버하기는 어렵습니다. 이것은 데이터의 상태나 성격에 따라서도 좌우될 수 있는 문제이기 때문에 단순하게 규정지을 수 있는 문제는 아닐 것 같습니다. 아무래도 분석자의 판단과 경험이 필요한 부분이라고 할 수 있을겁니다. 다만 여기서는 Kriging이라는 알고리즘 하나만 추가적으로 사용해보기로 하겠습니다. 앞선 예제코드에서 GRIDDATA가 사용되었던 라인을 다음과 같은 내용으로 대체해서 사용해봅시다. 여기서는 Kriging 알고리즘을 사용하기 위하여 /KRIGING 키워드가 사용되었다는 차이만 있습니다. 이렇게 처리된 결과는 다음 그림과 같습니다.
data_f = GRIDDATA(xxs, yys, data_tmp, DIMENSION=[xgz, ygz], $
/KRIGING)
앞서 기본 알고리즘인 Inverse Distance 알고리즘으로 처리된 결과에 비해서는 좀 더 그럴듯한 느낌이 듭니다. 즉, 원본 데이터상의 빈 공간을 채워넣은 값들이 주변과 큰 괴리를 보이지는 않는 것 같습니다. 그래서 제가 보기에는 적어도 기본 알고리즘에 비해서는 좀 더 나은 결과를 주고 있다고 생각합니다. 다만 이 Kriging 알고리즘의 경우 처리시간이 좀 더 소요됩니다. 컴퓨터 사양에 따라서는 수분까지도 걸릴 수 있는데, 알고리즘의 특성상 어쩔 수 없는 부분입니다. 그리고 GRIDDATA에서 지원되는 나머지 8개의 알고리즘들 중에 좀 더 나은 결과를 주는 것이 있을지도 모르는데, 이것은 여러분들이 직접 시도해보시기 바랍니다.
이번에는 앞서 했던 것과는 달리 X, Y 방향의 경도 및 위도를 사용하고, 지구 구면상의 데이터를 처리하는 방식으로 진행을 해보고자 합니다. 이 경우에는 GRIDDATA 함수에 들어가는 인자만 약간 달라지면 되는데, 내용은 다음과 같습니다.
data_f = GRIDDATA(lons[xxs], lats[yys], data_tmp, $
DIMENSION=[xgz, ygz], /SPHERE, /DEGREE, /KRIGING)
가장 중요한 차이는, 첫번째 및 두번째 인자가 이전과는 달리 lons[xxs], lats[yys]가 된다는 점입니다. 즉, 경도와 위도의 값을 실제로 사용하게 된 셈입니다. 그리고 앞서 봤듯이 Kriging 알고리즘이 더 나은 결과를 준다고 판단되어 /KRIGING 키워드를 사용하였습니다. 그리고 /SPHERE라는 키워드는 말그대로 데이터 포인트들이 구면상에 존재한다고 가정하고 처리하라는 의미입니다. 이 결과는 다음 그림과 같습니다.
사실 그림만 봐서는 평면에서의 처리결과와 구면에서의 처리결과가 큰 차이가 없어 보일 수 있지만, 자세히 비교해보면 약간 차이는 납니다. 이것은 직접 그림을 눈으로 면밀하게 비교해보면 확인이 가능합니다. 이제 GRIDDATA 함수를 사용한 처리방법에 관한 전반적인 소개는 마무리가 된 것 같습니다. 하나만 더 해본다면, 우리가 마지막으로 얻은 결과를 지도상에 중첩하여 그려보겠습니다. 2차원 이미지를 지도상에 중첩하여 그리는 방법은 제가 이 블로그에서 이미 소개한 바가 있으므로, 자세한 내용은 소개하지 않고 그냥 예제코드 및 결과 그림만 싣도록 하겠습니다.
win2 = WINDOW(DIMENSIONS=[500*2, 500])
m2o = MAP('Geographic', LIMIT=[30, 120, 40, 130], $
ASPECT_RATIO=0, MARGIN=0.08, /CURRENT, LAYOUT=[2, 1, 1])
im2o = IMAGE(data, RGB_TABLE=59, IMAGE_DIMENSIONS=[10, 10], $
IMAGE_LOCATION=[120, 30], GRID_UNITS=2, /OVERPLOT)
mc = MAPCONTINENTS(/HIRES, THICK=2)
mg2o = m2o.MapGrid
mg2o.Linestyle = 2
mg2o.LABEL_POSITION = 0
m2f = MAP('Geographic', LIMIT=[30, 120, 40, 130], $
ASPECT_RATIO=0, MARGIN=0.08, /CURRENT, LAYOUT=[2, 1, 2])
im2f = IMAGE(data_f, RGB_TABLE=59, IMAGE_DIMENSIONS=[10, 10], $
IMAGE_LOCATION=[120, 30], GRID_UNITS=2, /OVERPLOT)
mc = MAPCONTINENTS(/HIRES, THICK=2)
mg2f = m2f.MapGrid
mg2f.Linestyle = 2
mg2f.LABEL_POSITION = 0
사실 2회에 걸쳐서 GRIDDATA라는 함수를 다뤄봤지만, 이 함수가 갖고 있는 기능 및 특성들에 관한 내용을 모두 커버하기에는 분명 무리가 있을 겁니다. 하지만 이 내용이 앞으로 여러분들이 GRIDDATA라는 함수를 좀 더 효과적으로 활용할 수 있는 기반이 되었으면 합니다.