解析雨量を Pythonで読み、作図する (試作版)


気象庁の解析雨量 (2006年以降) のデータを、Python で読み、 Python のパッケージ「Cartopy」をつかって地図上に作図するプログラムを作成した。

結果の画像の例 (2022年9月18日 日本時間 21:00 の1時間雨量)

rr202209182100jst.png


序論

解析雨量とはなにかについては、その開発にかかわった人の著書のうちの 解析雨量のところ (数ページ) を見てほしい。

気象庁の解析雨量のデータ形式は、2005年のぶんまでは独自の形式、 2006年からはWMO (世界気象機関) できめられた GRIB 第2版 (GRIB2 ともいわれる) である。

解析雨量の値は、本来、1時間降水量 (mm/h) である。 (30分間隔のばあいも、その時刻までの1時間の降水量である。) しかし、有効数字があまり多くないので、1バイト (8ビット) で表現できる 0〜255のレベルでおきかえられ、 さらに、となりどうしの画素の値が同じであるばあいに連長 (run length) 法によって圧縮されている。

わたしはこれまで解析雨量のデータを GrADS というソフトウェアであつかってきたが、 GrADSで読むためには、連長圧縮をといた中間ファイルをつくらなければならない。 ウェブ検索したら、GRIB2 形式の解析雨量データを Python で中間ファイルをつくらずに読んで作図するプログラム例が みつかったので、それにならってやってみることにした。

[補足] このウェブページをつくりはじめるまえの作業の覚え書き


データを地図上に作図するプログラム

ここでのプログラム例文は、GRIB2 形式が採用された 2006 年以後のデータを対象としている。 2005年以前の気象庁独自形式には対応していない。

GRIB2形式のデータでは、日時は世界時 (UTC) であたえられているが、 利用者は日時を日本標準時 (JST) であたえられるようにし、 図には UTC と JST の両方の日時を表示するようにした。 画像ファイル出力のファイル名には JST をつかい、それを明示するようにした。 (Python の datetime パッケージの機能をつかった。)

【[2023-09-12 補足] JST をつかわずに UTC のままあつかいたいばあいもある。 その例として、UTC の 1日 (0時から24時まで) の降水量を積算して表示するプログラム例を追加した。】

数値レベルと図の色わけとの関係は、draw_a_contour_map 関数の中の levels と colors という リスト変数のなかみで指定している。現在あたえている色のくぎりの数値レベルはつぎのとおり。 (あまり深く考えたものではなく、ためしに表示した値がおさまるようにした。)

解析雨量の値が欠損になっているばあいは、関数 load_jmara_grib2 の中であたえる値は (@vcpf さんのプログラムをひきついだので) -10 である。 メインプログラムで、降水量の値を 0.1 mm 単位から mm 単位になおすために 10 でわっているので、 欠損をあらわす値は -1 になる。表示の際はこれを考慮に入れる。 (いまの配色では、値が -1 (欠損) ならば薄い赤、0 (無降水) ならば白、0.4 (微量の降水) ならば薄い黄色としてある。)

【[2023-06-30 補足] matplotlib のバージョンによって、contourf の set_under, set_over が無効になってしまう ばあいがある。そのときは、levels の内容を上下にひろげ、colors に set_under, set_over で指定する色もふくめておく。 ku_map_3hourly.py では、そのばあいの変更点を「#*」ではじまるコメント行でふくめてある。】

図に日本語文字を表示するところで、MS Windows の日本語フォントを指定している。 他の OS では変更が必要だろう。

つかいかた

この例文を各自の目的にやくだてるには、 プログラムを編集して、文字を書きかえる必要がある。 (日時の情報は、人がキーボードからうちこむようにしたり、 別のファイルから読みこむようにすることもできるが、 そのための書きかえかたの説明は、まだ用意していない。)

計算機上でデータのある場所を指定する。

対象日時を指定する。

図形の表示さきを指定する。

対象地域を指定する。

改訂履歴

1時間ずつずれた3時間ごとの積算値を作図する [2023-06-30 追加]


