지난 회차 게시물에서는 기상청 ASOS 장비의 기상요소 관측자료를 기상자료 개방포털 웹페이지에서 CSV 파일로 수신한 다음 이 파일을 IDL에서 읽고 처리하여 특정한 시각에 대한 모든 지점들의 기온 값을 한반도 지도상에 표출하는 과정을 소개한 바 있습니다. 여기서는 BUBBLEPLOT 함수를 사용하여 각 지점의 위치에 버블이 표시되면서 그 색상이 기온 값에 따라 차등적으로 보이도록 하였습니다.
그런데 이와 같이 지점별로 존재하는 데이터를 바탕으로 일정한 경도 및 위도 범위의 격자들을 가정하여 2차원적인 격자 데이터로 계산하여 표출하는 것이 필요한 경우도 있습니다. 즉 불규칙한 분포를 하는 데이터들을 규칙적인 격자 데이터로 변환하는 작업인데, 이러한 변환 작업에 사용되는 여러가지 계산 기법들 중 Kriging 기법을 적용해보고자 합니다. 이러한 기법을 사용하여 격자화된 2차원 데이터를 얻고, 이를 이미지의 형태로 지도상에 표시하는 방식으로 작업을 진행해보겠습니다. IDL에서는 Kriging 기법을 사용할 수 있도록 해주는 전용 함수인 KRIG2D 함수가 그러한 역할을 합니다. 일단 KRIG2D 함수를 사용하는 방법에 관해서는 예전에 관련 게시물을 올린 바 있으며, 오늘 소개할 내용 역시 이 게시물의 내용을 바탕으로 합니다. 그러면 먼저 지난 회차 게시물에서 ASOS 관측자료로부터 특정한 시각에 대한 데이터를 추출하고 한반도 지도를 표출한 후 각 지점의 기온 값을 버블 형태로 표시하는 과정까지는 그대로 진행합니다. 그 과정 및 표출 그림은 다음과 같습니다.
file = 'OBS_ASOS_TIM_20250108162821.csv'
READCOL, file, stnids, dstrs, temps, temps_qc, $
FORMAT='I,X,A,F,I', DELIMITER=',', /NAN, /PRESERVE_NULL
dstr = '2025-01-03 01:00'
ww = WHERE(dstrs EQ dstr, count)
stnids = stnids[ww]
temps = temps[ww]
temps_qc = temps_qc[ww]
wgood = WHERE(temps_qc NE 9, cgood)
temps_good = temps[wgood]
RESTORE, 'ASOS_stations.sav'
lons_good = lons[wgood]
lats_good = lats[wgood]
win = WINDOW(DIMENSIONS=[800, 850], /NO_TOOLBAR)
m = MAP('Geographic', LIMIT=[33, 124, 40, 131], FONT_SIZE=11, $
MARGIN=[0.07, 0.05, 0.07, 0.10], /CURRENT)
mc = MAPCONTINENTS(/HIRES, FILL_COLOR=[240, 240, 240])
m.MapGrid.LINESTYLE = 1
m.MapGrid.LABEL_POSITION = 0
m.MapGrid.HORIZON_LINESTYLE = 0
sp = BUBBLEPLOT(lons_good, lats_good, $
COLOR=BYTSCL(temps, MIN=-10, MAX=10), RGB_TABLE=34, $
BORDER=1, LINECOLOR='black', SIZING=0.25, /OVERPLOT)
cb = COLORBAR(TARGET=sp, RANGE=[-10, 10], /BORDER, $
POSITION=[0.2, 0.91, 0.8, 0.94])
tx = TEXT(0.5, 0.96, dstr+', Temperature ('+'$\deg$'+'C)', ALIGNMENT=0.5, $
FONT_SIZE=12, /NORMAL)

