再解析データ#

再解析データとは,比較的新しい予報モデルに対して過去の観測データを同化したものです。 数値天気予報においては,予報モデルに対して観測を同化した解析値が作成され,初期値として用いられています。 予報モデルは改良が重ねられていくため,解析値の品質はモデルの変遷と共に変化していきます。 データ同化手法も大きく進歩し,数十年前とは全く異なる手法が用いられています。 モデルやデータ同化手法の改良の影響を取り除くことにより,時間的により品質が安定したデータセットになります。 再解析とは,現業予報で一度行った解析を再びやり直すということを意味しています。

Caution

衛星データは世代間のセンサの品質の差やセンサの経年劣化が考慮されていますが,解析値は入力される観測データの種類や量にも影響を受けます。 品質を一貫させるため,大きな精度向上をもたらす衛星データを使わず従来型観測のみを同化したデータセット(JRA-55C[1],ERA-20C [2],20CRv3[3]) が作られています。

本書ではサイズが小さく入手が容易なNCEP/NCAR再解析[4]を用います。 NCEP/NCAR再解析は,京都大学生存圏研究所グローバル大気観測データや米国国立大気研究センター(NCAR)研究データアーカイブ等から入手可能です。

Note

より新しい再解析データセットとして3つあげておきます。

  • JRA-55[5]: 気象庁が作成した長期再解析。より長期のデータセット作成中でJRA-3Qが近日完了予定。

  • MERRA-2[6]: NASAによる衛星データを駆使した再解析

  • ERA-5[7]: 精度に定評があるECMWFが作成したデータセット。積雪深が過大[8]

!curl -O http://database.rish.kyoto-u.ac.jp/arch/ncep/data/ncep.reanalysis.derived/surface/slp.mon.mean.nc

NCEP/NCAR再解析データはNetCDF形式で提供されています。 NetCDFはデータと共に座標などのメタデータが一つのファイルの中に保存されています。 xarrayはnetcdf4ライブラリを使ってNetCDFファイルを読み書きすることができます。 データを読むにはxarray.open_dataset()を用います。

import numpy as np
import matplotlib.pyplot as plt
import xarray as xr


ds = xr.open_dataset("slp.mon.mean.nc")

dsを印字するとメタ情報が表示されます。

