本期导读
大家好,我是欧K。
今天给大家推荐一个比较方便绘制地理轨迹的库-plotly。plotly库是一个可交互,基于浏览器的绘图库,功能非常强大, 可以在线绘制常见的条形图、散点图、饼图、直方图等等,本期我们用plotly绘制台风地理轨迹图,希望对你有所帮助。
涉及到的内容:
request+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 数据爬取
单个台风轨迹爬取,需要输入年份和台风编号:
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
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 install plotly即可。
2.2 单个台风轨迹
代码:
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.3 多个台风轨迹
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')
效果:
完。
END
以上就是本期为大家整理的全部内容了,赶快练习起来吧,喜欢的朋友可以点赞、点在看也可以分享让更多人知道哦。