使用高德交通态势查询API实时获取交通态势,并使用geopandas进行绘图。
高德交通态势查询API: 交通态势查询-高级 API 文档-开发指南-Web服务 API | 高德地图API
查询方式有以下几种:
- 指定线路交通态势查询
- 圆形区域内交通态势查询
- 矩形区域内交通态势查询
本文主要使用矩形区域内交通态势查询API。使用该接口前,先去高德开发者平台申请Key。
注意:要查询的矩形区域的对角线长度不能超过10公里。
1、获取矩形左下右上顶点坐标对
使用矩形区域查询时,需要给出矩形左下角和右上角的经纬度坐标对,使用高德坐标拾取器(坐标拾取器 | 高德地图API)选取坐标。
构建API接口,如下,
BASE_URL = 'https://restapi.amap.com/v3/traffic/status/rectangle?rectangle=104.052056,30.651679;104.081754,30.677741&output=json&extensions=all&key=你的key'
2、爬取数据及可视化
使用如下代码进行数据爬取及可视化
import requests
import geopandas as gpd
from shapely.geometry import LineString
import matplotlib.pyplot as plt
import contextily as ctx
import warnings
warnings.filterwarnings('ignore')
# 解决中文乱码问题,并设置字体
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['font.sans-serif'] = ['SimHei']
def get_status_data(sub_rectangle):
"""获取态势数据"""
data = {'name': [],
'status': [],
'geometry': []}
BASE_URL = ('https://restapi.amap.com/v3/traffic/status/rectangle?rectangle={'
'}&output=json&extensions=all&key=你的key')
res = requests.get(BASE_URL.format(sub_rectangle)).json()
if res['status'] == '1':
for road in res['trafficinfo']['roads']:
polylines = [(float(y[0]), float(y[1])) for y in
[x.split(',') for x in [i for i in road['polyline'].split(';')]]]
data['geometry'].append(LineString(polylines))
data['name'].append(road['name'])
data['status'].append(road['status'])
return gpd.GeoDataFrame(data, geometry='geometry', crs=4326)
def plot_status(data, base_map=False):
"""绘制态势图"""
fig, ax = plt.subplots(figsize=(10, 8), dpi=300)
# 定义每个类别的颜色
colors = {'3': 'red', '2': 'orange', '1': 'green', '0': 'grey'}
# 定义每个类别的线条宽度
linewidths = {'3': 1.0, '2': 0.7, '1': 0.4, '0': 0.2}
data.plot(column='status', figsize=(10, 8), ax=ax, color=data['status'].map(colors),
linewidth=data['status'].map(linewidths))
if base_map:
# 添加高德底图
ctx.add_basemap(ax,
source=r"http://wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}",
reset_extent=False, crs='epsg:4326', alpha=1)
ax.axis('off')
plt.tight_layout()
plt.show()
if __name__ == "__main__":
# 所选取矩形的左下角;右上角坐标对
rectangle = '104.052056,30.651679;104.081754,30.677741'
plot_status(get_status_data(sub_rectangle=rectangle), base_map=True)
输出结果如下,
无底图:
有底图: