從拆解自行車到組裝GPS數據

DIY了一輛自行車

以前愛DIY電腦,自從去年折騰一番Skylake,填滿了內存槽和硬碟架後,彷彿已經走到了盡頭,沒有更多折騰的興趣。作為一個工程師,不折騰點事情似乎就缺了什麼似的。折騰心作祟,最近DIY了一輛復古自行車,從車把到車架再到變速器,所有部件統統遴選一遍。貨備齊的第一件事情就是把核心部件拿來拆解上油(很討厭軸承摩擦發出的「嗒嗒嗒」的聲響)。

拆散的部件重新安裝回去的過程,感覺就像讀了一遍「自行車」源代碼一樣,所有的原理,每個細節的技術實現都瞭然於胸。調試幾次後,一切就緒,開始試車。

騎行記錄

早期OSM的數據很大一部分人都是騎行者貢獻的。想來也不奇怪,平時戶外運動時,大家都喜歡記錄一下自己的運動路線,運動結束後看看自己的成就。相比跑步來說,同樣的運動時間,騎自行車的運動距離會是跑步的4~6倍,看到的風景也會更多,由此,騎行者貢獻了OSM早期數據也就說得通了。

現在騎行記錄當然不用非要裝備一個GPS,手機上裝個app就解決了,在此推薦一款騎行app——STRAVA。這款app功能比較齊全,體驗也不錯,不但能記錄騎行,還能做多種運動統計分析,還能結合地圖做騎行展示。

這款應用什麼都好,但有兩個問題對我造成了極大困擾。首先是是地圖上的軌跡怎麼看都是歪的,和道路對不上;如果想用某些高級的功能,需要付費,而且還不便宜。對於一個GISer來說很難容忍第一條,對於一個愛折騰的GISer來說第二條也接受不了,只能導出gps數據自行動手了。

顯示海量GPS數據

gpx是gps產生的標準數據格式,想必很多熱愛戶外運動的童鞋都不陌生。如何很好地展示分析這些數據恐怕熟悉的人就少很多了。如果你恰好有一批gpx格式的數據,數據量還比較大,又沒有合適的手段去展示和分享這些數據,或者數據量較大,沒法在地圖上流暢顯示,推薦用用GeoHey的數據上圖app,無需安裝任何插件,也無需任何費用,只要添加gpx文件就能輕鬆分享、瀏覽gps數據了,如果想分享到朋友圈炫耀一番,直接點擊左側分享即可。

重新組裝GPS數據

先來看結果點擊查看原地圖

總體來看,車速較快,奧森和後海附近閑庭信步,下次騎車要避開那些顏色偏冷人多的路段。GPS數據裡面是沒有數據信息的,車速也並不是均勻的,要如何才能三兩下把數據組裝成這樣呢?

這個玩法很簡單,但前提條件是你要有PostGIS,並且知道用QGIS把gpx數據轉為shp數據。

分解動作詳解:

1、把數據導入資料庫,命令行中敲入如下命令

shp2pgsql -s 4326 ${gps數據}.shp ride_track | psql -U ${用戶名} -d ${資料庫名}

2、把數據點連接成軌跡線,並且將路段以分鐘為單位聚合起來統計速度。

with base_point as (select gid/2||"A" as seg1,(gid+1)/2||"B" as seg2,* from ride_track where gid>=30), -- 將GPS位置點按照先後線段順序標號 base_seg1 as (select st_makeline(array_agg(geom)) as geom,max(time)-min(time) as delta_time,seg1 as seg from base_point group by seg1), -- 奇數線段進行拼接,並計算時間差 base_seg2 as (select st_makeline(array_agg(geom)) as geom,max(time)-min(time) as delta_time,seg2 as seg from base_point group by seg2), -- 偶數線段進行拼接,並計算時間差 base_seg as (select offset_data(geom) as geom,extract("epoch" from delta_time) as delta_time,seg from (select * from base_seg1 union select * from base_seg2) as union_segment order by substring(seg,"d+")::integer,substring(seg,"w+")), -- 奇偶線段按先後順序排列,並提取時間差值(其中offset_data為數據偏移演算法) base_speed as (select *,st_length(geom,TRUE)/delta_time as speed,row_number() over (partition by 1) as _id from base_seg where delta_time>0) -- 計算每秒行駛速度select st_union(geom) as geom,avg(speed)*3600/1000 into ride_track_speed from base_speed group by _id/60; -- 計算並統計每分鐘騎行路徑,並生成名為ride_track_speed的數據。

3、把數據導出為shp,並通過GeoHey的數據上圖app展現分享數據。

pgsql2shp -f ride_track_speed.shp -u ${用戶名} ${資料庫名} ride_track_speed | zip -r ride_track_speed.zip ride_track_speed.*

數據上傳後就可以輕鬆分析自己的騎行路線,二維碼分享等等。詳細的操作過程可以參考另外一篇博文新版數據上圖-只為更好體驗。


推薦閱讀:

當我騎車的時候,我在想什麼(一)
業餘車手訓練入門之二——騎行目標與訓練計劃
兩萬公里歐洲:大浪灣和慕尼黑
北京用摺疊自行車通勤有什麼困難么?
怎樣騎行世界.02.騎行工具箱

TAG:骑行 | GPS数据处理 | 数据可视化 |