抓取「矢量」的實時交通流量數據

1. 引言

最近老師有一個需求,就是想要抓取實時的矢量交通流量數據來作分析,相似於百度地圖,高德地圖的「實時路況」那種。平時的網絡抓取工做通常是抓取網頁上現成的數據,可是交通流量數據只有柵格的切片,沒有矢量數據,並且數據購買的費用一年就好幾十W,基本不可能拿得出。實驗室的師兄們都有事情忙,因此這個苦逼的任務天然攤派到個人頭上。 git

image

圖1. 高德和百度地圖的實時路況數據 github

由於網絡上現成的數據只有切片數據,所以這個問題就轉化爲了如何將切片數據矢量化。若是直接用ArcGIS Engine將柵格數據轉換爲矢量數據,基本不可能,首先計算量太大,再次是轉換的矢量數據不許確,更重要的是,每次轉換出來的矢量道路是不同的,無法作分析。可是咱們注意到,交通流量切片它有兩個特性: 算法

a) 它也屬於一種地圖切片,所以可使用地圖切片算法來計算出每張切片的經緯度; 數據庫

b) 它是一張透明的PNG圖片,以四種顏色表示交通擁堵狀況,我只須要將每段路的顏色識別出來,判斷交通擁堵情況,就可以完成「矢量化」的工做了。網絡

接下來的工做就能夠分爲如下幾步: ide

a) 準備一份詳細某城市的矢量道路數據; 工具

b) 下載這個城市交通流量切片,而且拼合成一張大圖片; 編碼

c) 在柵格上標記須要檢測顏色的象元,而且計算這些象元的經緯度; .net

d) 將每條路的矢量數據與象元一一匹配,而且檢測交通流量情況,寫入數據庫。3d

 

2. 地圖切片系統與實時交通流量

地圖切片又叫地圖瓦片,這方面的文章和機制已經很成熟了,詳細算法內容能夠參考這篇文章http://blog.csdn.net/mygisforum/article/details/7582449。本文以高德切片爲例,高德實時交通流量則採用動態切片的形式,可是與通常的切片系統稍微有點不一樣,切片的縮放等級zoom越小,縮放層級越大,是反着來的。

固然,咱們也能夠不一樣本身算,推薦使用https://github.com/BruTile/BruTile類庫

1

 

3. 主要思路

高德的交通流量數據(圖1.(a))整體來講仍是很是簡單的,用「綠」、「黃」、「紅」三種顏色,表示交通的擁堵情況,相近道路的分隔仍是比較明顯。可是直接把切片轉換爲矢量是很是不現實的。不過我有北京市提供的很是詳細的矢量數據(圖2.(b)),若是把交通流量切片和矢量數據匹配起來,就能夠生成實時的交通流量矢量數據了,最後交通流量數據以切片或者以矢量發佈都沒問題。因此如今最主要的工做就是找到匹配交通流量切片和矢量數據的中間件。

image

圖2. 交通流量切片與矢量數據

高德切片數據雖然是以編碼的方式組織的,可是每一個圖片、每一個像素都有嚴格且固定的座標,只要挑選出一部分有值的像素,將像素安裝公式轉換爲點陣,而後把每一個點與一條矢量道路匹配起來,即給每一個點添加一個RouteId字段。圖3(a)爲我生成的一部分點陣,圖3(b)爲點陣的屬性表,包含x,y,routeid三個字段。具體步驟以下:

a) 每隔一段時間下載交通流量切片數據,存放在本地文件夾中;

b) 根據點陣數據讀取指定的切片的指定的像素,判斷該像素顏色,獲得擁堵狀況;

c) 根據擁堵狀況和RouteId生成交通流量表,包含RouteId和Traffic兩個字段;

d) 把交通流量表和矢量數據根據RouteId相匹配,就獲得了矢量交通流量數據;

e) 使用切片工具將矢量數據生整天津師大須要的切片數據。

1 2

圖3.(a) 交通流量切片數據和矢量道路數據和點陣疊加,(b)點陣的屬性表

這是我使用程序抓取2014年12月5號晚上8點左右的交通流量數據,而後對北京四環的交通流量進行矢量化。從結果看出,交通流量整體的趨勢是類似的,可是一些細節地方會有一些不一樣。矢量化的結果取決於點陣的精細程度。

34

圖4.(a) 交通流量切片數據 (b)生成的矢量交通流量數據

 

4. 總結

當時是抱着完成任務的心態作這件事情的,因此整個事情也作的很粗糙,代碼寫的很亂,仍是厚着臉皮把代碼共享出來吧,https://github.com/xiaoqqchen/TrafficSpider 。各位看官輕噴,之後有時間再整理。

相關文章
相關標籤/搜索