일반적으로 접하는 excel, csv 파일에 비해, 수치모델자료는 크기가 큼 : 수치모델자료는 기상자료개방포털에서 다운로드할 수 있으며, 그 방법은 자신이 원하는 데이터를 조회하여 담은 뒤(①~③), 마이페이지에서 자료를 신청하면,E-mail이나 SNS로 FTP계정의 일시적인 ID/PW를 부여 받음 이 FTP 서버를 활용하여 데이터 다운로드 가능(④)함
수치예보모델 종류 (출처: 기상청 수치모델관리실)
국지예보모델 이해(출처: 국가기상슈퍼컴퓨터센터)
##지역예보모델(RDAPS)
지역예보모델(UM 12kmL70)의 공간 해상도는 12km이며, 연직으로 약 80km까지 70층으로 구성되며, 3시간 간격으로 전지구예보모델로부터 경계장을 제공받아 1일 4회(00, 06, 12, 18UTC) 87시간 예측을 수행함
지역예보모델은 4차원 변분자료 동화 기법을 이용하여 6시간 간격의 분석-예측 순환 체계로 운영되고 있으며, 지역예보모델의 산출자료는 등압면, 모델면, 단일면 자료 3종류가 제공되고, 데이터 형식은 WMO에서 제시한 GRIB2 형식으로 제공함
## 국지예보모델(LDAPS)
국지예보모델(UM 1.5kmL70)의 공간 해상도는 1.5km이며, 연직으로 약 40km까지 70층으로 구성되며, 3시간 간격으로 전지구모델로부터 경계장을 제공받아 1일 8회(00, 06, 12, 18UTC : 36시간 예측, 03, 09, 15, 18UTC : 3시간 예측) 수행함
국지예보모델은 3차원 변분자료 동화 기법을 이용하여 각각의 자체 분석 - 예측 순환 체계로 운영하고 있으며, 국지예보모델의 산출자료는 등압면, 모델면, 단일면 자료 3종류가 제공되며, 데이터 형식은 WMO에서 제시한 GRIB2 형식으로 제공함
수치예보모델의 종류 및 비교자료(출처: 국가기상슈퍼컴퓨터센터)
#GRIB1/GRIB2
GRIB는 수치모델에서 산출되는 격자자료를 WMO의 표준규격에 따라 Binary 형식으로 구성된 데이터로, 데이터의 정보와 그 자체를 동시에 압축 저장이 가능하여 저장과 시간 측면에서 효과적임 (기상) 대기/해양에서 많이 사용함(netCDF(. nc) 파일도 많이 사용함)
##GRIB1/GRIB2 데이터 읽기
grib파일을 가장 쉽게 읽는 방법은 pygrib 라이브러리 활용 (xarray 또한 가능)
import pygrib
FILE = './Data/l015v070erlounish000.2020102900.gb2'
grbs = pygrib.open(FILE)
for g in grbs : # 해당 데이터의 어떤 변수들이 있는 확인가능
print(g)
"print(g)" 출력결과 일부
모델자료 중 일기도 묘화를 위해 Pressure reduced to MSL 활용 단위는 Pa이나, (지상) 일기도에서는 hPa 사용함으로 (÷) 100 하여 단위 환산 적용 (1 hPa = 100 Pa)
grb = grbs.select(name= "Pressure reduced to MSL")[0]
data = grb.values/100 # 입력자료 단위는 Pa임으로 일기도묘화를 위해 hPa로 변환
lat, lon = grb.latlons()
1. 일기도 묘화
## 라이브러리 불러오기
import pygrib
import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import scipy.ndimage as ndimage
## 필요한 데이터 읽기
FILE = './Data/l015v070erlounish000.2020102900.gb2'
grbs = pygrib.open(FILE)
grb = grbs.select(name= "Pressure reduced to MSL")[0]
data = grb.values/100
data = ndimage.gaussian_filter(data, sigma=5, order=0)
lat, lon = grb.latlons()
ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img() # 지도의 배경그림을 설정
ax.set_extent([122,131.1,43,33])
ax.coastlines('50m')
cs =ax.contour(lon, lat, data,levels = np. arange(1000.,1250.,2.), colors ="black")
ax.clabel(cs, inline=True, fontsize=8)
ax.gridlines(crs =ccrs.PlateCarree(), draw_labels= True)
plt.show()