時系列書き出しプログラム

[2021-06-03 追加, 2021-06-05 改訂, 2021-07-30 改訂]

解析雨量のGRIB2形式データを読みこむところは共通で、作図するのではなく、 地点をえらんで、その位置の降水量の値の時系列をテキストファイルに書き出すプログラムを試作している。 こちらは、Cartopy も matplotlib もつかわない。

まず、指定された緯度・経度にいちばん近い ます目 の降水量の1時間ごとの値を書き出すプログラムをつくった。

月単位の期間を指定して、その全部の日の全部の時刻の値を書き出すことにした。 ただし、年にまたがる期間は指定できない (それがほしいばあいは複数回にわけて実行する)。

つかいかた

主プログラムのはじめ (スクリプトの中では途中になるが、「##### Main Program #####」というコメントのはいった直後) の、 つぎの変数の値をあたえている代入文を、ほしい位置の緯度・経度に書きかえる。

すこしさきの「# 対象日付」というコメントのあとのつぎの変数の値をあたえている代入文を、 ほしい日付に書きかえる。

「datapath」という変数に代入する値を、自分がデータを置いたディレクトリ名に変える。

スクリプトを実行する。(Anaconda Powershell Propmpt ならば、 コマンドラインで「python ku_timeser_hourly_v20210602.py」)

出力データの形

つぎのようなテキストファイルができる。

日降水量の時系列書き出しプログラム

[2021-07-30] 時別値から日別値を集計するところでの欠損値のあつかいを改訂した。

指定された緯度・経度にいちばん近い ます目 の降水量の1日ごとの値を書き出すプログラムをつくった。

日本時間の0時から翌日0時までの集計値である。 欠損値は単純に集計に入れない。 (もし観測されていたとしたら、降水量はもっと大きかった可能性がある。) 集計につかわれた有効な観測値の個数を書き出しておく。

作業手順は1時間ごとの値を書き出すプログラムと同様である。

結果のファイル名も同様で、hourly のかわりに daily である。

結果のファイルの列の意味はつぎのとおり。


時間降水量の領域平均値の時系列書き出しプログラム

[2021-06-18 追加, 2021-07-30 改訂]

緯度・経度座標の長方形領域で平均した降水量の1時間ごとの値を書き出すプログラムをつくった。 ひとまず バージョン1 を出しておく。今後、改訂する。

つぎのような不満がのこるプログラムである。

つかいかた

次のところを書きなおす。

スクリプトを実行する。(Anaconda Powershell Propmpt ならば、 コマンドラインで「python ku_areamean_hourly_v1.py」 [2021-06-19 訂正])

出力データの形

結果のファイル名は、たとえば 「rrhourly202006_09_lat36_250_35_750_lon138_750_139_750.txt」 のようにつけられる。 これは、2020年 6月から9月まで、 緯度 36.25度と35.75度の間、経度 138.75度と139.75度の間の値である。

結果のファイルの列の意味はつぎのとおり。

今後の作業についての構想

複数の地点の値がほしいとき、実行能率の面では、毎時の全国のデータを読むごとに 複数の地点の値を書き出すように、プログラムを改造したほうがよい。 ただし、そうするとプログラムがいくらか複雑になり、プログラム保守の面では、うまくないかもしれない。

領域平均を書き出すプログラムには上にのべたように不満があるので、改訂したい。


実行環境

ここにあげたプログラム例は、MS Windows 日本語版で実行することを想定し、Windows 10 上でつくっている。

Windows での実行は、Anaconda をインストールし、その中で Cartopy をいれたうえで、 Anaconda Powershell Prompt から「 python なになに.py 」で起動するか、 Anaconda といっしょにインストールされる Spyder に読みこんで実行するのがよさそうだ。 (わたしは Anaconda Powershell Prompt から実行している。)

[Windows で Pythonをつかう準備 (Anaconda, cartopy のインストール) と 実行]


標高の等高線を重ねる (2023-04-28 追加)

降水量と地形の関係をみるため、降水量と標高を同じ図に表示したいことがある。 ここでは、降水量の段彩 (contourf() による) と、標高の等高線 (contour() による) をかさねてみることにした。 例としてとった対象領域は、ここで「#関東」とした緯度経度範囲 (関東地方と中部地方の大部分をふくむ) である。 標高データは [地形 (標高) データを Pythonで読み、作図する (試作版)] であつかったのと同じ、 アメリカ合衆国の NOAA NGDC (現 NCEI) で編集された 世界の標高・水深データセット ETOPO1 からこの緯度経度範囲を切り出したものである。 【国土数値情報の「1 km メッシュ」もためしたのだが、この範囲の図にしめすにはそのままではこまかすぎ、 平滑化または間引きが必要なことがわかったので、ひとまず見送っている。】 プログラム例では、等高線を、標高 500 m 以上について、500 m 間隔にひいた。 海岸線と県境を黒の線でいれているので、等高線は赤にしてみた。

このプログラムでは、メインプログラムで標高データを配列 topo によみこむとともにその格子点の経度と緯度の配列 lontopo, lattopoを 用意し、この 3 つの配列を draw_a_coutour_map() にひきわたして、draw_a_contour_map() のなかの降水量の段彩のあとで 標高の等値線をひいている。

【なお、図の大きさを figure(figsize=(12,8)) (横 12インチ、縦 8インチの紙に相当) とし、それにあわせて あちこちの fontsize を調整した。 ただし、このウェブページにおさめる際には width を指定して縮小表示している。】

rrdaily20220923_kanto_topo.png


参考にした情報源

【ウェブ上でキーワード検索をかけたり、それで見つかったものからいもづる式にたどったりして、 ブログ記事などかなり多くの記事をながめたうえで読むものをえらんだのだが、 qiita.com のページを参照したものがわりあい多い。 このサイトはたしかに有用な記事があるが、このサイトの記事がみんな信頼できるわけでもない。】

解析雨量 (GRIB2形式) のデータの解読は、つぎのウェブページのプログラム例によった。

https://qiita.com/vpcf/items/b680f504cfe8b6a64222#%E8%A7%A3%E6%9E%90%E9%9B%A8%E9%87%8F%E3%82%92python%E3%81%A7%E8%AA%AD%E3%81%BF%E3%81%9F%E3%81%84
@vcpfが2020年07月19日に更新
気象庁解析雨量(GRIB2形式)をPythonで扱う

これは作図に、matplotlib にくわえて Basemap というパッケージをつかっている。 しかし、Basemap は開発終了し、その開発者は Cartopy への移行を勧めている。

Cartopy を利用した作図は、つぎのウェブページのプログラム例を参考にして、前のプログラム例を書きかえた。

https://qiita.com/wm-ytakano/items/1e6a5d250fe0d079b08e
@wm-ytakanoが2021年02月14日に更新
PythonでGSMのGPVデータから気温の水平分布を描画する

都道府県境界を入れるところは、つぎのウェブページのプログラム例 (中国の「省」「自治区」の境界を入れるものだが)を参考にして、 Natural Earth というウェブサイトにある行政区境界の地理データをつかっている。 (ただし、2022-11-07 の改訂で、Cartopy の機能で自動的に読みこむのをやめ、 あらかじめダウンロードして編集した境界データをつかうことにした。)

https://geocat-examples.readthedocs.io/en/latest/gallery/Overlays/NCL_overlay_11b.html
GeoCAT-examples
NCL_overlay_11b.py
(C) Copyright 2021, University Corporation for Atmospheric Research. Revision 4e24dbc1.

2021-04-27 .. 2021-06-05, 2021-06-18, 2021-06-19, 2021-07-01, 2021-07-30, 2022-11-07, 2023-02-18, 2023-04-28, 2023-06-30, 2023-09-12
増田 耕一 (MASUDA Kooiti)
[計算機を利用した気象分野の実習の教材] [教材目録ページ] [日本語入り口ページ] [ホームページ]
[卒論生ゼミ・3年生ゼミのページ]