IDL/Mapping

천리안 위성 2A호(GK2A)의 데이터 표출 [1]

이상우_IDL 2020. 3. 11. 18:13
728x90

아마 언론보도를 통하여 소식을 많이들 보셨을 것 같습니다. 천리안 2B 인공위성이 지난 2월 19일에 발사가 되었고 성공적으로 궤도에 안착하였다는 소식은 이미 나왔고 이제 본격적인 가동이 시작되는 단계인 것 같습니다. 아마도 조만간 많은 데이터를 제공하게 될 것으로 보이는데요. 그래서 이에 즈음하여 천리안 2B 위성 이전에 이미 발사되어 운용중이었던 천리안 2A 위성의 데이터를 IDL에서 처리하여 표출하는 예제를 한번 다뤄보고자 합니다. 천리안 2A 위성의 데이터는 이미 국가기상위성센터에서 공개적으로 서비스를 하고 있어서수요자들이 언제든 받아서 사용할 수 있도록 인프라가 갖추어져 있습니다. 우선 천리안위성 2A호 웹페이지에서는 위성에 대한 전반적인 개요를 소개하고 샘플 데이터를 관련 매뉴얼과 함께 제공하고 있습니다. 하지만 원하는 시간, 종류 등에 맞춰서 필요한 데이터를 받으려면 자료검색시스템 서비스 웹페이지에서 회원 가입을 해야 합니다. 회원 가입이 완료된 후에 필요한 자료를 선택하여 신청하면 받을 수 있도록 되어 있습니다.


제가 이번에 다뤄보고자 하는 데이터는 바로 이 천리안 2A 위성의 영상 데이터인데, 사실 영상 데이터의 경우도 가시광, 적외선, 수증기 등 종류가 상당히 많기 때문에 제가 여기서 모든 종류의 데이터를 다 다뤄보지는 못합니다. 그래서 그 중 적외선 영상인 IR 11.2 um 데이터로 한정하도록 하겠습니다. 그리고 netCDF 포맷의 데이터 파일을 사용하기로 합니다. 또한 영상 데이터의 영역 커버리지의 경우는 전구(Global), 동아시아, 한반도 등 세가지 종류로 제공되고 있는데요. 이 중 동아시아 및 한반도 영역 데이터를 대상으로 하겠습니다. 전구 맵 데이터의 경우는 투영법도 다르고 표출 방식에 있어서 다듬어야 할 부분이 아직 좀 있어서 나중에 기회가 된다면 추가로 다뤄보기로 하겠습니다. 하여간 그래서 제가 이번에 예제로 사용할 두 데이터 파일들의 이름은 다음과 같습니다.


gk2a_ami_le1b_ir112_ea020lc_202002280300.nc (동아시아 영역)

gk2a_ami_le1b_ir112_ko020lc_202002280300.nc (한반도 영역)


파일 이름에서 알 수 있듯이 2020년 2월 28일 03시 00분 UT에 IR 11.2 um 파장으로 얻어진 동아시아 및 한반도 영역에 대한 데이터를 담은 netCDF 형식의 파일들입니다. 다만 이 파일들은 저도 앞서 언급한 자료검색 시스템 웹페이지에 가입을 하여 요청에 의하여 받은 것들이기 때문에, 원래의 데이터 배포 방식을 존중하는 차원에서 제가 여기서 이 파일들을 직접 배포하지는 않겠습니다. 그래서 필요하신 분들은 직접 가입을 해서 받으시길 권장드립니다. 그리고 제가 편의상 여기서는 IR 11.2 um 데이터로 한정하였지만, 이번에 소개될 내용은 다른 종류의 데이터에 대해서도 거의 비슷하게 적용될 수 있음을 미리 언급해둡니다.


그러면 본격적으로 시작해보겠습니다. 일단 먼저 한반도 영역 데이터 파일부터 시작합니다. 다음과 같이 파일명을 문자값으로서 변수에 담아둡시다.


