気象庁のMSM解析値 (京大生存研のNetCDF版) を Python xarray で 読む

気象データとしては、観測値のほかに、 数値予報の初期値のためにつくられた格子点データがよくつかわれる。 初期値をつくるためには、観測値と(前の時刻の初期値からの)予報値とをくみあわせる 「データ同化」とよばれる技術がつかわれる。 観測値をとりこんで得られた格子点値を「解析値」あるいは「客観解析値」という。 それをそのまま初期値にするばあいと、 初期値にするまでにもう一段の処理があるので解析値と初期値とが区別されるばあいがある。

格子点データのファイル形式として、 気象庁では、WMOできめられた GRIB version 2 (GRIB2) という形式をつかっているが、 研究者は、アメリカの Unidata できめられた NetCDF という形式をつかっていることが多い。 ここでは、気象庁の MSM (メソスケールモデル) の解析値を、 京都大学 生存圏研究所で NetCDFに変換された形で、読むことにする。

[別のページ] では GrADS で読んだが、 ここでは、Python の xarray パッケージで読むことにする。


京大生存研にある MSM データ

京大生存研の「生存圏データベース」http://database.rish.kyoto-u.ac.jp の サーバーで公開されている気象庁MSMの格子点データには、 気象庁でつくられ、気象業務支援センターから GRIB2 形式で配信されたものと、 それを京大生存研で編集して NetCDF 形式にしたものがある。 (なお、全球モデル GSM の格子点データは、GRIB2 形式のものだけが置かれている。)

ここでは、NetCDF形式になったものを読む。 「生存圏データベース」→ 「グローバル大気観測データ」→ 「気象庁データ」→ 「解析値を中心に再構成したNetCDFデータ (MSM, RSM)」→ 「解析値を中心に再構成したNetCDFデータ (MSM, RSM)」[OpenDAPでないほう] と リンクをたどると、http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/netcdf/ に行く。

ここに、MSM-P と MSM-S のディレクトリがある。 MSM-P は気圧面 16層、MSM-S は地表面など 1層のデータをさしている。 それぞれの下に、「2002」から「2023」までの年 (4けた数字) のディレクトリがある。 たとえば「2002」の下をみると「0701.nc」から「1231.nc」までのファイルがある。 これは、2002年7月1日から2002年12月31日まで、1日ごとのデータで、 そこに、00 UTC から 23 UTC までの、MSM-S では 24時刻、MSM-P では 8時刻の値がふくまれている。

MSM-Sデータにはつぎの変数がふくまれる。 psea (海面気圧)、sp (モデル地表面気圧)、u (風速の西風成分)、v (風速の南風成分)、 temp (気温)、rh (相対湿度)、r1h (1時間降水量)、 ncld (雲量)、ncld_upper (上層雲量)、ncld_mid(中層雲量)、ncld_low (下層雲量)。 水平格子間隔は実際は緯度経度だが約 5 km である。 時間間隔は 1 時間だが、そのうち hour が 3の倍数の時刻は「初期値」、 他の時刻は予報値がはいっている。降水量はすべて予報値である。 観測値の情報がとりこまれるのは初期値がつくられるときである。

MSP-Pデータにはつぎの変数がふくまれる。 z (ジオポテンシャル高度)、w (鉛直p速度)、u (風速の西風成分)、v (風速の南風成分)、temp (気温)、rh (相対湿度)。 【ただし、w は、増田が 2023-06-30 までに見た 2022年のいくつかの日時の netCDF ファイルに関するかぎり、すべて 0 がはいっている。】 水平格子間隔は実際は緯度経度だが約 10 km (MSM-Sの格子のひとつおき)である。 時間間隔は 3 時間で、(2006年3月以降は) すべて初期値である。

(初期値・予報値の情報は http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/netcdf/README による。)


モデルの地表面の標高の情報

MSMモデルでつかっている地表面の標高 (ジオポテンシャル高度) を 格子点データの格子に内挿したものは、 http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/original/etc/ にある TOPO.MSM_5K である。 (同じディレクトリにある 「README(支援センター)_201406.txt」、 「README(支援センター)_201702.txt」の情報によった。) TOPO.MSM_5K のタイムスタンプは 2017年1月30日で、その他の時期も同じ値だったかどうかは未確認である。 (変化があっても数値としては小さなものらしいが)。 このファイルは netCDF でも GRIB でもなく 単純バイナリ (4バイト浮動小数点数、big endian) である。