ds
<xarray.Dataset>
Dimensions:  (lat: 73, lon: 144, time: 904)
Coordinates:
  * lat      (lat) float32 90.0 87.5 85.0 82.5 80.0 ... -82.5 -85.0 -87.5 -90.0
  * lon      (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5
  * time     (time) datetime64[ns] 1948-01-01 1948-02-01 ... 2023-04-01
Data variables:
    slp      (time, lat, lon) float32 ...
Attributes:
    description:    Data is from NMC initialized reanalysis\n(4x/day).  These...
    platform:       Model
    Conventions:    COARDS
    NCO:            20121012
    history:        Thu May  4 18:12:35 2000: ncrcat -d time,0,622 /Datasets/...
    title:          monthly mean slp from the NCEP Reanalysis
    dataset_title:  NCEP-NCAR Reanalysis 1
    References:     http://www.psl.noaa.gov/data/gridded/data.ncep.reanalysis...

.sel()メソッドを用いると配列の添え字ではなく座標値を用いた選択ができます。 東経135度,北緯35度における8月の海面気圧の年々変動を調べてみましょう。 添え字は0から始まるので[7::12]となっていることに注意してください。

ds.slp.sel(lon=135, lat=35)[7::12].plot(figsize=[7,5])
plt.show()
_images/115190c03c60091f8ebe550de57202c585422934824570e4328d6ee813ad2921.png

Cartopy#

海面気圧を正射図法で描いてみます。 正射図法を用いると宇宙から見た地球や地球儀のように描かれます。 地図投影にはCartopyを用います。 CartopyはPython以外で書かれた外部ライブラリに依存しています。 自分のパソコンを使っている場合は,インストール方法付録を参考にしてください。 Google Colaboratoryの場合は!を使ってシェルを呼び出し,apt-getpipを使って依存ライブラリとCartopyをインストールします。

!apt-get install -qq libgdal-dev libproj-dev
!pip install cartopy

Caution

Google Colaboratoryで以下のようなエラーが出る場合はshapelyのバージョンがcartopyと整合していません。一旦shapelyをアンインストールしてソースからコンパイルします。

Geometry must be a Point or LineString
!pip uninstall --yes shapely
!pip install shapely --no-binary shapely
!pip install cartopy
  • 1行目: 地図投影が定義されているcartopy.crsccrsという名前でインポートします。

  • 5行目: 全球データを描画するとグリニッジ子午線や日付変更線で切れてしまうことがあります。cartopy.util.add_cyclic_pointを利用して経度方向が周期的になるように点を追加します。

  • 8行目: 投影をprojectionに指定します。 ccrs.Orthographic()は正射図法で衛星から地球を眺めたような投影法です。

  • 10行目: 周期的になるように点を追加した経度,緯度,データを与えて陰影付等値線をcontourf()で描きます。 projectionは用いる地図投影を指定するのに対し,描画関数に与えるtransformは,データが定義されている座標系を指定します。 地図投影は正射図法ですが,座標を経度緯度で与えているのでtransformPlateCarree()とします。 ccrs.PlateCarree()は標準緯度を赤道とした正距円筒図法で,経度と緯度をそのまま使います。

  • 11行目: 海岸線を描きます。

  • 12行目: 描画範囲を全球とします。

  • 13行目: カラーバーを描きます。

Caution

Cartopyは初めて必要となったときに海岸線等のデータをダウンロードします。サーバがダウンしているとデータが取得できないことがあります。 coastlines()はNatural Earthのshapefileを簡単に描くためのメソッドです。 CartopyはNatural Earth以外のデータを取得して描くことができます。 coastlines()がうまくいかないときは,その代わりにGSHHSのデータを使ってみましょう。 地図に描く部品をCartopyではfeatureと呼んでいます。 GSHHSFeature()add_feature()メソッドで追加することにより海岸線を描きます。

import cartopy.feature as cfeature

ax.add_feature(cfeature.GSHHSFeature())
import cartopy.crs as ccrs
from cartopy.util import add_cyclic_point


wdata, wlon = add_cyclic_point(ds.slp.sel(time="2020-12")[0], ds.lon)

fig = plt.figure(figsize=[9, 7])
ax = fig.add_subplot(111, projection=ccrs.Orthographic(135,35))

p = ax.contourf(wlon, ds.lat, wdata, transform=ccrs.PlateCarree())
ax.coastlines()
ax.set_global()
fig.colorbar(p)
plt.show()
_images/1bb79d858ae6e564e6e16395b26bdd4e0092e5d62305aecf8b190f4c0a002860.png

細かなパラメタを指定せずに簡単に使えように,NaturalEarthの陸LAND,海OCEAN,湖水LAKES等が定義されています。

  • 5行目: ccrs.LambertConformal()はランベルト図法を投影に指定します。中心となる経度と緯度を与えます。

  • 7~9行目: NaturalEarthの海,湖水,陸のデータを利用します。初回はデータをダウンロードするので,メッセージが表示されます。

  • 12行目: 等値線を指定するために4 hPa間隔で960から1036 hPaまでの配列を作りlevelsに与えます。等値線の色は黒にします。

  • 14行目: ax.clabel()メソッドを呼び,等値線ラベルを自動生成(manual=False)し,等値線上に配置(inline=True)します。

import cartopy.feature as cfeature


fig = plt.figure(figsize=[7,7])
ax = fig.add_subplot(111, projection=ccrs.LambertConformal(135,35))

ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.LAKES)
ax.add_feature(cfeature.LAND)
ax.coastlines()
p = ax.contour(wlon, ds.lat, wdata,
               levels=np.arange(960, 1040, 4), colors=["k"],
               transform=ccrs.PlateCarree())
ax.clabel(p, manual=False, inline=True)
ax.set_extent([90, 180, 0, 70], ccrs.PlateCarree())
ax.gridlines()
plt.show()
_images/d094f9eee4b503d7af2f25ca05f62ba06bdd33fe5b74ae74ce4c02db029ef53a.png

大陸上のシベリア高気圧とアリューシャン低気圧がコントラストが明瞭です。