Pythonの描画|ウェザーレーダーとさまざまなレーダー画像の視覚化方法のエントリーレベルの説明

ウェザーレーダー入門

気象レーダーは、大気検出に特別に使用されるレーダーです。これは、アクティブなマイクロ波大気リモートセンシング機器です。
気象レーダーは、特に突然の悲惨な監視、予測、警告において、気象観測にとって重要な機器であり、小規模な気象システム(台風や嵐の雲など)の主要な検出ツールです。 1。
中国で私たちが目にし、使用している最も一般的な気象レーダーは、新世代のドップラー気象レーダー(CINRAD)です。気象局などの建物の屋上で見た球形の建物のほとんどは、この種のレーダーに属しています。この種のレーダーは、反射率、ドップラー半径速度、スペクトル幅などの基本的な気象要素を検出して、短期的なスケールでの気象予測と早期警告のデータサポートを提供できます。特にレーダー反射率データは、強い対流気象システムに直接関連しているため、ほとんどの人が使用します。
日常のビジネス科学研究では、レーダーデータの多くの用途があります。たとえば、レーダーデータを数値モデルの同化に使用して、数値モデルのより正確な初期フィールドを提供できます。レーダー反射率データに基づくレーダー短期予測システムは、次の2時間でレーダー検出範囲内の強い対流気象を予測できます。たとえば、 Eye Control Technology **によって独自に開発された深層学習に基づくAI対流ナウキャスティングシステムは、レーダー反射率データを使用して、次の2時間の強い対流気象を正確に予測します。見てみると、以下の予測は確かに非常に効果的です。

ウェザーレーダーの動作原理

