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 。各位看官輕噴,以后有時間再整理。