抓取“矢量”的实时交通流量数据
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 。各位看官轻喷,以后有时间再整理。
抓取“矢量”的实时交通流量数据的更多相关文章
- [python]初试页面抓取——抓取沪深股市交易龙虎榜数据
[python]抓取沪深股市交易龙虎榜数据 python 3.5.0下运行 没做自动建立files文件夹,需要手动在py文件目录下建立files文件夹后运行 #coding=utf-8 import ...
- 点滴积累【C#】---抓取页面中想要的数据
效果: 描述:此功能是抓取外国的一个检测PM2.5的网站.实时读取网站的数据,然后保存到数据库里面.每隔一小时刷新一次. 地址为:http://beijing.usembassy-china.org. ...
- 如何抓取基于https协议的webservice数据包
方法一:基于Fiddler2等第三方工具(需要在Java端禁用SSL安全检查) 原文拷贝自http://blog.csdn.net/zmxj/article/details/6327775,向原作者表 ...
- 使用HttpClient 4.3.4 自动登录并抓取中国联通用户基本信息和账单数据,GET/POST/Cookie
一.什么是HttpClient? HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 ...
- Fiddler基本原理与抓取Andriod与IOS的App数据包
Fiddler基本原理 Fiddler数据包的原理是Fiddler将自己设置为一个代理服务器,默认监听127.0.0.1:8888端口同时将浏览器的HTTP.HTTPS协议设置为使用代理服务器也就是使 ...
- Java HttpURLConnection 抓取网页内容 解析gzip格式输入流数据并转换为String格式字符串
最近GFW为了刷存在感,搞得大家是头晕眼花,修改hosts 几乎成了每日必备工作. 索性写了一个小程序,给办公室的同事们分享,其中有个内容 就是抓取网络上的hosts,废了一些周折. 我是在一个博客上 ...
- 使用python抓取知乎日报的API数据
使用 urllib2 抓取数据时,最简单的方法是: import urllib2, json def getStartImage(): stream = urllib2.urlopen('http:/ ...
- android端从服务器抓取的几种常见的数据的处理方式
1.图片 public void look(View v) { String path = et_path.getText().toString(); try { URL url = new URL( ...
- Wireshark抓取本地Tcp包(任何数据包)
没有任何一个程序员在做项目的时候不会遇到网络编程的问题,要解决这些问题除了对各种网络协议深入了解之外,还需要掌握各种网络分析工具的用法,不用多说wireshark绝对是这方面的翘楚,可惜的是,wire ...
随机推荐
- C++[类设计] ini配置文件读写类config
//in Config.h #pragma once #include <windows.h> #include <shlwapi.h> #pragma comment(l ...
- C++ TinyXml操作(含源码下载)
前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手.这个解析库的模型通过解析X ...
- Android四大组件——Service
Service相关链接 Service初涉 Service进阶 Service精通 Service是Android系统中的一种组件,它跟Activity的级别差不多,但是它不能自己运行,只能后台运行, ...
- 用Hexo搭建属于自己的Blog
什么是Hexo 简单的来说,Hexo是一款基于Node.JS的静态博客框架,官方给它的描述是"A fast, simple & powerful blog framework&quo ...
- Bzoj3990 [SDOI2015]排序
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 651 Solved: 338 Description 小A有一个1-2^N的排列A[1..2^N], ...
- Android Studio 打开弹出警告框
1.Android Studio打开后,自己的项目没有打开,就弹出了警告框,重启之后依然弹出警告框: 警告框内容:"Cannot load project: java.lang.Illega ...
- android 检查网络是否可用,如果不可用弹出设置,让用户改变
/** * 校验网络,如果没有网络,返回true * * @return boolean */ @Override public boolean hasInternetConnected() { Co ...
- 如何在CentOS 7上修改主机名
如何在CentOS 7上修改主机名 在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty).“静态”主机名也称为内核主机名,是系统在启动时 ...
- 汇编test和cmp区别
来自http://tunps.com/assembly-test-and-cmp 看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一 ...
- GitHub——如何更新已经fork的代码
github上有个很方便的功能叫fork,将别人的工程一键复制到自己账号下.这个功能很方便,但有点不足的是,当源项目更新后,你fork的分支并不会一起更新,需要自己手动去更新.下面记录下网上找到的更新 ...