LXX
读完需要
速读仅需 1 分钟
前言:
各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)
以下是下载脚本,此部分来自公众号-气海无涯
台风数据下载脚本
洋流,公众号:气海无涯Python气象数据处理与绘图:常用气象数据下载—我国台风历史轨迹数据
import json
import urllib.request
import xlwt
import datetime
import 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 pd
import folium
from 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创建一个基础地图,初始中心点设置在大约中国南海的经纬度,缩放级别设为5
m = 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文件,即可看到结果。在地图左下侧有一个进度条,
点击启动’按钮,则开始展示台风路径动态图。
下面是动态展示: