台风天要带多少钱出门?
答案是:四千万。因为台风天没四(事)千万不要出门
这不最近又到了台风频发的季节。作为没有四千万的沿海人,多关注一下天气预报还是有必要的。
那么今天呢,就给大家讲一个:用Python绘制台风路径轨迹图的可视化案例。
此案例中用到的核心绘图库是:plotly。plotly库是一个可交互,基于浏览器的绘图库,功能非常强大, 可以在线绘制常见的条形图、散点图、饼图、直方图等。
涉及到的内容:
requests+json – 网页数据爬取
openpyxl – 保存数据至Excel
os.walk() – 文件路径遍历
pandas – 表格数据处理
plotly – 地图数据可视化
数据来源:中国天气台风网(http://typhoon.weather.com.cn/index.shtml)
以2020年为例,打开网址查看2020年台风列表:
去年有记录的台风一共有23个,编号2001~2023。
F12调试模式,以编号2001为例:
可以看到轨迹数据在页面返回的getData字符串中,内部数据为json格式。
数据包含:台风名称、时间(间隔1小时)、经度、纬度、风速、移动方向、移动速度等等。
对于浏览器调试模式还不熟悉的同学,可以看之前的文章:爬虫必备工具,掌握它就解决了一半的问题
单个台风轨迹爬取,需要输入年份和台风编号:
Python学习交流Q群:906715085###
def get_tp_data(year, code):
tim = int(time.time())
url = f'http://d1.weather.com.cn/typhoon/typhoon_data/{year}/{code}.json?callback=getData&_={tim}'
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' }
r = requests.get(url,headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
datas = json.loads(r.text[8:-1])
tp_name = datas['typhoon'][2]
detail_datas = datas['typhoon'][8]
# 台风信息
allinfo = []
for data in detail_datas:
# 时间
tp_time = data[1]
# 经度
tp_lon = data[4]
# 纬度
tp_lat = data[5]
# 中心气压
central_pressure = data[6]
# 风速
tp_speed = data[7]
# 移向
tp_direction = data[8]
# 去除台风登陆时的空行
if tp_direction == None :
continue
# 移速
move_speed = data[9]
tp_info = [f'{code}-' + tp_name,tp_time,tp_lon,tp_lat,central_pressure,tp_speed,tp_direction,move_speed]
allinfo.append(tp_info)
注意操作:去除台风登陆时的空行数据(该数据无经、纬度信息),这一步也可以在后续数据处理中进行。
以前10个台风为例(可根据需要调整):
#台风年份、编号
year = 2020
#数据爬取
for code in range(2001,2011):
get_tp_data(year, code)
pass
关于 requests 库的使用也可以参考之前文章:让你的爬虫开发效率提升8倍
使用openpyxl库保存Excel文件:
def insert2excel(filepath, allinfo):
try:
# 表头
tableTitle = ['名称','时间','经度','纬度','中心气压(hPa)','风速(m/s)','移向','移速(m/s)']
wb = Workbook()
ws = wb.active
ws.title = 'sheet1'
ws.append(tableTitle)
for info in allinfo:
ws.append(info)
wb.save(filepath)
return True
except:
return False
结果:
注意新建data文件夹(路径可自行调整):
网站:https://account.mapbox.com/
需要邮箱注册:
导入express模块:
import plotly.express as px
如果环境没有plotly包,直接通过pip安装即可:
pip install plotly
代码:
def trace_point_shows():
df = pd.read_excel('./data/2020_2001_黄蜂轨迹数据.xlsx')
print(df)
token = '你的token'
fig = px.scatter_mapbox(df,
hover_data=['时间'],
lon = '经度',
lat = '纬度',
color = '风速(m/s)',
hover_name = '名称',
size_max = 14,
color_continuous_scale = px.colors.carto.Temps
)
fig.update_layout(mapbox = {'accesstoken': token, # 官网注册token
'center':{'lon':121.54,'lat':25.00}, # 地图中心
'zoom': 8,
'style': 'dark', # 显示地图类型
},
margin = {'l': 1, 'r': 1, 't': 1, 'b': 1}) # 地图边界
fig.write_html('trace_point_shows-1.html')
效果:
地图style可以是:basic, streets, outdoors, light, dark, satellite, satellite-streets 中的任意一种,默认为 ‘light’。
os.walk()遍历文件夹中所有轨迹表格文件:
filenames = []
for root, dirs, files in os.walk('./data'):
for name in files:
filenames.append(f'{root}/{name}')
代码:
def trace_point_shows(filenames):
df = pd.DataFrame()
lsts = []
for filename in filenames:
df0 = pd.read_excel(filename)
lsts.append(df0)
df = pd.concat(lsts)
token = '你的token'
fig = px.scatter_mapbox(df,
hover_data=['时间'],
lon = '经度',
lat = '纬度',
color = '风速(m/s)',
hover_name = '名称',
size_max = 14,
color_continuous_scale = px.colors.carto.Temps
)
fig.update_layout(mapbox = {'accesstoken': token, # 官网注册token
'center':{'lon':121.54,'lat':25.00}, # 地图中心
'zoom': 8,
'style': 'dark', # 显示地图类型
},
margin = {'l': 1, 'r': 1, 't': 1, 'b': 1}) # 地图边界
fig.write_html('trace_point_shows.html')
效果:
如此就实现一个可以交互查看数据的台风路径轨迹图。感兴趣的同学可以自己也动手试一试。这一篇到这就莫有了,下一篇见啦!!!