file = 'gk2a_ami_le1b_ir112_ko020lc_202002280300.nc'


제가 이 블로그에서 netCDF 포맷의 파일을 IDL에서 읽는 방법에 관하여 소개했던 적이 있습니다. 따라서 netCDF 파일을 읽는 방법에 관한 자세한 설명은 생략하기로 하겠습니다. 필요하신 분들은 이 블로그에서 'netCDF 포맷의 데이터를 읽고 표출하기'라는 제목으로 올렸던 게시물들의 내용을 참조하시기 바랍니다.


netCDF 포맷의 데이터를 읽고 표출하기 [1]

netCDF 포맷의 데이터를 읽고 표출하기 [2]


그러면 우선 이 파일 내에 포함되어 있는 변수(Variable)들의 목록 정보부터 먼저 살펴보겠습니다. 이를 위하여 다음과 같이 NCDF_LIST 명령을 사용합니다.


NCDF_LIST, file, /VARIABLES


이 명령에 의하여 출력된 결과는 다음과 같습니다.


 data/KOMPSAT_2A/gk2a_ami_le1b_ir112_ko020lc_202002280300.nc

     # dimensions: 2

     # Variables: 1

     # Global attributes: 33

     There are no unlimited dimensions.

 

     Variables

           0  image_pixel_values: UINT(900,900) = UINT(dim_x,dim_y)


이 정보에 의하면 변수는 1개이고 그 변수가 바로 900x900의 구조를 갖는 배열 데이터임을 알 수 있습니다. 이것이 결국 이미지 데이터에 해당되며 그 명칭은 'image_pixel_values'입니다. 따라서 나중에 이 배열 데이터를 추출할 때 이 명칭을 이용할 것입니다. 그리고 위의 출력 내용을 보면 전역속성(Global Attribute)이 33개의 항목들로 구성되어 있음을 확인할 수 있습니다. 그래서 이 전역속성들의 세부 내용을 살펴보기 위하여 다음과 같이 NCDF_LIST 명령을 한번 더 사용합니다.


NCDF_LIST, file, /GATT


이 명령에 의하여 출력된 결과는 다음과 같습니다.


     Global Attributes

           0  _NCProperties: version=1|netcdflibversion=4.4.1.1|hdf5libversion=1.8.14

           1  projection_type: lambert_conformal_conic

           2  standard_parallel1: 30.000000

           3  standard_parallel2: 60.000000

           4  origin_latitude: 38.000000

           5  central_meridian: 126.00000

           6  false_easting: 0.0000000

           7  false_northing: 0.0000000

           8  image_width: 900

           9  image_height: 900

          10  pixel_size: 2000.0000

          11  upper_left_easting: -899000.00

          12  upper_left_northing: 899000.00

          13  upper_right_easting: 899000.00

          14  upper_right_northing: 899000.00

          15  lower_left_easting: -899000.00

          16  lower_left_northing: -899000.00

          17  lower_right_easting: 899000.00

          18  lower_right_northing: -899000.00

          19  _CoordinateTransformType: 0.0000000

          20  _CoordinateAxisTypes: 0.0000000

          21  file_name: gk2a_ami_le1b_ir112_ko020lc_202002280300.nc

          22  origianl_sourece_file: gk2a_ami_le1b_ir112_ela020ge_202002280300.nc

          23  number_of_columns: 900

          24  number_of_lines: 900

          25  total_pixel_data_size: 810000

          26  channel_center_wavelength: 11.2

          27  channel_spatial_resolution: 2.0

          28  data_processing_center: NMSC

          29  data_processing_mode: operation

          30  file_format_version: 1.0.0_20181120

          31  instrument_name: AMI

          32  satellite_name: GK-2A


