图源:摄图网可商用图片
交通流量是指在选定时间段内通过道路某一地点、某一断面或某一车道的交通实体数或当量数,从车流量的大小可以判定交通的拥挤状况,从而决定当前采取何种交通管理措施,以及对未来交通变化趋势和道路建设规划给出量化的指导依据,因此对交通量的准确检测在交通工程以及未来发展占有十分重要的位置。
交通流量的统计信息,在国内的部分城市是可以在政府网站上查阅的,比如上海市公共数据开放平台就可以查到金山区道路交通流量。数据下载则需要注册和申请。
相比于国内,国外的交通流量数据开放程度更高,以西方某国为例,其每个地方行政单位大多都会公开交通流量数据,部分地方会以年报的形式发布,或者在GIS中提供了原始数据下载。比如下面西方国家的某地的年均交通日流量就提供了csv格式的原始数据下载。
但是,更多的GIS系统对于交通流量的统计数据只提供在线查看,并不提供下载功能。面对这种情况,我们又该如何获取这些数据呢?下面以arcgis系统为例,浅谈一下数据获取问题。
ArcGIS 是一个全面的系统,用户可用其来收集、组织、管理、分析、交流和发布地理信息。作为世界领先的地理信息系统(GIS) 构建和应用平台,ArcGIS 可供全世界的人们将地理知识应用到政府、企业、科技、教育和媒体领域。ArcGIS 可以发布地理信息,以便所有人都可以访问和使用。
首先,我们打开一个arcgis的交通流量地图,选择图层列表,在打开的选项卡中注意到带有数据的图层,本例中我们选择“2020-average annual daily traffic and 10 year historic counts”,按住键盘上的F12,调出开发者工具,在network选项卡中先停止录制再开始录制,这样可以清空已经记录的http报文,专门记录后续操作所触发的网络通信。
之后我们选择“2020-averageannual daily traffic and 10 year historic counts”,图层后的三个点,在菜单中选择按“在属性表中查看”。此时,页面下方就会弹出该图层对应的数据表。这无疑就是我们想要的数据了。
对应观察右边的开发者工具,随着鼠标向下滑动,查看数据表,右边会记录越来越多的报文,且都带有json字样。依次查看这些报文,会发现有一个报文的preview(预览)中依次展开 displayFieldName,fields就可以看到表格中的数据啦。
这里需要简单介绍一下其原理,首先,我们在network中查到的这种带有数据文件属于xhr类型,全称为XmlHttpRequest,用于服务器和浏览器之间交换数据,在建站的时候我们往往用到XmlHttpRequest对象的open和send方法,前者规定请求方式和需要交互的文件位置,以及是否异步上传;如果是get请求,则后者空参,即可将请求发送至服务器。W3CSHOOL上的业务代码示例如下。
xmlhttp.open("GET","ajax_info.txt",true); xmlhttp.send(); |
知道了xhr,再来了解json,这是一种基于JavaScript的轻量级数据交换格式。通常用{ },[ ]符号表示数据层级,用 : 表示键和值得关系,用,表示分隔符。显然,这要比用双标签传递数据的xml轻了许多。
综上所述,网站开发时用 XmlHttpRequest将编写好的json文件传给浏览器,用户就可以看到数据啦。当然,传给浏览器的json文件不可能是开发者编写的,而是从网站数据库中查询的结果生成的。知道了原理,我们只需要把这些浏览器请求到的json文件再还原成二维表,就万事大吉了。
回到上面这个文件的headers选项卡,我们确定了报文的请求方式是GET,并且请求地址也知道。仔细分析地址,有两个参数这里需要修改,一个是resultOffset,见名知意,这里指的是查询结果的偏移量.
当然,我们需要从0开始查询,即数据库中的第一条数据。ResultRecordCount为每次查询返回的结果集大小,此处我们试着把它改大一些,比如说1000。最后,我们修改过的请求地址就是:
https://enterprise.firstmap.delaware.gov/arcgis/rest/services/Transportation/DE_Assets/MapServer/11/query?f=json&where=1=1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&orderByFields=OBJECTIDASC&resultOffset=0&resultRecordCount=1000
此时,我们只需要用python的requests库的get刚发向这个地址发送请求,再用请求对象的json方法解析返回的数据就可以了。在下面的代码中,变量data就已经是以字典的形式拿到了1000行交通数据(在名为features的列表中)。
import json import requests import pandas url = "https://enterprise.firstmap.delaware.gov/arcgis/rest/services/Transportation/DE_Assets/MapServer/11/query?f=json&where=1=1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&orderByFields=OBJECTID ASC&resultOffset=0&resultRecordCount=1000" r =requests.get(url) data = r.json() |
最后,只需要把这个列表存储成二维表并输出即可,这里选用pandas工具代为整理,完整代码如下,整理过程不再赘述。
import json import requests import pandas url = "https://enterprise.firstmap.delaware.gov/arcgis/rest/services/Transportation/DE_Assets/MapServer/11/query?f=json&where=1=1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&orderByFields=OBJECTID ASC&resultOffset=0&resultRecordCount=1000" r =requests.get(url) data = r.json() df = pandas.DataFrame(data["features"][0]["attributes"],index =[0]) df2 = pandas.DataFrame(columns=df.columns) for d in data["features"]: df = pandas.DataFrame(d["attributes"],index =[0]) df2 = pandas.concat([df2,df],axis = 0) print(d) df2.to_excel("c://Users//Administrator//Desktop//AADT_m_2019.xlsx") |
本篇文章为福韵原创内容,未经授权禁止转载
封面来源:摄图网可商用图片