台风是重大灾害性天气,台风引起的直接灾害通常由三方面造成,狂风、暴雨、风暴潮,除此以外台风的这些灾害极易诱发城市内涝、房屋倒塌、山洪、泥石流等次生灾害。正因如此,台风在科研和业务工作中是研究的重点。希望这次台风路径可视化可以给予大家一点点帮助。
台风路径的获取
中国气象局(CMA)
中国气象局(CMA)的台风最佳路径数据集(BST),BST是之后对历史台风路径进行校正后发布的,其经纬度、强度、气压具有更高的可靠性,但是时间分辨率为6小时,部分3小时,这一点不如观测数据。下载地址:
http://tcdata.typhoon.org.cn/
温州台风网
温州台风网的数据是实时发布数据的记录,时间分辨率最高达1小时,对于台风轨迹具有更加精细化的表述。下载地址:
http://www.wztf121.com/
示例
导入模块并读取数据,使用BST的2018年台风路径数据作为示例,已经将原始的txt文件转换为xls文件。
import os, glob import pandas as pd import numpy as np import shapely.geometry as sgeom import matplotlib.pyplot as plt from matplotlib.image import imread from matplotlib.animation import FuncAnimation import matplotlib.lines as mlines import cartopy.crs as ccrs import cartopy.feature as cfeat from cartopy.mpl.ticker import LongitudeFormatter,LatitudeFormatter import cartopy.io.shapereader as shpreader import cartopy.io.img_tiles as cimgt from PIL import Image import warnings warnings.filterwarnings('ignore') df = pd.read_csv('./2018typhoon.csv')
定义等级色标
def get_color(level): global color if level == '热带低压' or level == '热带扰动': color='#FFFF00' elif level == '热带风暴': color='#6495ED' elif level == '强热带风暴': color='#3CB371' elif level == '台风': color='#FFA500' elif level == '强台风': color='#FF00FF' elif level == '超强台风': color='#DC143C' return color
定义底图函数
def create_map(title, extent): fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) url = 'http://map1c.vis.earthdata.nasa.gov/wmts-geo/wmts.cgi' layer = 'BlueMarble_ShadedRelief' ax.add_wmts(url, layer) ax.set_extent(extent,crs=ccrs.PlateCarree()) gl = ax.gridlines(draw_labels=False, linewidth=1, color='k', alpha=0.5, linestyle='--') gl.xlabels_top = gl.ylabels_right = False ax.set_xticks(np.arange(extent[0], extent[1]+5, 5)) ax.set_yticks(np.arange(extent[2], extent[3]+5, 5)) ax.xaxis.set_major_formatter(LongitudeFormatter()) ax.xaxis.set_minor_locator(plt.MultipleLocator(1)) ax.yaxis.set_major_formatter(LatitudeFormatter()) ax.yaxis.set_minor_locator(plt.MultipleLocator(1)) ax.tick_params(axis='both', labelsize=10, direction='out') a = mlines.Line2D([],[],color='#FFFF00',marker='o',markersize=7, label='TD',ls='') b = mlines.Line2D([],[],color='#6495ED', marker='o',markersize=7, label='TS',ls='') c = mlines.Line2D([],[],color='#3CB371', marker='o',markersize=7, label='STS',ls='') d = mlines.Line2D([],[],color='#FFA500', marker='o',markersize=7, label='TY',ls='') e = mlines.Line2D([],[],color='#FF00FF', marker='o',markersize=7, label='STY',ls='') f = mlines.Line2D([],[],color='#DC143C', marker='o',markersize=7, label='SSTY',ls='') ax.legend(handles=[a,b,c,d,e,f], numpoints=1, handletextpad=0, loc='upper left', shadow=True) plt.title(f'{title} Typhoon Track', fontsize=15) return ax
定义绘制单个台风路径方法,并绘制2018年第18号台风温比亚。
def draw_single(df): ax = create_map(df['名字'].iloc[0], [110, 135, 20, 45]) for i in range(len(df)): ax.scatter(list(df['经度'])[i], list(df['纬度'])[i], marker='o', s=20, color=get_color(list(df['强度'])[i])) for i in range(len(df)-1): pointA = list(df['经度'])[i],list(df['纬度'])[i] pointB = list(df['经度'])[i+1],list(df['纬度'])[i+1] ax.add_geometries([sgeom.LineString([pointA, pointB])], color=get_color(list(df['强度'])[i+1]),crs=ccrs.PlateCarree()) plt.savefig('./typhoon_one.png') draw_single(df[df['编号']==1818])
定义绘制多个台风路径方法,并绘制2018年全年的全部台风路径。
def draw_multi(df): L = list(set(df['编号'])) L.sort(key=list(df['编号']).index) ax = create_map('2018', [100, 180, 0, 45]) for number in L: df1 = df[df['编号']==number] for i in range(len(df1)-1): pointA = list(df1['经度'])[i],list(df1['纬度'])[i] pointB = list(df1['经度'])[i+1],list(df1['纬度'])[i+1] ax.add_geometries([sgeom.LineString([pointA, pointB])], color=get_color(list(df1['强度'])[i+1]),crs=ccrs.PlateCarree()) plt.savefig('./typhoon_multi.png') draw_multi(df)
定义绘制单个台风gif路径演变方法,并绘制2018年第18号台风的gif路径图。
def draw_single_gif(df): for state in range(len(df.index))[:]: ax = create_map(f'{df["名字"].iloc[0]} {df["时间"].iloc[state]}', [110, 135, 20, 45]) for i in range(len(df[:state])): ax.scatter(df['经度'].iloc[i], df['纬度'].iloc[i], marker='o', s=20, color=get_color(df['强度'].iloc[i])) for i in range(len(df[:state])-1): pointA = df['经度'].iloc[i],df['纬度'].iloc[i] pointB = df['经度'].iloc[i+1],df['纬度'].iloc[i+1] ax.add_geometries([sgeom.LineString([pointA, pointB])], color=get_color(df['强度'].iloc[i+1]),crs=ccrs.PlateCarree()) print(f'正在绘制第{state}张轨迹图') plt.savefig(f'./{df["名字"].iloc[0]}{str(state).zfill(3)}.png', bbox_inches='tight') # 将图片拼接成动画 imgFiles = list(glob.glob(f'./{df["名字"].iloc[0]}*.png')) images = [Image.open(fn) for fn in imgFiles] im = images[0] filename = f'./track_{df["名字"].iloc[0]}.gif' im.save(fp=filename, format='gif', save_all=True, append_images=images[1:], duration=500) draw_single_gif(df[df['编号']==1818])
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 《暗喻幻想》顺风耳作用介绍
- 崔健1985-梦中的倾诉[再版][WAV+CUE]
- 黄子馨《追星Xin的恋人们2》HQ头版限量编号[WAV+CUE]
- 孟庭苇《情人的眼泪》开盘母带[低速原抓WAV+CUE]
- 孙露《谁为我停留HQCD》[低速原抓WAV+CUE][1.1G]
- 孙悦《时光音乐会》纯银CD[低速原抓WAV+CUE][1.1G]
- 任然《渐晚》[FLAC/分轨][72.32MB]
- 英雄联盟新英雄安蓓萨上线了吗 新英雄安蓓萨技能介绍
- 魔兽世界奥杜尔竞速赛什么时候开启 奥杜尔竞速赛开启时间介绍
- 无畏契约CGRS准星代码多少 CGRS准星代码分享一览
- 张靓颖.2012-倾听【少城时代】【WAV+CUE】
- 游鸿明.1999-五月的雪【大宇国际】【WAV+CUE】
- 曹方.2005-遇见我【钛友文化】【WAV+CUE】
- Unity6引擎上线:稳定性提升、CPU性能最高提升4倍
- 人皇Sky今日举行婚礼!电竞传奇步入新篇章