#author("2023-11-01T15:53:51+09:00","external:moriat","moriat")
#author("2023-11-01T16:27:46+09:00","external:moriat","moriat")
#topicpath

** 気象庁合成レーダーデータ [#e7c3e7c1]
- 概要~
気象庁は合成レーダーデータを作成し、提供している。
-- [[気象庁情報カタログ 気象レーダー観測>https://www.data.jma.go.jp/add/suishin/cgi-bin/catalogue/make_product_page.cgi?id=Radar]]
-- [[気象業務支援センター>http://www.jmbsc.or.jp/jp/online/file/f-online30100.html]]
-- [[京都大学生存圏研究所>http://database.rish.kyoto-u.ac.jp/arch/jmadata/synthetic-original.html]]
- データの読み取り~
wgrib2 で netCDF 形式に変換してから読み込む。これを実行するには、Linux のような環境を用いることが一般的で、Windows で実現している例は少ない。本格的なデータを扱うためには、いずれは、Linux のような環境が必要になると考えられる。~
しかし、当面は、Windows マシンに何かをインストールすることはせずに、実行することにする。そこで、Google Colaboratory で wgrib2 を実行する。
*** 参考URL [#i59c78b2]
- 全般
-- 増田先生によるプログラム
--- [[解析雨量を Pythonで読み、作図する (試作版)>http://macroscope.world.coocan.jp/ja/edu/compex/kaiseki_uryo_python.html]]
--- [[全国合成レーダーデータを Pythonで読み、作図する (試作版)>http://macroscope.world.coocan.jp/ja/edu/compex/zenkoku_radar_python.html]]~
網羅的な情報が掲載されており、実行環境も含めてプログラムが示されている。まずは参照したいページ。地図は cartopy。
-- [[pythonでGRIB2形式のバイナリファイルからレーダーエコー強度画像を作成する(画像作成編)>https://qiita.com/kinosi/items/6f4f754f3f88f1fd74b4]]~
地図に basemap を使った場合。
-- [[気象庁の1kmメッシュ解析雨量GPV:GRIB2形式をpython:hvplotでレンダリングする>https://computational-sediment-hyd.hatenablog.jp/entry/2022/07/10/230000#:~:text=wgrib2%E3%81%AE%20windows%20%E3%81%A7%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95%EF%BC%882022%2F7%2F10%E6%99%82%E7%82%B9%EF%BC%89%20%E5%85%AC%E5%BC%8F%E3%82%B5%E3%82%A4%E3%83%88%20Climate%20Prediction%20Center%20-,Code%20and%20Compling%20Hints%20%E3%81%AE%20Source%20code%20%E3%82%88%E3%82%8A%E3%80%81%E3%80%8CWindows10%E3%80%8D-%E3%80%8Cv3.0.2%E3%80%8D%E3%81%A8%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E3%81%9F%E3%81%A9%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82]]~
hvplot による解析雨量の結果で、レーダーデータそのものでない。情報も豊富。地図は geoview。
- wgrib2
-- [[Windows環境でGRIB2形式データをCSV形式に変換する(ある地点のデータを抽出する)>https://ods.n-kishou.co.jp/tech/blog/detail/2869]]~
wgrib2 は、単にデータ形式の変換だけでなく、データの抽出にも使える。
-- [[Colaboratoryでwgrib2を使えるようにした>https://qiita.com/kogetaenoki/items/219c1d34cf1846452f79]]~
wgrib2 を Google Colaboratory で使うとき、wgrib2 を Google ドライブに保存する方法。
-- [[Colaboratoryを使ってブラウザ上だけで気象レーダー画像を作成する>https://qiita.com/kogetaenoki/items/2b50f627db3769280dce]]~
wgrib2 を Google Colaboratory で使う、というだけでなく、図にするまでの一連の流れ。
-- [[ecCodesに入ったGRIB2 Template 5.200/7.200サポートを用いてpygribで気象庁全国合成レーダーGPVを読む>https://zenn.dev/noritada/articles/grib2-template5_200-support-on-eccodes-pygrib]]~
grib2 という形式は、下位の仕様にバリエーションがあるために、grib2 用の python ライブラリ pygrib が使えるとは限らない。その辺の事情も含めて。
- データの解説
-- [[気象×Python 〜全国合成レーダー〜>https://qiita.com/OSAKO/items/ef042f80ec63dd288225]]~
エコー強度(降水強度と関連)、エコー頂高度の区別と、格納されているデータとの対応表。

** Google Colaboratory でのプログラミング概要 [#p3d1cd0f]
- Google Colaboratory で wgrib2 を動かすための準備~
~
Google Colaboratory は、Debian 系のLinux として動く。そこで、実行可能なwgrib2 を、作成して保存しておくことが考えられる。ところが、Google Colaboratory では、接続が切れると保存したファイルは削除される。そこで、Googleドライブに保存し、それを実行できるようにする。
まずは、通常のGoogleドライブとの混用が起こらないように、Google Colaboratory で使うツールを置く専用フォルダ Colab Env というフォルダを作る。
wgrib2 のファイルをその下で展開してコンパイル、設置する。~
~
Google Colaboratory から、Google ドライブをマウントする際、許可を求められる。許可する。~
~
この操作は、同じ環境(同じGoogle のID)を使っている間は、1度きりの実行で良い。~
~
#code(python){{
from google.colab import drive
drive.mount ('/content/drive') 

!mkdir -p /content/drive/MyDrive/ColabEnv/src
!mkdir -p /content/drive/MyDrive/ColabEnv/bin
!mkdir -p /content/drive/MyDrive/ColabEnv/DATA
%cd /content/drive/MyDrive/ColabEnv/src
!wget https://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz.v3.1.2
!tar xvzf wgrib2.tgz.v3.1.2
%cd grib2
%set_env CC gcc
%set_env FC gfortran
!make
!cp wgrib2/wgrib2 ../../bin/
!ls -l ../../bin/
}}
~
~
- 気象庁レーダーデータのダウンロード~
~
研究目的で、京大生存圏研究所からデータをありがたくダウンロードする。ダウンロードしたデータも、普通に使うと、毎回毎回、Google Colaboratory の接続が切れると削除されてしまう。そこで、通信負荷を減らすために、一度ダウンロードしたデータは、保存しておくようにする。
また、上記の wgrib2 を用いて、ダウンロードしたデータを読み取りやすい netCDF 形式に変換する。これを関数を使って実行する。~
~
次の操作は、Google Colaboratory の接続ごとに行う。一度行っておけば、Google Colaboratory との接続が切れるまでは、再び実行する必要はない。~
~
#code(python){{
from google.colab import drive
drive.mount ('/content/drive') 

import os
os.environ['PATH'] += ":/content/drive/MyDrive/ColabEnv/bin"
# print(os.environ['PATH'])
!chmod u+x /content/drive/MyDrive/ColabEnv/bin/wgrib2
}}
#code(python){{
def getradar(datehour, n10):
    datehour = str(datehour)
    n10 = str(n10)
    %cd /content/drive/MyDrive/ColabEnv/DATA
    !echo Z__C_RJTD_{datehour}{n10}000_RDR_JMAGPV__grib2.tar
    !if [ ! -e Z__C_RJTD_{datehour}{n10}000_RDR_JMAGPV__grib2.tar ]; then wget http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/jma-radar/synthetic/original/{datehour[0:4]}/{datehour[4:6]}/{datehour[6:8]}/Z__C_RJTD_{datehour}{n10}000_RDR_JMAGPV__grib2.tar; tar xf Z__C_RJTD_{datehour}{n10}000_RDR_JMAGPV__grib2.tar; fi
    !for f in *.bin; do if [ ! -e "${f%.bin}.ncdf" ]; then wgrib2 "$f" -netcdf "${f%.bin}.ncdf"; fi; done
}}
~
その後次のコマンドでファイルをダウンロードし、読み込みやすい netcdf 形式に変換できる。
#code(python){{
getradar(2023062102,2)
}}
この例では、2023年6月21日2時(UTC) の 10 分ごとのデータ( 0 〜 5 )のうち、3番目を取得している。~
~
取得したnetCDF 形式のファイルは、次のようにして確かめられる。
#code(python){{
# エコー強度のデータ
!ls *1km*.ncdf
# エコー頂高度のデータ
!ls *5km*.ncdf
}}
ファイ名とデータ名称の対応関係は、[[気象庁情報カタログ 気象レーダー観測>https://www.data.jma.go.jp/add/suishin/cgi-bin/catalogue/make_product_page.cgi?id=Radar]]にある。
|データ名称|ファイル名|h
|2.5kmメッシュ全国合成レーダーエコー頂高度GPV|Z__C_RJTD_yyyyMMddhhmmss_RDR_JMAGPV_Gll2p5km_Phhlv_ANAL_grib2.bin|
|1kmメッシュ全国合成レーダーエコー強度GPV|Z__C_RJTD_yyyyMMddhhmmss_RDR_JMAGPV_Ggis1km_Prr10lv_ANAL_grib2.bin|
|250mメッシュ全国合成レーダー降水強度 | Z__C_RJTD_yyyyMMddhhmmss_RDR_GPV_Ggis0p25km_Pri60lv_Aper5min_ANAL_grib2.bin.gz|

~
- レーダーデータの読み込み~
netCDF 形式のファイルを読み込む。~
-- 準備~
次のコードは、接続が切れるまで、一度だけ行えば良い。
#code(python){{
# 必要なライブラリを導入する。
# ! apt install python3-netcdf4 : これでは何故か使えない。
! pip install netCDF4 cartopy

# データがある場所に移動する。
%cd /content/drive/MyDrive/ColabEnv/DATA
}}
netCDF では変数名が重要である。ある特定の日時のデータを読み込み、netCDF のデータの変数名を抽出する。~
これは今後、実行する必要がない。
#code(python){{
## エコー頂高度
# netCDFファイルを開く
dataset = netCDF4.Dataset('Z__C_RJTD_20230621022000_RDR_JMAGPV_Gll2p5km_Phhlv_ANAL_grib2.ncdf')
# 変数名を表示する
variable_names = dataset.variables.keys()
print(variable_names)
# ファイルを閉じる
dataset.close()

## エコー強度
# netCDFファイルを開く
dataset = netCDF4.Dataset('Z__C_RJTD_20230706022000_RDR_JMAGPV_Ggis1km_Prr10lv_ANAL_grib2.ncdf')
# 変数名を表示する
variable_names = dataset.variables.keys()
print(variable_names)
# ファイルを閉じる
dataset.close()
}}
-- データの名前:
実行した結果、次のことがわかる。これは、ファイルからデータを引き出すために重要な情報になる。~
エコー頂高度のファイルの中のデータ名
 'latitude', 'longitude', 'time', 'var0_15_192_surface'
エコー強度のファイルの中のデータ名
 'latitude', 'longitude', 'time', 'var0_1_201_surface'
~
- 図を描く~
-- xarray と matplotlib を使った例~
これを使うと、netCDF4 はいらない。
#code(python){{
## エコー頂高度の図を描く
import xarray as xr
import matplotlib.pyplot as plt

# netCDFファイルを開く
dataset = xr.open_dataset('Z__C_RJTD_20230621022000_RDR_JMAGPV_Gll2p5km_Phhlv_ANAL_grib2.ncdf')

# データ変数、緯度と経度の値を取得する(例: 'var0_15_192_surface'はデータ変数の名前)
data = dataset['var0_15_192_surface']
lat  = dataset['latitude']
lon  = dataset['longitude']

# データをプロットする
plt.contourf(lon, lat, data[0,:,:], levels=20)  # 最初の時間スライスを描画(0は時間のインデックス)
plt.colorbar()           # カラーバーを追加
plt.xlabel('Longitude')  # 軸ラベル
plt.ylabel('Latitude')
plt.grid(True)           # グリッド

plt.show()               # プロットを表示

# ファイルを閉じる
dataset.close()
}}
-- netCDF, matplotlib, cartopy を使った例
#code(python){{
import netCDF4 as nc
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature

# netCDFファイルを開く
dataset = nc.Dataset('Z__C_RJTD_20230621022000_RDR_JMAGPV_Gll2p5km_Phhlv_ANAL_grib2.ncdf')

# データ変数を取得する(例: 'data_var'はデータ変数の名前)
data = dataset.variables['var0_15_192_surface']
lat  = dataset.variables['latitude'][:]
lon  = dataset.variables['longitude'][:]

# データをプロットする
# fig = plt.figure(figsize=(10, 6))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.contourf(lon, lat, data[0, ...], levels=20, transform=ccrs.PlateCarree(), cmap='jet')

# 世界地図を描画する
ax.add_feature(cfeature.COASTLINE, linewidth=0.5)
# ax.add_feature(cfeature.BORDERS, linewidth=0.5)

# プロットを表示する
plt.title('NetCDF Data with World Map')
plt.show()

# ファイルを閉じる
dataset.close()
}}
[[参照先>https://colab.research.google.com/drive/1jjgtFY4aT5wbDosBXCDWu9TRQSW0VC3u?usp=sharing]]

トップ   編集 差分 添付 複製 名前変更 リロード   新規 検索 最終更新   ヘルプ   最終更新のRSS