背景内容
前几日,发展生成于南海本土的今年我国首个秋台风摩羯(Yagi)先后登陆菲律宾吕宋岛、我国海南省文昌市、广东省徐闻县以及越南广宁省,给海南造成的经济损失远超2014年超强台风“威马逊”,成为自1949年以来登陆我国的最强秋台风。摩羯在超强台风级别维持时间长达64小时,最大风速17级以上(68米/秒),中心最低气压为905百帕,对我国造成重大影响。
对此,我们简单的用再分析资料来研究一下台风摩羯的生成发展与路径走向。本篇只简单的记录分析一下其相关气象要素场的演变和路径变化。
数据下载
ERA5再分析资料的下载地址:ERA5 hourly data on pressure levels from 1940 to present (copernicus.eu)
ERA5 hourly data on single levels from 1940 to present (copernicus.eu)
可视化与计算
对于台风摩羯,我们可以先看看海平面气压场和850hpa的涡度场的演变,代码如下。
以下用海平面气压的动图为例,涡度也是一样的:
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from matplotlib.animation import FuncAnimation
#库的导入
df=xr.open_dataset(r"D:\Pangu-Weather-ReadyToGo\Test-Data\mslp-10mU-10mV-2mT-2024.09.01-08.24h.nc")
slp = df.msl.loc[:, :, :]#导入海平面气压数据
slp = slp / 100 # hpa#换算单位
lon,lat,time=slp['longitude'][:],slp['latitude'][:],np.array(slp['valid_time'][:])
time_list=[str(i)[:-10] for i in time]#构建时间序列
# 设置绘图范围
extent = [80, 140.1, 0, 45.1]
#创建子图
fig = plt.figure(figsize=[6, 4])
proj = ccrs.SouthPolarStereo()#设置投影
ax = fig.add_subplot(111,projection=ccrs.PlateCarree())
# 初始化colorbar为None
colorbar = None
# 绘图函数
def plot_frame(idx):
global colorbar
ax.clear() # 清空当前图像
#---开始绘图---
ax.set_extent(extent, crs=ccrs.PlateCarree())
ax.coastlines('50m', linewidth=1.2)
ax.add_feature(cfeature.NaturalEarthFeature('physical', 'land', '50m', edgecolor='k', facecolor='None'), zorder=2,
alpha=0.5)
# 绘制格网线
gl = ax.gridlines(draw_labels=True, lw=1, color='k', alpha=0.5, ls='--')
gl.top_labels = False
gl.right_labels = False
# 绘制海平面气压等值线
current_spl = slp.isel(valid_time=idx)
cair1 = ax.contourf(lon, lat, current_spl, extend='both', levels=np.arange(990, 1021, 1),
cmap='jet', transform=ccrs.PlateCarree())
# 更新colorbar
if colorbar is None:
colorbar = fig.colorbar(cair1, ax=ax, orientation='vertical', fraction=0.046, pad=0.04)
else:
colorbar.remove() # 移除旧的colorbar
colorbar = fig.colorbar(cair1, ax=ax, orientation='vertical', fraction=0.046, pad=0.04)
# 时间标题
ax.set_title(f'Mean SLP - {str(time[idx])[:-10]}', fontsize=10, pad=5)
# 创建动画
ani = FuncAnimation(fig, plot_frame, frames=len(time_list), repeat=False)
# 保存动画
ani.save('Mojie_animation-slp.gif', writer='ffmpeg', fps=4)
以下为结果展示:
台风路径
接下来我们再对台风的路径进行确定,即地面的海平面气压最低值中心对应的经纬度格点。本篇未加其他限制条件,实际上还需要850hpa-200hpa厚度、最大风速、850hpa涡度等限制条件。
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
#库的导入
df=xr.open_dataset(r"D:\Pangu-Weather-ReadyToGo\Test-Data\mslp-10mU-10mV-2mT-2024.09.01-08.24h.nc")
slp = df.msl.loc[:, :, :]#导入海平面气压数据
slp = slp / 100 # hpa#换算单位
lon_need,lat_need,time=slp['longitude'][:],slp['latitude'][:],np.array(slp['valid_time'][:])
time_list=[str(i)[:-10] for i in time]#构建时间序列
lon_array,lat_array=[],[]
for date_judge in time_list[0:-1:3]:
slp_need=slp.loc[date_judge, 35:0, 90:160]#气压
lon_need, lat_need = slp_need.longitude, slp_need.latitude
if np.min(slp_need) <= 995:
slp_n = np.array(slp_need) # array化
# 找到初始最低气压位置-台风初始位置
min_index = np.unravel_index(np.argmin(slp_n), slp_n.shape) # 将扁平索引转换为二维索引,适用于slp的形状
# 根据索引找到对应的经纬度
min_lat = np.array(lat_need[min_index[0]])
min_lon = np.array(lon_need[min_index[1]])
lon_array.append(min_lon)
lat_array.append(min_lat)
for i in range(len(lon_array)):
print(lon_array[i],lat_array[i])
# 设置绘图范围
extent = [98, 130.1, 9, 30.1]
fig = plt.figure(figsize=[6, 4])
proj = ccrs.SouthPolarStereo()
ax = fig.add_subplot(111,projection=ccrs.PlateCarree())
ax.set_extent(extent, crs=ccrs.PlateCarree())
ax.coastlines('50m', linewidth=1.2)
scale = '50m'
ax.add_feature(cfeature.LAND, facecolor='#c14a09',alpha=0.8) # 棕色陆地
ax.add_feature(cfeature.OCEAN, facecolor='cyan',alpha=0.9) # 浅蓝色海洋
# 绘制格网线
gl = ax.gridlines(draw_labels=True, lw=1, color='k', alpha=0.5, ls='--')
gl.top_labels = False
gl.right_labels = False
ax.plot(lon_array,lat_array,markerfacecolor='red',c='red',
marker='o',lw=0.5,ms=3)
plt.title('No.11 Typhoon Yagi track')
plt.show()
结果如下:这里对逐3小时的路径进行可视化。