그러면 이제 이와 같이 지점 분포를 하는 자료에 대하여 Kriging 기법을 적용하여 격자화된 데이터로 변환해봅시다. 앞서 언급했던 관련 게시물의 내용을 참조하여 다음과 같이 처리합니다.
temps_new = KRIG2D(temps_good, lons_good, lats_good, $
EXPONENTIAL=[1.0, 0], GS=[0.01, 0.01], BOUND=[124, 33, 131, 39])
HELP, temps_new
여기서 KRIG2D 함수의 세개의 인수들은 지점 데이터인 temps_good, lons_good, lats_good을 그대로 순서대로 사용하였습니다. 그리고 격자화된 결과 데이터를 얻기 위하여 격자들이 점유하게 될 범위와 격자 해상도를 경도 및 위도 방향으로 정의해야 합니다. 이를 위하여 GS 및 BOUND 키워드를 사용하였습니다. 위의 내용에서는 경도 방향으로 124도부터 131도까지 0.01도 간격으로 그리고 위도 방향으로 33도부터 39도까지 0.01도 간격으로 격자들이 분포하도록 정의한 것입니다. 즉 GS 키워드는 격자 해상도, BOUND 키워드는 격자들의 범위를 설정하는 역할을 합니다.
그리고 EXPONENTIAL 키워드에 대하여 [1.0, 0]이라는 값이 부여되었습니다. 이것은 Kriging 기법을 적용하여 각 격자점에 대한 계산값을 산출하기 위하여 주변의 다른 지점들의 값들을 반영하는데 있어서 각 지점별 Weight 수치를 가정하는 Variogram 모형과 관련된 것입니다. KRIG2D 함수에서는 총 4종의 모형들(Linear, Exponential, Gaussian, Spherical)이 지원되고 있어서 이들 중 어떤 모형을 적용할 것인지를 결정하여 해당 키워드 및 관련 인자값들을 지정해야 합니다. 위의 내용에서는 Exponential 모형을 적용하기 위하여 EXPONENTIAL 키워드를 사용하였습니다. 이와 관련된 자세한 내용은 IDL 도움말 또는 앞서 언급한 관련 게시물의 내용을 참조하시기 바랍니다. 이제 위와 같이 얻어진 temps_new를 이미지의 형태로 지도상에 중첩 표출해야 하는데 그 과정은 다음과 같습니다.
im = IMAGE(temps_new, RGB_TABLE=34, MIN_VALUE=-10, MAX_VALUE=10, $
IMAGE_LOCATION=[124, 33], IMAGE_DIMENSION=[7, 6], $
GRID_UNITS=2, /OVERPLOT)
여기서는 IMAGE 함수에 temps_new를 투입하면서 IMAGE_LOCATION 및 IMAGE_DIMENSION 속성을 사용하여 지도상에서 이미지의 위치 및 범위를 지정해주는 것이 가장 중요합니다. 따라서 방금 제시한 새로운 내용들을 기존의 프로그램에서 MAP 함수가 사용된 부분과 MAPCONTINENTS 함수가 사용된 부분 사이에 추가해주면 됩니다. 그리고 기존의 표출에서는 육지 영역을 옅은 회색으로 처리했었는데 이번에는 이미지의 중첩을 위하여 배경색의 설정은 하지 않습니다. 그리고 BUBBLEPLOT 함수가 사용된 내용은 삭제해야 합니다. 따라서 전체 내용에서 후반부의 지도 표출 관련 부분이 다음과 같이 수정되어야 합니다.
win = WINDOW(DIMENSIONS=[800, 850], /NO_TOOLBAR)
m = MAP('Geographic', LIMIT=[33, 124, 40, 131], FONT_SIZE=11, $
MARGIN=[0.07, 0.05, 0.07, 0.10], /CURRENT)
temps_new = KRIG2D(temps_good, lons_good, lats_good, $
EXPONENTIAL=[1.0, 0], GS=[0.01, 0.01], BOUND=[124, 33, 131, 39])
im = IMAGE(temps_new, MIN_VALUE=-10, MAX_VALUE=10, $
IMAGE_LOCATION=[124, 33], IMAGE_DIMENSION=[7, 6], $
RGB_TABLE=34, GRID_UNITS=2, /OVERPLOT)
mc = MAPCONTINENTS(/HIRES)
m.MapGrid.LINESTYLE = 1
m.MapGrid.LABEL_POSITION = 0
m.MapGrid.HORIZON_LINESTYLE = 0
cb = COLORBAR(TARGET=sp, RANGE=[-10, 10], /BORDER, $
POSITION=[0.2, 0.91, 0.8, 0.94])
tx = TEXT(0.5, 0.96, dstr+', Temperature ('+'$\deg$'+'C)', ALIGNMENT=0.5, $
FONT_SIZE=12, /NORMAL)
이와 같은 수정사항을 반영하여 다시 실행해보면 다음과 같은 그림을 얻게 됩니다.

물론 이 그림은 Kriging 기법을 Exponential 모형으로 적용하여 얻은 계산 결과입니다. 다른 모형을 사용하거나 관련 인자값을 변경하면 결과는 얼마든지 달라질 수 있습니다. 만약 EXPONENTIAL 키워드의 값을 다음과 같이 [2.0, 0]으로 변경하면 그 결과는 다음 그림과 같습니다.
temps_new = KRIG2D(temps_good, lons_good, lats_good, $
EXPONENTIAL=[2.0, 0], GS=[0.01, 0.01], BOUND=[124, 33, 131, 39])

그리고 Exponential 대신 Spherical 모형을 사용할 경우에는 그 결과는 다음과 같습니다.
temps_new = KRIG2D(temps_good, lons_good, lats_good, $
SPHERICAL=[2.0, 0], GS=[0.01, 0.01], BOUND=[124, 33, 131, 39])

이와 같은 결과들에서 보는 바와 같이 Kriging 기법을 사용하더라도 세부적으로 어떤 모형을 쓰느냐 그리고 세부 인자값들을 어떻게 설정하느냐에 따라서 서로 다른 결과들을 얻게 됩니다. 제가 다른 게시물들에서도 종종 언급했듯이, 여기서 어떤 기법을 어떤 방식으로 적용할 것이냐는 결국 데이터의 특성에 따라 연구자가 판단해야 할 부분이 될 것입니다.
그리고 위의 결과 그림들을 보면 아무래도 경도 및 위도 방향의 사각형 영역으로 계산 결과를 얻기 때문에 그 격자의 범위가 한반도의 육지 뿐 아니라 해양 영역까지도 커버하게 됩니다. 하지만 이 결과에서 해양 영역의 격자들의 값은 큰 의미가 없다고 봐야 합니다. 애초에 해양 영역에는 ASOS 지점들이 없기 때문입니다. 따라서 위의 결과 그림들에서는 한반도 육지 부분의 격자값들만 어느 정도 의미가 있다고 보는 것이 맞을 것입니다.
이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > Programming' 카테고리의 다른 글
| Yale Bright Star Catalog 데이터를 읽고 처리하기 [1] (1) | 2025.03.25 |
|---|---|
| 기상청 ASOS 자료의 공간 분포 표출 [3] (0) | 2025.02.04 |
| 기상청 ASOS 자료의 공간 분포 표출 [1] (0) | 2025.01.20 |
| 기상청 ASOS 자료의 지점별 시계열 표출 (0) | 2025.01.14 |
| 기상청 ASOS 지점 분포 자료 획득 및 표출 (0) | 2025.01.07 |