实时抓取网页数据(高德和百度地图实时路况数据的研究进展及应用方法)
优采云 发布时间: 2021-11-26 08:06实时抓取网页数据(高德和百度地图实时路况数据的研究进展及应用方法)
1. 简介
最近老师有一个需求,就是想抓取实时矢量交通流数据进行分析,类似于百度地图和高德地图的“实时路况”。通常的网络爬虫工作一般都是抓取网页上现成的数据,但是流量数据只有栅格切片,没有矢量数据,而且数据购买成本每年几十W,基本不可能获得。实验室的兄弟们忙于事情,所以这项艰巨的任务自然交给了我。
图1.高德和百度地图实时路况数据
因为网上能得到的数据只有切片数据,这个问题转化为如何对切片数据进行向量化。如果直接使用ArcGIS Engine将栅格数据转换为矢量数据,基本上是不可能的。一是计算量过大,二是转换后的矢量数据不准确。更重要的是,每次转换的矢量道路都不一样。没有办法分析它。但是我们注意到流量切片有两个特点:
a) 也属于地图切片的一种,所以可以使用地图切片算法来计算每个切片的经纬度;
b) 它是一个透明的 PNG 图像,用四种颜色表示交通拥堵。我只需要识别每一段路的颜色,判断交通拥堵情况就可以完成“矢量化”工作。
接下来的工作可以分为以下几个步骤:
a) 准备某城市详细的矢量道路数据;
b) 下载城市交通流切片,拼成大图;
c) 在网格上标记需要检测颜色的像素点,并计算这些像素点的经纬度;
d) 将每条道路的矢量数据与像素一一匹配,检测交通流情况并写入数据库。
2. 地图切片系统和实时交通流
地图切片也称为地图图块。这方面的文章和机制已经很成熟了。详细算法内容请参考这个文章。本文以高德切片为例。高德的实时交通流使用动态切片,但与一般的切片系统略有不同。切片的缩放级别越小,缩放级别越大,反之亦然。
当然我们也可以自己计算不同,建议使用类库
3. 主要思想
高德的交通流数据(图1.(a))一般都很简单。用“绿”、“黄”、“红”三种颜色表示交通拥堵。分离非常明显。但是直接将切片转换为向量是非常不现实的。但是我有北京提供的非常详细的矢量数据(图2.(b))。如果将交通流切片与矢量数据进行匹配,则可以生成实时交通流矢量数据。最后,交通流数据 以切片或向量形式发布都可以。所以现在的主要任务是找到匹配流量切片和矢量数据的中间件。
图2. 交通流切片和矢量数据
虽然高德切片数据是以编码的方式组织的,但每张图片和每一个像素都有严格的固定坐标。只要选取一部分有值的像素点,将像素点安装公式转化为点阵,然后将每个A点与一条矢量道路进行匹配,即为每个点添加一个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. 总结
当时我是抱着完成任务的心态做这个的,所以整个事情做的很粗糙,代码也很乱,所以就无耻的分享一下代码吧。大家请看官方的轻喷,以后有时间再整理。