このデータを、 [地形 (標高) データを Pythonで読み、作図する (試作版)] と 同様に Python で読み、そのうち (下にのべる) 「関東」領域の値を地図上に表示するプログラムを作成した。 【このプログラムは、Windows上 の Anaconda Power Shell で実行し、 savefig() で png 画像ファイルをつくった。Spyder での動作は未確認。】 【このプログラムは、contouf が cmap.set_under, cmap.set_over を認識して処理することを前提としている。 もし set_under, set_over が無効ならば リスト levels の下端に下限の値、上端に上限の値、 colors の下端と上端に色を追加して対処すればよい。】


Python で NetCDF を読むためのパッケージ

Python で NetCDFを読み書きするためのパッケージとしては、netcdf4 というものがある。 (この 4 は NetCDF の version 4 をさしている。) そのほかに、xarray というものがつくられ、これでも NetCDF を読むことができる。 xarray のほうが、読んだ結果が numpy の ndarray と互換性が高いようなので、 ここでは xarray をつかうことにする。

京大生存研で編集された気象庁 MSM の NetCDF を読んで作図するプログラム例として、 京大防災研の 榎本 剛 [たけし] 先生によるものがある。 これは MSM-P を読むものである。

ここでは、このプログラム例をもとに、MSM-P と MSM-S を読んで 地図上に作図するプログラム例をつくってみた。


ローカルマシンでのディレクトリ編成

ディレクトリ編成をつぎのようにしておき、 それにあわせてデータを配置する。 【このデータセットのファイル名は、MSM-S と MSM-P の区別や年の区別がつかないので、 とりちがえないように注意する。 NetCDFなので、ファイルの中に、変数名、格子数、対象日時などの情報はあるが。】

hamana (Linuxマシン) のばあい (2023-06-30)

/raid/jma_msm/ の下に、上記の netcdf_p, netcdf_s, topo ディレクトリがある。 netcdf_p, netcdf_s には、2011-01-01 から 2023-06-28 までのデータを置いた (ときどき更新する予定)。

/home/masudako/ex/msm の下に python プログラム例がある。「cp -p /home/masudako/ex/msm .」 として各自の作業ディレクトリをつくり、 「cd msm」「python3 map_msm_p_wind_kanto_topo.py」のように実行することを想定している。

Windowsパソコンのばあい

2023年1月の実習用に、2022年12月21日から2023年1月5日までのデータをダウンロードしてみた。 合計のデータ量は 約 5ギガバイトである。 (1日ぶんの MSM-P が 約 180 メガバイト、MSM-S が 約 135 メガバイトである。) このうち12月21日から12月25日までの5日ぶん (データ量 約 1.5 ギガバイト) を USB接続の外づけハードディスクで回覧し、各自コピーしてもらうことにした。

そのときの外づけハードディスクのルートディレクトリのトップの下に jma_msm があり、 その下に上記の netcdf_p, netcdf_s, topo があり、 またそれと並列に py があってそこにプログラム例を置いた。


気圧面や地表面での水平分布を地図上に作図するプログラム例

いずれも、日本語文字はコメントだけにふくまれ、その文字コードは UTF-8 になっている。

日付は「ds = 」の文のファイル名できまる。

ここでのプログラム例のならべかたは、 プログラムをつけたしていったなりゆきで、

と なっている。 しかし、これからはじめる人への参考としては、 下の 1ページに1時刻の画像だけを表示するプログラム例 を さきに見たほうがよいと思う。

「関東」領域は、北緯 34.5~38.5度、東経 136~141度。実際には中部地方もふくむ。

未解決の問題点

1ページに1時刻の画像だけを表示するプログラム例 [2023-06-05 追加]

こちらは Spyder の外でもだいたい適切なフォントサイズになる。 しかし plt.show() をつかう形のままである。

風と地形標高をかさねる (1ページに1時刻の画像だけを表示する) [2023-06-18 追加]


南北・鉛直断面を作図するプログラム例 [2023-02-10 追加]

MSM-P の 3次元格子データで、横に南北、縦に気圧をとった 2次元の等値線図をかき、色でぬりわける。

未解決の問題点

応用

lon と lat のたちばをいれかえれば、ひとつの緯度での東西・鉛直断面を作図することができる。


リンク集


2023-01-16, 2023-02-10, 2023-06-18, 2023-06-30, 2023-08-22
増田 耕一 (MASUDA Kooiti)
増田の個人サイトでの [計算機を利用した気象分野の教材のページ] [立正大学の授業用の教材ページ] [教材目録ページ] [日本語入り口ページ] [ホームページ]