Python | 绘制台风动态路径图

文摘   2024-10-11 15:10   中国  

LXX

读完需要

2
分钟

速读仅需 1 分钟

前言:

台风(英语:Typhoon),属于热带气旋的一种。热带气旋是发生在热带或亚热带洋面上的具有暖心结构的低压涡旋,是一种强大而深厚的“热带天气系统”。最近飓风“米尔顿”登陆美国佛州已致美超百万户断电,超强台风会对所经过的路径周围人和环境造成很大影响,地信可以利用 arcgis 来绘制台风路径图,并在此基础上对台风周围的损害程度进行分析,或是预测台风路径。因此,本文先简单地分享一下绘制台风路径图的方法。

    各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)

1

   

台风路径数据获取

要想绘制台风路径图,就要先有数据。台风路径数据的获取一般可以从中国气象局(CMA)的台风最佳路径数据集(BST)获取,BST 是之后对历史台风路径进行校正后发布的,其经纬度、强度、气压具有更高的可靠性,但是时间分辨率为 6 小时,部分 3 小时,这一点不如观测数据。下载地址:(http://tcdata.typhoon.org.cn/ )
台风历史轨迹数据除了 BST 以外,还可以通过温州台风网进行查询。温州台风网的数据是实时发布数据的记录,时间分辨率最高达 1 小时,对于台风轨迹具有更加精细化的表述。下载地址:( http://www.wztf121.com/ )

以下是下载脚本,此部分来自公众号-气海无涯

台风数据下载脚本

洋流,公众号:气海无涯Python气象数据处理与绘图:常用气象数据下载—我国台风历史轨迹数据
import jsonimport urllib.requestimport xlwtimport datetimeimport os
# 设置浏览器参数headers = { 'Connection': 'Keep-Alive', 'Accept': 'text/html, application/xhtml+xml, */*', 'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3', 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
# 创建保存文件的目录output_dir = 'typhoon'if not os.path.exists(output_dir): os.makedirs(output_dir)
for year in range(2019, 2020): for num in range(1, 30): try: # 构建台风编号和URL number = str(year) + str(num).zfill(2) chaper_url = 'http://data.istrongcloud.com/v2/data/complex/' + number + '.json' req = urllib.request.Request(url=chaper_url, headers=headers) # 读取数据 data = urllib.request.urlopen(req).read() data = json.loads(data)[0] # 创建Excel文件 f = xlwt.Workbook(encoding='utf-8') sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True) # 写入Excel表头 headers = [ '台风编号', '中文名称', '英文名称', '时刻', '经度', '纬度', '强度等级', '气压', '风速', '风级', '移速', '移向', 'radius7', 'radius10', 'radius12', 'ne_7', 'se_7', 'sw_7', 'nw_7', 'ne_10', 'se_10', 'sw_10', 'nw_10', 'ne_12', 'se_12', 'sw_12', 'nw_12' ] for col, header in enumerate(headers): sheet1.write(0, col, header) # 写入台风数据 for i in range(0, len(data['points'])): point = data['points'][i] sheet1.write(i + 1, 0, data['tfbh']) sheet1.write(i + 1, 1, data['name']) sheet1.write(i + 1, 2, data['ename']) sheet1.write(i + 1, 3, str(datetime.datetime.strptime(point['time'], '%Y-%m-%dT%H:%M:%S'))) sheet1.write(i + 1, 4, point['lat']) sheet1.write(i + 1, 5, point['lng']) sheet1.write(i + 1, 6, point['strong']) sheet1.write(i + 1, 7, point['pressure']) sheet1.write(i + 1, 8, point['speed']) sheet1.write(i + 1, 9, point['power']) sheet1.write(i + 1, 10, point['move_speed']) sheet1.write(i + 1, 11, point['move_dir'])
# radius7, radius10, radius12 数据 sheet1.write(i + 1, 12, point.get('radius7', 'NaN')) sheet1.write(i + 1, 13, point.get('radius10', 'NaN')) sheet1.write(i + 1, 14, point.get('radius12', 'NaN'))
# radius7_quad 数据 radius7_quad = point.get('radius7_quad', {}) sheet1.write(i + 1, 15, radius7_quad.get('ne', 'NaN')) sheet1.write(i + 1, 16, radius7_quad.get('se', 'NaN')) sheet1.write(i + 1, 17, radius7_quad.get('sw', 'NaN')) sheet1.write(i + 1, 18, radius7_quad.get('nw', 'NaN'))
# radius10_quad 数据 radius10_quad = point.get('radius10_quad', {}) sheet1.write(i + 1, 19, radius10_quad.get('ne', 'NaN')) sheet1.write(i + 1, 20, radius10_quad.get('se', 'NaN')) sheet1.write(i + 1, 21, radius10_quad.get('sw', 'NaN')) sheet1.write(i + 1, 22, radius10_quad.get('nw', 'NaN'))
# radius12_quad 数据 radius12_quad = point.get('radius12_quad', {}) sheet1.write(i + 1, 23, radius12_quad.get('ne', 'NaN')) sheet1.write(i + 1, 24, radius12_quad.get('se', 'NaN')) sheet1.write(i + 1, 25, radius12_quad.get('sw', 'NaN')) sheet1.write(i + 1, 26, radius12_quad.get('nw', 'NaN'))
# 保存Excel文件 f.save(os.path.join(output_dir, number + '.xls')) print(f"{number}.xls 已下载") except Exception as e: print(f"Error processing {number}: {e}") continue

2

   

绘制动态台风路径图

2.1

   

绘制方法

首先加载台风数据;将台风路径时间列的 Excel 日期格式转换为标准的日期时间格式;然后设置包含多个底图图层的地图,此处仍使用 Folium 创建一个基础地图,初始中心点设置在大约中国南海的经纬度,缩放级别设为 5;之后遍历每一行台风数据,逐点生成 GeoJSON 格式的路径数据,每个点包含时间、纬度、经度等信息;使用 TimestampedGeoJson 添加动态台风路径,通过 TimestampedGeoJson 插件显示台风路径随时间的动态变化;最后保存地图为 HTML 文件,可以通过浏览器打开并查看。

2.2

   

绘制代码

这里采用的台风路径数据如下,包括经过路径点的时间以及经纬度位置信息

import pandas as pdimport foliumfrom folium.plugins import TimestampedGeoJson
# 第一步:从CSV文件加载台风数据# 使用pandas读取台风数据,该文件路径需根据你的具体路径填写typhoon_data = pd.read_csv('D:\BaiduNetdiskDownload\地图\台风路径数据\海神\hs.csv')
# 第二步:将'ISO_TIME'列的Excel日期格式转换为标准的日期时间格式# 'ISO_TIME'是以Excel日期序列格式表示的数值,需要将其转换为datetime格式# Excel日期格式的基准日期为1899-12-30,通过pandas进行转换typhoon_data['ISO_TIME'] = pd.to_datetime('1899-12-30') + pd.to_timedelta(typhoon_data['ISO_TIME'], unit='D')
# 第三步:设置包含多个底图图层的地图# 使用Folium创建一个基础地图,初始中心点设置在大约中国南海的经纬度,缩放级别设为5m = folium.Map(location=[20, 115], zoom_start=5)
# 添加多个地图瓦片图层(包括OpenStreetMap、Stamen风格图层和CartoDB风格图层)# 这些瓦片图层提供了不同风格的地图背景,用户可以在地图上进行切换folium.TileLayer(tiles='OpenStreetMap', attr='© OpenStreetMap contributors').add_to(m)folium.TileLayer(tiles='Stamen Terrain', attr='Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL').add_to(m)folium.TileLayer(tiles='Stamen Toner', attr='Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL').add_to(m)folium.TileLayer(tiles='Stamen Watercolor', attr='Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL').add_to(m)folium.TileLayer(tiles='CartoDB positron', attr='© OpenStreetMap contributors, © CartoDB').add_to(m)folium.TileLayer(tiles='CartoDB dark_matter', attr='© OpenStreetMap contributors, © CartoDB').add_to(m)folium.TileLayer(tiles='https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png', attr='© OpenStreetMap contributors, © OpenTopoMap (CC-BY-SA)').add_to(m)
# 第四步:准备动态台风路径数据# 遍历每一行台风数据,逐点生成GeoJSON格式的路径数据# 每个点包含时间、纬度、经度等信息,还会显示信息框(popup)提示台风的经纬度和性质features = []for _, row in typhoon_data.iterrows(): # 将时间转换为ISO 8601格式,用于动态时间显示 timestamp = row['ISO_TIME'].strftime('%Y-%m-%dT%H:%M:%SZ') lat = row['LAT'] # 获取每个点的纬度 lon = row['LON'] # 获取每个点的经度
# 为每个台风数据条目创建一个GeoJSON点 point = { 'type': 'Feature', 'geometry': { 'type': 'Point', 'coordinates': [lon, lat], # 设置经纬度 }, 'properties': { 'time': timestamp, # 时间用于动态路径显示 'popup': f'Lat: {lat}, Lon: {lon}, Nature: {row["NATURE"]}', # 弹出框显示纬度、经度和台风性质 'icon': 'circle', 'iconstyle': { 'fillColor': 'red', # 设置点的颜色为红色 'fillOpacity': 0.6, # 设置点的透明度 'stroke': 'true', # 允许点的描边 'radius': 6 # 设置点的半径大小 } } } features.append(point)
# 创建一个GeoJSON结构,包含台风路径的所有点typhoon_geojson = { 'type': 'FeatureCollection', 'features': features}
# 第五步:使用TimestampedGeoJson添加动态台风路径# 通过TimestampedGeoJson插件显示台风路径随时间的动态变化TimestampedGeoJson( typhoon_geojson, transition_time=200, # 每个点显示的持续时间(以毫秒为单位) add_last_point=False, # 不保留之前的点,仅显示当前时间点 period='PT1H', # 假设数据是每小时的台风路径 auto_play=True, # 自动播放时间轴 loop=False # 动画不循环播放).add_to(m)
# 第六步:添加图层控制,允许在不同地图图层之间切换folium.LayerControl().add_to(m)
# 第七步:保存地图为HTML文件# 生成的地图将保存为HTML格式,可以通过浏览器打开并查看m.save('typhoon_path.html')print("台风路径图已保存为“typhoon_path.html”")


用浏览器打开生成的HTML文件,即可看到结果。在地图左下侧有一个进度条,

点击启动’按钮,则开始展示台风路径动态图。


下面是动态展示:


【end】
最近正是招聘高峰,相信各位优秀学子都能找到满意的工作,回首过往,也不负自己二十余年的求学之路!!!(有些企业我可以帮忙内推,有需要的大家后台私信即可)

遥感小屋
分享遥感相关文章、代码,大家一起交流,互帮互助
 最新文章