ウェザーレーダーのデータ構造を理解するには、まずレーダーがどのように機能するかを知る必要があります。そのため、関連する知識をもう一度意図的に学びました。興味のある友人もご覧ください。[学習リソース|レーダー気象学コース(南新大学関係者)](http://mp.weixin.qq.com/s?__biz=MzA3MDQ1NDA4Mw==&mid=2247485348&idx=1&sn=91b72b34404a4e1b67d1a1a56abe63af&chksm=9f3dd988a84a509e12d8483a2da7ceb0135451ed3914cccc70601a07e2f71446a31dd9faf2d5&scene=21#wechat_redirect)
レーダーには主に次のスキャン形式があります。

一般的に、ビジネスにおける従来のレーダーのスキャン方法はVPPIです。スキャン中、レーダーアンテナは、セルフスキャンモードで最小の仰角から開始し、一定の仰角でゼロ度の方位角から開始します(ドップラーウェザーレーダーの作業プロセス中、北は0°方位角、真東は90°方位角、水平面に平行なアンテナは0°仰角、水平面に垂直な場合は90°仰角です。)アンテナを時計回りに回転させ始め、方位角で単層仰角を完成させます。スキャンは、電磁波を継続的に送受信しながら、反射率、半径方向のドップラー速度、スペクトル幅、および基本的なレーダー製品を生成するために必要なその他の気象要素を記録します。
単層仰角スキャンが完了した後、対応するボディスキャンモードでレーダーアンテナを次の仰角に上げ、指定したすべての仰角のスキャンが完了するまで上記のプロセスを続行します。
スキャンが完了した後、実際に取得するのは、さまざまな仰角での気象要素の完全な円です。三次元空間の観点からは、レーダーサイトを固定点とした傾斜角の異なる円錐面であり、レーダーの三次元観測を構成します。次の図は、標高スキャンの1つの概略図です。

pythonを使用してCINRADレーダーデータを読み取ります

一般的には、pyartまたはwradlibを使用するか、レーダーデータ形式に従ってバイナリファイルを直接読み取ってから、レーダーデータをスムーズに読み取るために必要な処理を実行する必要があります。
幸い、中国で最も一般的な「CINRAD」レーダーデータ用に、@ CyanideCN教師がライブラリPyCINRADを開発しました。これにより、「CINRAD」データを簡単に処理および視覚化できます。 PyCINRADを使用すると、レーダーベースデータを xarray.Datasetとして簡単に読み取ることができます。

# 必要なパッケージをロードします
import math
import time
from itkwidgets import view
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np
from matplotlib import colors
from scipy.interpolate import griddata
import scipy.misc
import cartopy.crs as ccrs
import cartopy.feature as cfeat
import cinrad
import xarray as xr
from cartopy.mpl.gridliner import LATITUDE_FORMATTER, LONGITUDE_FORMATTER
from cinrad.io import CinradReader, StandardData
from cinrad.visualize import PPI,Section
from mayavi import mlab
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd
import plotly.express as px
%matplotlib inline

cinrad.io.CinradReaderを使用して、バイナリレーダーベースデータファイルを開きます

f =CinradReader("Z_RADR_I_Z9250_20200612054800_O_DOR_SA_CAP.bin")

含まれている製品の種類を表示する

f.available_product(0)

レーダースキャンの仰角を取得する

f.get_elevation_angles()

データタイプを表示

ele =0 #最初の仰角を選択します
radius =400 #描画画像範囲のサイズ(km単位)
r = f.get_data(ele,radius,"REF") #反射率データを選択
r

上記のコードを通じて、レーダーデータのストレージ構造を理解できます。各層のレーダー反射率データは、実際には2つの次元で構成されていることが直感的にわかります。 1つは、各レーダーが電磁波を放射する角度を表す方位角(azimuth)であり、もう1つは、レーダーの各観測点とレーダーステーションの間の距離を実際に表す距離(distance)です。 。実際、各レイヤーで取得したレーダー反射率データは、約360の光線と、各光線の1kmごとのポイントでの気象要素で構成される3次元の円錐面です。ここで、 PyCinradライブラリは、コーン上の各ポイントの特定の緯度、経度、高さの値を同時に計算します。これらの値を使用すると、2次元および3次元のカルテシアン座標でより便利に視覚化するのに役立ちます。

二次元の視覚化

xarray.Datasetを取得した後、それを視覚化するために単に cartopyを使用するのは自然なことです。

ref = r.REF

proj = ccrs.PlateCarree()#投影を作成し、cartopyのplatecarree投影を選択します
fig = plt.figure(figsize=(6,6))  #ページを作成し、サイズを自分で選択できます
ax = fig.subplots(1,1, subplot_kw={'projection': proj})  #サブグラフ

# 国境、海岸線、川、湖
ax.add_feature(cfeat.BORDERS.with_scale('50m'), linewidth=0.8, zorder=1)
ax.add_feature(cfeat.COASTLINE.with_scale('50m'), linewidth=0.6, zorder=1)
ax.add_feature(cfeat.RIVERS.with_scale('50m'), zorder=1)
ax.add_feature(cfeat.LAKES.with_scale('50m'), zorder=1)

gl = ax.gridlines(crs=ccrs.PlateCarree(),draw_labels=True,
 linewidth=1.2, color='k', alpha=0.5, linestyle='--')
gl.top_labels = False  #トップラベルを閉じる
gl.right_labels = False  #右のラベルを閉じる
gl.xformatter = LONGITUDE_FORMATTER  #x軸は経度形式に設定されます
gl.yformatter = LATITUDE_FORMATTER  #y軸は緯度形式に設定されます
color_max=int(ref.max())+1
color_min=int(ref.min())
n_gap=(color_max-color_min)/20

# cmap
levels = np.arange(color_min,color_max+n_gap,n_gap)
plt.contourf( r.longitude, r.latitude,ref,levels=levels,cmap='jet')
# カラーバー左下の幅と高さ
l =0.92
b =0.23
w =0.025
h =0.55
# lに対応,b,w,h;カラーバーの位置を設定します。
rect =[l,b,w,h] 
cbar_ax = fig.add_axes(rect) 
plt.colorbar( cax=cbar_ax)
plt.show()

PPIの視覚化

PyCinradライブラリに付属するいくつかの視覚化関数を使用して、PPIを直接視覚化することもできます。まず、ppiを描画する関数を定義します。
ヒント: cinrad.visualize.PPIを使用してPPIを直接視覚化します。場合によっては、黒い背景画像をレンダリングするためにセルを2回実行する必要があります。

def ppi_plot(data):
 fig =PPI(data,dpi=75,add_city_names=True)
 fig.plot_range_rings(radius, color='white', linewidth=1.0) #円を描く
 for i inrange(0,radius-30,50):
  fig.plot_range_rings(i, color='white', linewidth=1.0) #円を描く
 # 緯度と経度を設定する
 liner = fig.geoax.gridlines(draw_labels=True,linewidth=2, color='gray', alpha=0.5, linestyle='--') #緯度と経度の点線を設定する
 liner.top_labels = False
 liner.right_labels = False
 liner.xformatter = LONGITUDE_FORMATTER
 liner.yformatter = LATITUDE_FORMATTER
 liner.xlabel_style ={'size':18,'color':'red','weight':'bold'} #緯度、経度、色、フォントサイズなどを設定します。
 liner.ylabel_style ={'size':18,'color':'red','weight':'bold'}

レーダー放射率グラフを描く

ppi_plot(r)

レーダー反射率に加えて、 PyCinradには、垂直積分液体(VIL)、エコートップ(ET)、複合反射率(CR)などを計算する方法もあります。

エコートップの高さを描画

et = cinrad.calc.quick_et([f.get_data(i,400,'REF')for i in f.angleindex_r])ppi_plot(et)

垂直方向の累積液体水を引く

vil = cinrad.calc.quick_vil([f.get_data(i,400,'REF')for i in f.angleindex_r])ppi_plot(vil)

組み合わせた反射率を描画します

cr = cinrad.calc.quick_cr([f.get_data(i,400,'REF')for i in f.angleindex_r])

RHIの視覚化

毎日のレーダービジネスデータはRHIによってスキャンされないため、レーダーの垂直プロファイルを取得する場合は、「cinrad.calc.VCS」を選択して、描画する前にレーダーの垂直エコー強度を計算できます。

rl =[f.get_data(i,400,'REF')for i in f.angleindex_r]
vcs = cinrad.calc.VCS(rl)
sec = vcs.get_section(start_cart=(118.5,32.5), end_cart=(118.5,34)) #着信経度と緯度の座標
fig =Section(sec)

組み合わせチャートを描く

PyCinradは、PPIとRHIの組み合わせ図の描画も同時にサポートします

rl =[f.get_data(i,400,'REF')for i in f.angleindex_r]
vcs = cinrad.calc.VCS(rl)
sec = vcs.get_section(start_cart=(118.0,32.5), end_cart=(119.0,33.5)) #着信経度と緯度の座標

fig =PPI(rl[0],dpi=75,add_city_names=True)
fig.settings['is_inline']= False
fig.plot_range_rings(radius, color='white', linewidth=1.0) #円を描く
for i inrange(0,radius-30,50):
 fig.plot_range_rings(i, color='white', linewidth=1.0) #円を描く
    
fig.plot_cross_section(sec)  #垂直断面を描く
liner = fig.geoax.gridlines(draw_labels=True,linewidth=2, color='gray', alpha=0.5, linestyle='--') #緯度と経度の点線を設定する
liner.top_labels = False
liner.right_labels = False
liner.xformatter = LONGITUDE_FORMATTER
liner.yformatter = LATITUDE_FORMATTER
liner.xlabel_style ={'size':18,'color':'red','weight':'bold'} #緯度、経度、色、フォントサイズなどを設定します。
liner.ylabel_style ={'size':18,'color':'red','weight':'bold'}

3D視覚化

レーダーデータは曲面に分布していません。経度-緯度-高さのカルテシアン座標系では、第1層のPPIデータが3次元空間の円錐面に分布しているため、3次元で視覚化できます。

Matmatplotlibの3次元静的視覚化

fig = plt.figure()
ax =Axes3D(fig)  #3D描画スペースを作成する
X = r.longitude.values.flatten() #経度、緯度、高さ、反射率の値をppiで読み取り、それらを1次元に変換します
Y = r.latitude.values.flatten()
Z = r.height.values.flatten()
value = r.REF.values.flatten()
ax.scatter(X, Y, Z, c=value) #スキャッタプロットを描く

プロットの3次元動的視覚化

あなたは相互作用するためにjupyterにいる必要があります

# 経度、緯度、高さ、反射率を取り出します
X = r.longitude.values
Y = r.latitude.values
Z = r.height.values
value = r.REF.values
# 新しいデータフレームを作成し、散在する情報を保存します
df = pd.DataFrame({"lon":X.flatten(),"lat":Y.flatten(),"height":Z.flatten()/110,"dbz":value.flatten()})
df = df.dropna()  #ナンのポイントを削除します
# 生成された画像はドラッグできます
fig = px.scatter_3d(df, x='lon', y='lat', z='height',color='dbz')
fig.show()

最後に言いたいのは、この記事は非常に簡単な紹介であり、この分野の最初の垣間見ることしかできないということです。気象学の分野でのレーダーの応用は非常に豊富です。興味のある友人はレーダーの知識についてもっと学ぶことができます。しっかりとした基盤を築くのは常に正しいことです。これは南新大学の公式コースリンクです。必要な場合は、自分で受講してください。[学ぶリソース|レーダー気象学コース(南新大学公式)](http://mp.weixin.qq.com/s?__biz=MzA3MDQ1NDA4Mw==&mid=2247485348&idx=1&sn=91b72b34404a4e1b67d1a1a56abe63af&chksm=9f3dd988a84a509e12d8483a2da7ceb0135451ed3914cccc70601a07e2f71446a31dd9faf2d5&scene=21#wechat_redirect)

Recommended Posts

Pythonの描画|ウェザーレーダーとさまざまなレーダー画像の視覚化方法のエントリーレベルの説明
Python描画|さまざまな台風経路の視覚化方法
pythonがコンカレントメソッドをサポートする方法の詳細な説明