2023年6月30日发(作者:)
Python突破⾼德API限制爬取交通态势数据+GIS可视化(超详细)⼀、需求: 爬取⾼德的交通态势API,将数据可视化为含有交通态势信息的⽮量路⽹数据。⼆、使⽤的⼯具: Python IDLE、记事本编辑器、ArcGIS 10.2、申请的⾼德开发者KEY(免费)。三、主要思路: 本⽂的思路是使⽤Python的requests模块爬取⾼德API的返回信息,将返回的信息数据(JSON),通过代码解析的⽅式存⼊CSV⽂件中,再导⼊ArcGIS中进⾏可视化处理。四、分析阶段: 根据⾼德提供的,注意到⾼德提供了两种获取交通态势信息的⽅式,⼀种是通过设定矩形区域(传⼊左下⾓以及右上⾓坐标)的⽅式,⼀种是通过设定圆形区域的⽅式(设定圆⼼坐标和半径),本⽂使⽤的是设定矩形区域的⽅式。 但是问题来了,⾼德对⽤户的API⾏为进⾏了限制,要求设定的矩形区域的对⾓线长度不超过10公⾥,但这是难不倒程序猿的,可以使⽤⽹格的思想来突破这⼀限制,如下图: 即将爬取区域分成多个⽹格,每个⽹格在⾼德规定的10公⾥范围之内即可,这样虽然增加了API的调⽤次数,但不得不说是较为合适的解决⽅案,本思想同样也适⽤于POI信息的爬取,在本⽂中笔者使⽤了简单的for循环来实现⽹格爬取,当然读者也可以参考:
这篇博⽂中的LocaDiv类来实现更为复杂化的⽹格爬取⽅式。五、编写代码: 由于本⽂的爬⾍程序⽐较简单,因此笔者为了⽅便直接使⽤Python⾃带的IDLE进⾏程序编写,代码如下:import requestsimport pandas as pdimport jsonimport time#初始API的URLurl="/v3/traffic/status/rectangle?key={申请的key}&extensions=all&rectangle="#设定整个⽹格左下⾓坐标的经纬度值baselng=116.927748baselat=36.62361#设定每个⽹格单元的经纬度宽widthlng=0.05widthlat=0.04#⽤于储存数据x=[]#⽤于标识交通态势线段num=0#爬取过程可能会出错中断,因此增加异常处理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并进⾏输出测试 locStr=str(startlng)+","+str(startlat)+";"+str(endlng)+","+str(endlat) thisUrl=url+locStr print(thisUrl) #爬取数据 data=(thisUrl) s=() a=s["trafficinfo"]["roads"] #注意,提取数值需要使⽤()的⽅式来实现,如a[k].get('speed') #若使⽤a[k]['speed']来提取,或会导致KeyError错误 for k in range(0,len(a)): s2=a[k]["polyline"] s3=(";") for l in range(0,len(s3)): s4=s3[l].split(",") ([a[k].get('name'),a[k].get('status'),a[k].get('speed'),num,float(s4[0]),float(s4[1])]) num=num+1 #若爬取⽹格较多,可使⽤(秒数)来避免⾼德的单秒API调⽤次数的限制except Exception as e: pass#将数据结构化存储⾄规定⽬录的CSV⽂件中c = ame(x)_csv('E:/')六、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、等待⽚刻,完整的路⽹呈现在眼前: 看到了路⽹是不是⼀阵狂喜,但是打开属性表,似乎笑不出来了,原来的交通态势属性去哪了 不要着急,接下来⼀步,将属性完美的找回来。 7、右键路⽹数据,选择连接和关联->连接,如下图: 在弹出的设置框中进⾏如下设置: 第⼆个选项可以是原始的CSV表,也可以是⽤来转线的点⽂件(即本⽂的),点击确定,再打开属性表,属性是不是回来了呢? 8、分级渲染可视化⼀下,美滋滋~ 什么?为什么这么丑?不要在意这些细节...........
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688108462a82746.html
评论列表(0条)