抓取矢量交通流数据
原文链接:https://www.cnblogs.com/pengchen/p/4770999.html
1. 引言
最近老师有一个需求,就是想要抓取实时的矢量交通流量数据来做分析,类似于百度地图,高德地图的“实时路况”那种。平时的网络抓取工作一般是抓取网页上现成的数据,但是交通流量数据只有栅格的切片,没有矢量数据,而且数据购买的费用一年就好几十W,基本不可能拿得出。实验室的师兄们都有事情忙,所以这个苦逼的任务自然摊派到我的头上。
图1. 高德和百度地图的实时路况数据
因为网络上现成的数据只有切片数据,因此这个问题就转化为了如何将切片数据矢量化。如果直接用ArcGIS Engine将栅格数据转换为矢量数据,基本不可能,首先计算量太大,再次是转换的矢量数据不准确,更重要的是,每次转换出来的矢量道路是不一样的,没法做分析。但是我们注意到,交通流量切片它有两个特性:
a) 它也属于一种地图切片,因此可以使用地图切片算法来计算出每张切片的经纬度;
b) 它是一张透明的PNG图片,以四种颜色表示交通拥堵情况,我只需要将每段路的颜色识别出来,判断交通拥堵状况,就能够完成“矢量化”的工作了。
接下来的工作就可以分为以下几步:
a) 准备一份详细某城市的矢量道路数据;
b) 下载这个城市交通流量切片,并且拼合成一张大图片;
c) 在栅格上标记需要检测颜色的象元,并且计算这些象元的经纬度;
d) 将每条路的矢量数据与象元一一匹配,并且检测交通流量状况,写入数据库。
2. 地图切片系统与实时交通流量
地图切片又叫地图瓦片,这方面的文章和机制已经很成熟了,详细算法内容可以参考这篇文章http://blog.csdn.net/mygisforum/article/details/7582449。本文以高德切片为例,高德实时交通流量则采用动态切片的形式,但是与一般的切片系统稍微有点不同,切片的缩放等级zoom越小,缩放层级越大,是反着来的。
当然,我们也可以不同自己算,推荐使用https://github.com/BruTile/BruTile类库
3. 主要思路
高德的交通流量数据(图1.(a))总体来说还是非常简单的,用“绿”、“黄”、“红”三种颜色,表示交通的拥堵状况,相近道路的分隔还是比较明显。但是直接把切片转换为矢量是非常不现实的。不过我有北京市提供的非常详细的矢量数据(图2.(b)),如果把交通流量切片和矢量数据匹配起来,就可以生成实时的交通流量矢量数据了,最后交通流量数据以切片或者以矢量发布都没问题。所以现在最主要的工作就是找到匹配交通流量切片和矢量数据的中间件。
图2. 交通流量切片与矢量数据
高德切片数据虽然是以编码的方式组织的,但是每个图片、每个像素都有严格且固定的坐标,只要挑选出一部分有值的像素,将像素安装公式转换为点阵,然后把每个点与一条矢量道路匹配起来,即给每个点添加一个RouteId字段。图3(a)为我生成的一部分点阵,图3(b)为点阵的属性表,包含x,y,routeid三个字段。具体步骤如下:
a) 每隔一段时间下载交通流量切片数据,存放在本地文件夹中;
b) 根据点阵数据读取指定的切片的指定的像素,判断该像素颜色,得到拥堵情况;
c) 根据拥堵情况和RouteId生成交通流量表,包含RouteId和Traffic两个字段;
d) 把交通流量表和矢量数据根据RouteId相匹配,就得到了矢量交通流量数据;
e) 使用切片工具将矢量数据生成天津师大需要的切片数据。
图3.(a) 交通流量切片数据和矢量道路数据和点阵叠加,(b)点阵的属性表
这是我使用程序抓取2014年12月5号晚上8点左右的交通流量数据,然后对北京四环的交通流量进行矢量化。从结果看出,交通流量总体的趋势是相似的,但是一些细节地方会有一些不同。矢量化的结果取决于点阵的精细程度。
图4.(a) 交通流量切片数据 (b)生成的矢量交通流量数据
4. 总结
当时是抱着完成任务的心态做这件事情的,所以整个事情也做的很粗糙,代码写的很乱,还是厚着脸皮把代码共享出来吧,https://github.com/xiaoqqchen/TrafficSpider 。各位看官轻喷,以后有时间再整理。