이와 같이 총 33종의 정보들이 출력되는데, 이들 중에는 잠시후 표출 작업에 있어서 중요한 단서가 되는 것들이 여럿 있습니다. 가장 눈에 띄는 것은 projection type 정보인데 값을 보면 'lambert_conformal_conic'입니다. 즉 LCC 투영법 기반의 격자 데이터임을 알 수 있습니다. 그 외에도 지도 투영법과 관련된 정보들 및 기타 여러가지 중요한 정보들이 있습니다. 그래서 이후의 작업에서 중요하게 사용될 변수 및 속성 항목들을 골라서 다음과 같이 IDL에서 사용 가능하도록 배열 또는 변수의 형태로 가져옵시다. 각 항목에 대해서는 이후의 표출과정에서 자세히 살펴보겠습니다.


id = NCDF_OPEN(file)

NCDF_VARGET, id, 'image_pixel_values', img

HELP, img

NCDF_ATTGET, id, 'origin_latitude', latc, /GLOBAL

NCDF_ATTGET, id, 'central_meridian', lonc, /GLOBAL

NCDF_ATTGET, id, 'standard_parallel1', latsp1, /GLOBAL

NCDF_ATTGET, id, 'standard_parallel2', latsp2, /GLOBAL

PRINT, lonc, latc, latsp1, latsp2

NCDF_ATTGET, id, 'upper_left_easting', x_ul, /GLOBAL

NCDF_ATTGET, id, 'upper_right_easting', x_ur, /GLOBAL

NCDF_ATTGET, id, 'upper_left_northing', y_ul, /GLOBAL

NCDF_ATTGET, id, 'lower_left_northing', y_ll, /GLOBAL

PRINT, x_ul, x_ur, y_ul, y_ll

NCDF_ATTGET, id, 'image_width', nx, /GLOBAL

NCDF_ATTGET, id, 'image_height', ny, /GLOBAL

NCDF_ATTGET, id, 'pixel_size', dx, /GLOBAL

NCDF_ATTGET, id, 'pixel_size', dy, /GLOBAL

PRINT, nx, ny, dx, dy

NCDF_ATTGET, id, 'file_name', fname, /GLOBAL

NCDF_CLOSE, id

HELP, fname

fname = STRJOIN(STRING(fname))

PRINT, fname


이와 같이 꽤 많은 항목의 정보들을 추출하면서 각 항목의 내용을 출력도 하도록 하였습니다. 그러면 바로 표출 과정으로 진행하겠습니다. 이 과정에서는 투영법에 맞는 지도를 먼저 그리고 그 위에 이미지 데이터를 중첩하여 표출하는 것입니다. 먼저 지도를 그리는 과정은다음과 같습니다.


limit = [29, 114, 47, 138]

win = WINDOW(DIMENSIONS=[600600], /NO_TOOLBAR)

m = MAP('Lambert Conformal Conic', LIMIT=limit, $

  STANDARD_PAR1=latsp1, STANDARD_PAR2=latsp2, $

  CENTER_LONGITUDE=lonc, CENTER_LATITUDE=latc, $

  HORIZON_LINESTYLE=0, HORIZON_THICK=2, $

  Font_Size=11, CLIP=0, MARGIN=0.08, /CURRENT)

m.MapGrid.GRID_LONGITUDE = 5

m.MapGrid.GRID_LATITUDE = 5

m.MapGrid.LINESTYLE = 2

m.MapGrid.LABEL_POSITION = 0


이와 같이 LCC 투영법의 지도를 표출하기 위하여 MAP 함수를 사용하였습니다. 그리고 지도 표출을 위하여 필요한 인자값들을 키워드에 부여하였습니다. 중심점의 경도 및 위도에 해당되는 변수들인 lonc, latc 그리고 Standard Paralell에 해당되는 두 위도값에 해당되는 변수들인 latsp1, latsp2이 사용되었습니다. 그리고 지도의 경위도 범위를 적절히 설정하기 위하여 limit를 사용하였습니다. 여기서 경도 범위를 114~138, 위도 범위를 29~47로 설정한 것은 나중에 중첩할 이미지 데이터의 커버리지를 고려한 것입니다. 여기서 다음과 같이 MAPCONTINENTS 함수를 사용해서 대륙경계선도함께 표출해봅시다.


