気象庁が観測しているMSM(メソモデル)データを気象、海洋データなどを描画することを得意とするGrADSで描画したいと思います。
この記事を書くに至った経緯として、MSM(NetCDF)データをCTLファイルを作成し開くと変な値になるため、いろいろ調べたのでまとめようと思いました。
方法としてGrADSでsdfopenする方法とCTLファイルを作成してopenする方法があります。
データ取得
本記事では、京都大学の気象庁データを利用させていただきます。
オリジナルのMSMデータは、国際気象通報式FM92 GRIB 二進形式格子点資料気象通報式(第2版)というデータ形式になっていますが、京都大学の気象庁データはNetCDFファイルに変換されているので、直接GrADSで描画できます。
NetCDFファイル形式に変換されたMSMデータはこちらです。
MSM-Pが気圧面データでMSM-Sが地表面データです。
より最新のデータはこちらにあります。
拡張子がncのファイルがNetCDFファイルです。
wgetコマンドで取得しましょう。
$ wget http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/latest/20220524/MSM2022052400P.nc
上では、2022年5月24日の00UTC初期値の気圧面データであるMSMデータを取得しています。
MSMデータは、気圧面と地表面と2つありましたが、本記事では、気圧面データで進めていきます。
GrADS取得
GrADSをインストールするには、バイナリファイルをダウンロードする必要がありますが、バージョンを意識しない場合やとりあえず使う場合、ターミナル上でsudo apt install gradsで取得することができます。(Ubuntu)
$ sudo apt install grads
方法1:sdfopen
実行
今回取得したデータは、NetCDFファイルという形式のファイルです。
GrADSでは、NetCDFファイルを簡単に開くコマンドが搭載されています。
それが、sdfopenコマンドです。引数にファイルを指定することで簡単に開き、描画することができます。
ga-> sdfopen MSM2022052400P.nc
Scanning self-describing file: MSM2022052400P.nc
SDF file MSM2022052400P.nc is open as file 1
LON set to 120 150
LAT set to 22.4 47.6
LEV set to 1000 1000
Time values set: 2022:5:24:0 2022:5:24:0
E set to 1 1
ga->
方法2:open
CTLファイルを作成する方法です。
通常、バイナリファイルをGrADSで開く場合、CTLファイルを作成し、読み込む必要があります。
CTLファイルを作成します。
CTLファイル作成
DSET ^MSM2022052400P.nc
DTYPE netcdf
TITLE XXX
UNPACK scale_factor add_offset
OPTIONS yrev
XDEF 241 LINEAR 120 0.125
YDEF 253 LINEAR 22.4 0.1
ZDEF 16 LEVELS 1000 975 950 925 900 850 800 700 600 500 400 300 250 200 150 100
TDEF 12 LINEAR 00Z24MAR2022 3hr
VARS 6
z=>zg 16 t,z,y,x Geopotential Height m
w=>w 16 t,z,y,x Vertical Wind Pa/s
u=>u 16 t,z,y,x Zonal wind m/s
v=>v 16 t,z,y,x meridional wind m/s
temp=>temp 16 t,z,y,x temperature K
rh=>rh 16 t,z,y,x relative humidity %
ENDVARS
重要なポイントとして、
- DTYPE netcdf
- UNPACK scale_factor add_offset
- OPTIONS yrev
です。
DTYPE netcdf
NetCDFファイルをopenで読み込む際、DTYPE netcdfと設定する必要があります。
これで、GrADSに単純バイナリファイルではなく、NetCDFファイルを読みますよと指定しています。
UNPACK scale_factor add_offset
MSM(NetCDF)データでは、scale_factorとadd_offsetという係数で圧縮されたファイルデータとなっています。
ncdump -h ファイル名で確認しましょう。
$ ncdump -h MSM2022052400P.nc
netcdf MSM2022052400P {
dimensions:
lon = 241 ;
lat = 253 ;
p = 16 ;
time = 12 ;
variables:
.......
short rh(time, p, lat, lon) ;
rh:scale_factor = 0.002293577883 ;
rh:add_offset = 75. ;
rh:long_name = "relative humidity" ;
rh:units = "%" ;
rh:standard_name = "relative_humidity" ;
// global attributes:
:Conventions = "CF-1.0" ;
:history = "created by trans_latest_msm_p.rb 2022-05-24" ;
}
それぞれの変数にscale_factorとadd_offsetが設定されていることが分かるかと思います。
上の図のrh:scale_factor rh:add_offset
データとscale_factor,add_offsetとの関係は次のように表せます。
$$y=scale\_factor \times x + add\_offset$$
Yが本来のデータ(float型)でXが圧縮されたデータ(short型)です。
設定しない場合、Xの部分である圧縮されたデータが出力され、変な値となってしまいます。
UNPACK scale_factor add_offsetと設定することで圧縮されたデータから解凍した非圧縮データが出力されるようになります。
scale_factor add_offsetの値の決め方は、こちらのサイトで詳しく書かれています。
上のncdumpコマンドの結果から分かる通り、この二つの係数によりfloat型の値がshort型の値となり、データが圧縮されます。
OPTIONS yrev
MSMデータの中身を見ると、緯度が高緯度から低緯度に向かって格納されていることが分かります。
$ ncdump -v lat MSM2022052400P.nc
......
data:
lat = 47.6, 47.5, 47.4, 47.3, 47.2, 47.1, 47, 46.9, 46.8, 46.7, 46.6, 46.5,
46.4, 46.3, 46.2, 46.1, 46, 45.9, 45.8, 45.7, 45.6, 45.5, 45.4, 45.3,
45.2, 45.1, 45, 44.9, 44.8, 44.7, 44.6, 44.5, 44.4, 44.3, 44.2, 44.1, 44,
43.9, 43.8, 43.7, 43.6, 43.5, 43.4, 43.3, 43.2, 43.1, 43, 42.9, 42.8,
42.7, 42.6, 42.5, 42.4, 42.3, 42.2, 42.1, 42, 41.9, 41.8, 41.7, 41.6,
41.5, 41.4, 41.3, 41.2, 41.1, 41, 40.9, 40.8, 40.7, 40.6, 40.5, 40.4,
40.3, 40.2, 40.1, 40, 39.9, 39.8, 39.7, 39.6, 39.5, 39.4, 39.3, 39.2,
39.1, 39, 38.9, 38.8, 38.7, 38.6, 38.5, 38.4, 38.3, 38.2, 38.1, 38, 37.9,
37.8, 37.7, 37.6, 37.5, 37.4, 37.3, 37.2, 37.1, 37, 36.9, 36.8, 36.7,
36.6, 36.5, 36.4, 36.3, 36.2, 36.1, 36, 35.9, 35.8, 35.7, 35.6, 35.5,
35.4, 35.3, 35.2, 35.1, 35, 34.9, 34.8, 34.7, 34.6, 34.5, 34.4, 34.3,
34.2, 34.1, 34, 33.9, 33.8, 33.7, 33.6, 33.5, 33.4, 33.3, 33.2, 33.1, 33,
32.9, 32.8, 32.7, 32.6, 32.5, 32.4, 32.3, 32.2, 32.1, 32, 31.9, 31.8,
31.7, 31.6, 31.5, 31.4, 31.3, 31.2, 31.1, 31, 30.9, 30.8, 30.7, 30.6,
30.5, 30.4, 30.3, 30.2, 30.1, 30, 29.9, 29.8, 29.7, 29.6, 29.5, 29.4,
29.3, 29.2, 29.1, 29, 28.9, 28.8, 28.7, 28.6, 28.5, 28.4, 28.3, 28.2,
28.1, 28, 27.9, 27.8, 27.7, 27.6, 27.5, 27.4, 27.3, 27.2, 27.1, 27, 26.9,
26.8, 26.7, 26.6, 26.5, 26.4, 26.3, 26.2, 26.1, 26, 25.9, 25.8, 25.7,
25.6, 25.5, 25.4, 25.3, 25.2, 25.1, 25, 24.9, 24.8, 24.7, 24.6, 24.5,
24.4, 24.3, 24.2, 24.1, 24, 23.9, 23.8, 23.7, 23.6, 23.5, 23.4, 23.3,
23.2, 23.1, 23, 22.9, 22.8, 22.7, 22.6, 22.5, 22.4 ;
では、CTLファイルのYDEFをYDEF 253 47.6 -0.1と設定したくなりますが、GrADSでは、低緯度から高緯度に読み込まれることを想定しているらしくエラーメッセージが出ます。
そこでOPTIONSにyrevと設定します。
そうすることで、高緯度から低緯度にデータを読んでくれます。
その他の記述は、通常のCTLファイルの書き方と同じです。
実行
CTLファイルを読み込むにはopenコマンドです。
$ open MSM-P.ctl
Data file MSM2022052400P.nc is open as file 1
LON set to 120 150
LAT set to 22.4 47.6
LEV set to 1000 1000
Time values set: 2022:5:24:0 2022:5:24:0
E set to 1 1
ga->
まとめ
以上、NetCDFファイルのMSMデータを開く方法でした。
地表面データも同様にすれば描画できます。
方法
- sdfopen
- open
openの場合、CTLファイルを作成する。
以下の3点に注意して作成する。
- DTYPE netcdf
- UNPACK scale_factor add_offset
- OPTIONS yrev
GrADSのCTLファイル設定について詳しく書かれたサイトはこちら