Python突破⾼德API限制爬取交通态势数据+GIS可视化
(超详细)
xml文件需要自己写吗⼀、需求:
爬取⾼德的交通态势API,将数据可视化为含有交通态势信息的⽮量路⽹数据。
⼆、使⽤的⼯具:
Python IDLE、记事本编辑器、ArcGIS 10.2、申请的⾼德开发者KEY(免费)。
三、主要思路:
本⽂的思路是使⽤Python的requests模块爬取⾼德API的返回信息,将返回的信息数据(JSON),通过代码解析的⽅式存⼊CSV⽂件中,再导⼊ArcGIS中进⾏可视化处理。
四、分析阶段:
根据⾼德提供的,注意到⾼德提供了两种获取交通态势信息的⽅式,⼀种是通过设定矩形区域(传⼊左下⾓以及右上⾓坐标)的⽅式,⼀种是通过设定圆形区域的⽅式(设定圆⼼坐标和半径),本⽂使⽤的
是设定矩形区域的⽅式。 但是问题来了,⾼德对⽤户的API⾏为进⾏了限制,要求设定的矩形区域的对⾓线长度不超过10公⾥,但这是难不倒程序猿的,可以使⽤⽹格的思想来突破这⼀限制,如下图:
即将爬取区域分成多个⽹格,每个⽹格在⾼德规定的10公⾥范围之内即可,这样虽然增加了API的调⽤次数,但不得不说是较为合适的解决⽅案,本思想同样也适⽤于POI信息的爬取,在本⽂中笔者使⽤了简单的for循环来实现⽹格爬取,当然读者也可以参考:
这篇博⽂中的LocaDiv类来实现更为复杂化的⽹格爬取⽅式。
五、编写代码:
由于本⽂的爬⾍程序⽐较简单,因此笔者为了⽅便直接使⽤Python⾃带的IDLE进⾏程序编写,代码如下:
import requests
import pandas as pdeclipse字体大小设置 快捷键
import json
import time
#初始API的URL
url="restapi.amap/v3/traffic/status/rectangle?key={申请的key}&extensions=all&rectangle="
#设定整个⽹格左下⾓坐标的经纬度值
baselng=116.927748
baselat=36.62361
#设定每个⽹格单元的经纬度宽
widthlng=0.05
widthlat=0.04
python在线编辑器python3#⽤于储存数据
x=[]
#⽤于标识交通态势线段
num=0
js放在html哪里
#爬取过程可能会出错中断,因此增加异常处理
try:
#循环每个⽹格进⾏数据爬取,在这⾥构建了3X3⽹格
for i in range(0,3):
#设定⽹格单元的左下与右上坐标的纬度值
#在这⾥对数据进⾏处理,使之保留6位⼩数(不保留可能会莫名其妙出错)
startlat=round(baselat+i*widthlat,6)
endlat=round(startlat+widthlat,6)
for j in range(0,3):
#设定⽹格单元的左下与右上坐标的经度值
startlng=round(baselng+j*widthlng,6)
endlng=round(startlng+widthlng,6)
#设置API的URL并进⾏输出测试jquery获取属性值attr
locStr=str(startlng)+","+str(startlat)+";"+str(endlng)+","+str(endlat)
thisUrl=url+locStr
print(thisUrl)
#爬取数据
(thisUrl)
s=data.json()
a=s["trafficinfo"]["roads"]
#注意,提取数值需要使⽤()的⽅式来实现,如a[k].get('speed')
#若使⽤a[k]['speed']来提取,或会导致KeyError错误
for k in range(0,len(a)):
s2=a[k]["polyline"]
s3=s2.split(";")
for l in range(0,len(s3)):
s4=s3[l].split(",")
x.append([a[k].get('name'),a[k].get('status'),a[k].get('speed'),num,float(s4[0]),float(s4[1])])
num=num+1
#若爬取⽹格较多,可使⽤time.sleep(秒数)来避免⾼德的单秒API调⽤次数的限制
except Exception  as e:
pass
#将数据结构化存储⾄规定⽬录的CSV⽂件中
c = pd.DataFrame(x)
<_csv('E:/BigRoads.csv')
六、CSV数据处理:
在相关⽬录下到爬取的CSV⽂件,⽤记事本打开,删除第⼀⾏的内容(,0,1,2,3,4,5),否则会导致导⼊ArcGIS时出错。
七、交通态势信息可视化:
1、打开Arcmap,在右侧的catlog(⽬录)中到爬取的CSV⽂件直接拖⼊左侧的内容列表中,如图:
2、右键点击该CSV数据,选择“显⽰XY数据”:
3、在弹出的设置框中,进⾏如下设置:
需要注意的是,本⽂中爬取的⾼德数据的坐标值使⽤的是GCJ-02坐标系,若要应⽤⾄项⽬中,需要转换为WGS-84坐标系,本⽂为了省事,且为了与⾼德在线底图对⽐验证,直接当作WGS84坐标来处理。点击两次确定,即可看到CSV⽂件成功的转换为了点要素⽂件。
4、接下来的⼀步⼗分重要,打开⽣成要素的属性表可以发现,属性表并没有FID(objectID)字段,若⽆该字段,该点要素将⽆法转换为线要素,因此需要将该要素导出为SHP⽂件,⽅法是右键单击该要素,选择数据->导出数据,如下图:
然后进⾏如下设置,注意要导出为shp格式:
5、接下来是将交通态势点转换为线,在toolbox中到“点集转线”⼯具(数据管理⼯具->要素->点集转线),在弹出的设置界⾯进⾏如下设置:
函数指针的理解
注意线字段选择Field5(即代码中的num变量),排序字段选择FID。
6、等待⽚刻,完整的路⽹呈现在眼前: