百木园-与人分享,
就是让自己快乐。

Python将台风轨迹做可视化分析

台风天要带多少钱出门?

答案是:四千万。因为台风天没四(事)千万不要出门

这不最近又到了台风频发的季节。作为没有四千万的沿海人,多关注一下天气预报还是有必要的。

那么今天呢,就给大家讲一个:用Python绘制台风路径轨迹图的可视化案例。

此案例中用到的核心绘图库是:plotly。plotly库是一个可交互,基于浏览器的绘图库,功能非常强大, 可以在线绘制常见的条形图、散点图、饼图、直方图等。

在这里插入图片描述

涉及到的内容:

requests+json – 网页数据爬取

openpyxl – 保存数据至Excel

os.walk() – 文件路径遍历

pandas – 表格数据处理

plotly – 地图数据可视化

1. 数据爬取

1.1 网页分析

数据来源:中国天气台风网(http://typhoon.weather.com.cn/index.shtml)

以2020年为例,打开网址查看2020年台风列表:

在这里插入图片描述

去年有记录的台风一共有23个,编号2001~2023。

1.2 查看网页台风数据

F12调试模式,以编号2001为例:

在这里插入图片描述

可以看到轨迹数据在页面返回的getData字符串中,内部数据为json格式。

在这里插入图片描述

数据包含:台风名称、时间(间隔1小时)、经度、纬度、风速、移动方向、移动速度等等。

对于浏览器调试模式还不熟悉的同学,可以看之前的文章:爬虫必备工具,掌握它就解决了一半的问题

1.3 数据爬取

单个台风轨迹爬取,需要输入年份和台风编号:

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倍

1.4 数据保存

使用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文件夹(路径可自行调整):

在这里插入图片描述

2. 地理轨迹

2.1 mapbox网站Token获取

网站:https://account.mapbox.com/

需要邮箱注册:

在这里插入图片描述

2.2 导入plotly相关包

导入express模块:

import plotly.express as px

 

如果环境没有plotly包,直接通过pip安装即可:

pip install plotly

 

2.3 单个台风轨迹

代码:

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’。

2.4 多个台风轨迹

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\')

 

效果:

在这里插入图片描述

如此就实现一个可以交互查看数据的台风路径轨迹图。感兴趣的同学可以自己也动手试一试。这一篇到这就莫有了,下一篇见啦!!!

在这里插入图片描述


来源:https://www.cnblogs.com/123456feng/p/16093603.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Python将台风轨迹做可视化分析

相关推荐

  • 暂无文章