mc = MAPCONTINENTS(/HIRES, COLOR='orange')


일단 여기까지의 표출 결과는 다음 그림과 같습니다.



이제 이미지 데이터를 지도위에 중첩시킬 차례입니다. 이 과정에서 염두에 두어야 할 것은, 지도의 투영법이 LCC이기 때문에 위 그림과 같이 등위도선이 굴곡진 형태인데 이미지 데이터는 거리 기반의 격자 분포를 하기 때문에 표출을 하게되면 이러한 지도 위에서 사각형의 형태를 갖게 됩니다. 즉 경위도 격자선과 나란한 형태가 아니라는 것입니다. 그래서 중첩 표출을 위해서는 이러한 부분이 고려되어야 하는데, 제가 예전에 'GRIB 포맷의 파일을 읽고 데이터를 표출하기'라는 제목으로 올렸던 게시물에서 소개했던 방식과 방법적으로 거의 유사합니다. 따라서 이 게시물에서 소개했던 방법론을 이용하도록 하고 관련된 자세한 설명은 생략하겠습니다. 일단 내용은 다음과 같습니다.


xs = FINDGEN(nx)*dx+x_ul

ys = FINDGEN(ny)*dy+y_ll

ctnum = COLORTABLE(67, /REVERSE)

im = IMAGE(REVERSE(img, 2), xs, ys, RGB_TABLE=ctnum, $

  GRID_UNITS=1, /OVERPLOT)


여기서는 먼저 거리 기반의 X 방향 격자점 좌표들로 구성된 배열 xs와 Y 방향에 해당되는 배열 ys를 구성하였습니다. 이 과정에서는 앞서 NCDF_ATTGET 명령을 사용하여 추출한 거리 기반 좌표와 관련된 인자값 변수들이 사용되었습니다. 그리고 이미지 데이터에 해당되는 배열인 img는 앞서 NCDF_VARGET 명령을 사용하여 추출한 것입니다. 다만 이미지 배열의 경우 한가지 주의할 점은 원본 데이터 배열의 경우 위아래가 뒤집어져있다는 것입니다. 그래서 IMAGE 함수에 투입할 때에는 REVERSE 함수를 사용하여 Y축 방향을 기준으로 뒤집는 처리를 하였습니다. 그리고 IMAGE 함수에서 또 한가지 유의할 부분은 표출 대상인 이미지 배열의 격자들이 거리 기반이기 때문에 GRID_UNITS 키워드를 1로 설정해야 한다는 것입니다. 컬러테이블은 67번을 컬러테이블을 뒤집어서 사용하였습니다. 이와 같은 과정을 거치면 이미지 데이터가 지도상에 중첩되어 표출됩니다. 다만 이미지를 중첩해버리면 앞서 표출했던 대륙경계선이 덮여지기 때문에, MAPCONTINENTS 함수를 나중에 사용하여 대륙경계선이 나중에 그려지도록 해야 합니다.


mc = MAPCONTINENTS(/HIRES, COLOR='orange')


이렇게 하면 표출 결과는 다음 그림과 같습니다.



그리고 앞서 NCDF_ATTGET 명령을 사용하여 추출한 파일명 정보에 해당되는 문자를 다음과 같이 TEXT 함수를 사용하여 상단에 표시할 수도 있습니다.


tx = TEXT(0.5, 0.94, fname, COLOR='blue', ALIGNMENT=0.5, $

  FONT_SIZE=14, /NORMAL)


이렇게 하면 결과는 다음 그림과 같습니다.



그리고 만약 0번 컬러테이블을 사용한다면 흑백계열의 색상으로 표출할 수도 있습니다. 이를위해서는 위에서 변수 ctnum의 값을 0으로 바꿔주면 됩니다. 그러면 다음과 같은 그림을 얻게 됩니다.



일단 오늘은 여기까지 하겠습니다. 다음 회차에서는 동아시아 영역 데이터를 표출해보기로 하겠습니다.


LIST