오늘은 grib 형식으로 되어있는 기상청 수치예측모델을 우리가 익숙한 형식인 txt와 netCDF로 변환하는 방법에 대해 소개해보도록 하겠다.
1. KWGRIB2 개요
기상청에서 생산, 제공하는 한국형수치예보모델, 수치모델 자료는 보통 GRIB2 형식으로 되어 있다. 기상청 자료를 처음 활용하거나 GRIB 형식의 파일을 다뤄보지 않은 사람들에게는 매우 생소한 형식일 텐데, GRIB2 형식 파일을 활용하기 위해서는 kwgrib2 프로그램이 필요하다.
kwgrib2는 리눅스 시스템에서 활용할 수 있으며, 기상청 날씨누리에서 해당 파일을 제공한다. 다운로드 링크는 아래 첨부해 두었다. 다운로드 받은 파일은 .tar로 압축되어 있을 텐데 압축을 풀고, 컴파일 하면 된다.
압축을 해제하는 건 해당 파일이 있는 위치에서 tar -xvf kwrib2.tar를 입력하면 된다. 그럼 파일 중에 makefile이 있을텐데, 이 파일을 열어서(vi makefile) 실행파일 생 성위치를 잡아주면 된다. 실행파일의 경로는 'bindir'라는 변수로 되어 있으니 이 부분을 수정하면 되고, 그 아래 'prog' 변수가 실행명이다. 저장하고 vi 편집기를 끝낸 뒤, make를 통해 컴파일 해주면 된다. 설치된 위치에서 kwgrib을 실행해도 되지만, bashrc나 bash_profile에서 환경변수를 설정하여 사용하는 것이 편리하다.
2. 사용법 및 변환
설치 후 명령창에 kwgrib2 라고 입력하면 아래와 같이 옵션들을 확인할 수 있다. 하지만 옵션이 너무 많아서 옵션에 대한 설명은 생략하도록 하고, 오늘은 netCDF 형식과 txt 형식으로 변환하는 법에 대해서만 다뤄보도록 하겠다. 기본적인 사용법은 >> kwgrib2 [옵션] [파일] 이다.
1) txt 변환
먼저, 간단한 txt로 변환부터 해보도록 하겠다. 예시로 활용한 자료는 기상자료개방포탈에서 다운로드한 1월 9일의 ldaps자료이다. 자료 다운로드 방법은 아래 링크의 이전 글을 참고하길 바란다.
txt로 변환하는 방법은 kwgrib2 [grib파일명] -text [txt새파일명] 과 같이 입력하면 된다. 원본 그립 파일이 l015_v070_erlo_unis_h000.2024010900.gb2 이고, 저장할 파일을 gribtest.txt라고 한다면, 아래와 같이 입력하면 된다.
kwgrib2 ./l015_v070_erlo_unis_h000.2024010900.gb2 -text gribtest.txt
그럼 데이터가 변환되는 결과들이 나오고 새파일이 저장된 것을 확인할 수 있다. 맨 오른쪽 사진이 gribtest.txt 파일이다.
- 특정변수만 변환 : -d 옵
특정 변수만 선택해서 변환할 수도 있다. 텍스트 저장 규칙에 따라 쭉 값들이 나열되어 있을텐데, 모든 격자, 모든 변수의 데이터가 전부 포함되어 있기 때문에 문서창의 길이가 꽤 클 것이다. 만약 해면기압만 따로 뽑아서 변환하고 싶다면 -d 옵션을 쓰면 된다. 기압 변수인 PRMSL은 변환결과에서 보면 128번 정보이다. 따라서 아래 코드와 같이 -d 128 옵션을 추가하면 된다. 그럼 아래와 같이 해면기압만 텍스트로 산출된 파일을 확인할 수 있다.
kwgrib2 ./l015_v070_erlo_unis_h000.2024010900.gb2 -d 128 -text gribtest_prmsl.txt
- 여러변수를 선택하여 변환 : -match 옵션
특정 변수 또는 여러 변수를 선택해서 변환활 때는 -match 옵션을 사용하면 된다. 만약 해면기압과 기온을 선택해서 뽑고 싶다면, -match 옵션과 해면기압인 PRMSL, 기온인 TMP 변수를 함께 입력해주면 된다. match 옵션을 입력하는 방법은 ""를 활용하고 변수간 구분은 |로 한다. 따라서 -match "PRMSL:|TMP" 와 같이 입력하면 된다.
kwgrib2 ./l015_v070_erlo_unis_h000.2024010900.gb2 -match "PRMSL:|TMP" -text ttt.txt
2) netCDF 변환
수치모델자료는 netcdf형식을 더 많이 활용하기에 netCDF로 변환하는 것이 더 편리하다. 사용방법은 동일하다. -test 를 -netcdf로만 바꿔 쓰면 된다. 마찬가지로 기압과 기온만 추출하도록 해보겠다. 명령어는 아래 그림 및 코드블럭과 같이 입력하면 된다.
kwgrib2 ./l015_v070_erlo_unis_h000.2024010900.gb2 -match "PRMSL:|TMP" -netcdf nctest.nc
그럼 아래 그림과 같이 생산된 nc파일을 확인할 수 있으며, ncview 파일을 확인해보면 위도, 경도와 함께 TMP_1_5maboveground, PRMSL_meansealevel, TMP_surface를 확인할 수 있다. match 옵션 자체가 해당 키워드가 포함된 변수를 모두 추출하는 것이기 때문에 지표면 1.5m, 표면의 TMP와 평균해수면의 PRMSL이 추출되었다. 변수명 뒤의 텍스트들은 면 정보이다. 해양모델이 수층별 정보를 생산하는 것처럼 기상모델도 고도에 따른 연직면의 높이이다.
3. 추가활용 - CDO를 활용한 특정 변수 추출 및 시간(time) 병합
이번에는 GRIB 형식의 파일의 특정 변수를 추출하여 병합하는 과정에 대해 다뤄보겠다. 기상자료개방포탈에서 받은 수치모델자료들은 보통 시간단위로 쪼개져 있다. 자료 활용 측면에서 파일단위로 쪼개져 있는 것 보다는 하루단위 또는 특정 기간단위로 병합하는 것이 좋을 수 있다. 따라서, 시간단위의 GRIB파일 원본에서 특정 변수들만 추출하여 일단위의 netcdf 파일로 병합하는 과정에 대해 설명해보도록 하겠다.
먼저, 특정 변수만 추출해서 netcdf로 변환하는 과정은 위에서 설명했으니, 생략하도록 하겠다. 또한, 원본정보에서 추출할 항목은 내가 주로 활용하는 기압, 풍속(U, V), 강수량, 기온, 습도만 대상으로 하였다. 각 항목별 변수 이름은 PRMSL, UGRD, VGRD, APCP, TMP, RH이며, 연직면은 지표면 또는 지표면과 가장 가까운 면을 대상으로 하였다.
1) for문으로 전체 파일 변환하기
24시간, 24개의 파일을 for문을 통해 변환한다. 예시로 든 데이터는 1월 9일의 시간단위 ldaps자료이다. 따라서 0시(h000)부터 23시(h023)까지 총 24개 파일을 변환해야 한다. bash 스크립트에서 for문은 "for 변수 in 리스트" 로 활용한다. 따라서 아래 코드처럼 for 문을 구성한다.
>> for time in 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023
>> do
>> kwgrib2 -netcdf l015_v070_erlo_unis_h${time}.2024010900.nc l015_v070_erlo_unis_h${time}.2024010900.gb2 -match "(APCP:|UGRD:|VGRD:|PRMSL:|TMP:1.5|RH:)"
>> done
2) CDO mergetime으로 시간별정보 병합하기
그럼 각 시간대별 nc파일이 생성되고, 이제 이 파일들을 CDO를 통해 병합하면 된다. 각 시간대별 nc파일은 해상도와 포함된 변수가 동일하므로 시간단위만 병합하면 되는데 이때는 mergetime을 활용한다. 또한, 2024010900이란 날짜 및 시간정보가 포함된 모든 파일을 병합할 것이므로 *를 활용하여 아래와 같이 입력한다.
>> cdo mergetime l015_v070_erlo_unis_h*.2024010900.nc l015-conv2nc_2024010900.nc
CDO의 mergetime 활용법은 "cdo mergetime 원본파일 새파일"이다. 만약 A, B, C라는 파일의 시간을 병합하여 D라는 파일을 만들 경우에는 cdo mergetime A B C D처럼 입력하면 된다. 마지막에 입력하는 항목이 생성되는 파일이라고 이해하면 된다.
그 외 코드 활용성을 높이기 위해 '2024010900'이란 날짜를 date란 변수로 바꾸어서 활용해도 되고, 중간에 생성되는 중간생성물을 모두 지워주는 코드를 추가해도 된다. 전체 코드는 아래와 같다.
#!/bin/bash
source ~/.bash_profile
ddate=20240109
dd=`date -d ${ddate} +%Y%m%d`
export HH=00
export YYYYMMDDHH=${dd}${HH}
export date=${YYYYMMDDHH}
for time in 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023
do
kwgrib2 -netcdf l015_v070_erlo_unis_h${time}.${date}.nc l015_v070_erlo_unis_h${time}.${date}.gb2 -match "(APCP:|UGRD:|VGRD:|PRMSL:|TMP:1.5|RH:)"
done
cdo mergetime l015_v070_erlo_unis_h*.${date}.nc l015-conv2nc_${date}.nc
#rm -f l015_v*.nc
그럼 아래와 같이 24시간의 데이터가 변환된 1월 9일의 기상수치모델 자료를 확인할 수 있다. 오른쪽 결과물을 확인해봐도 24시간 정보와 각 변수가 모두 포함되있는것을 확인할 수 있다.
'자료분석 및 코딩 > 기타 해양, 기상 정보 및 분석툴' 카테고리의 다른 글
[해양기술사 기출문제 풀이] 132회 1교시 - 1. 해상기준면과 육상기준면 (1) | 2024.11.10 |
---|---|
[해양기술사 시험정보] 시험일정, 난이도, 대우 및 전망 (4) | 2024.11.07 |
[기타 - CDO] 2. NetCDF 날짜 및 시간 자르기 seltimestep (0) | 2023.08.18 |
[기타 - CDO] NetCDF 분석 가공 - 1. 수치 모델 및 예측 데이터 처리 프로그램 CDO 개요 (0) | 2023.08.17 |
[기타 - 쉘] 해양수치모델 하이컴 다운로드 3 - 과거 자료 다운로드 자동화 (0) | 2023.08.16 |