天天看點

使用Python和Perl繪制北京跑步地圖4.繪制GPS資料

當你在一個城市,穿越大街小巷,跑步跑了幾千公裡之後,一個顯而易見的想法是,如果能把在這個城市的所有路線全部畫出來,會是怎樣的景象呢?

文章代碼比較多,為了不吊人胃口,先看看最終效果,上到北七家,下到南三環,西到大望路,東到首都機場。二環32公裡,三環50公裡,這是極限,四環先暫時不考慮了。。。。

(本文工程已經托管在github,https://github.com/ferventdesert/gpx-crawler)

首先需要原始位置資訊,手機上有衆多跑步軟體,但它們共同的問題是不允許自由導入導出(可能是為了防止使用者脫離吧)。是以有一塊智能運動手表應該是不二之選。我的是garmin fenix3,推薦一下:

使用Python和Perl繪制北京跑步地圖4.繪制GPS資料

與此同時,益動gps算是業界良心了,能夠同步咕咚,garmin手表,悅跑圈的資料,是以我将其作為一個入口,抓取所有的gps資料。

至于如何同步,可參考網站上的相關介紹,下面是我登入該網站後的截圖:

http://edooon.com/user/5699607196/record/15414378

使用Python和Perl繪制北京跑步地圖4.繪制GPS資料

随便點進去以後,就可以看到導出路線的按鈕:

使用Python和Perl繪制北京跑步地圖4.繪制GPS資料

無比坑爹的是,它不提供批量導出的按鈕,幾百條記錄,依次導出都累死了。于是考慮用代碼來自動化吧。

登入之後,可以看出它是動态加載,當滾輪滾到最下時,自動加載後面的内容。本來是應該嗅探和分析http請求的。後來我懶惰了,采取折中方案,拖到底,全部加載完畢後,儲存了目前的html檔案。

接下來就是解析這個html,基本上是通過xpath的來做的。有經驗的同學看了下圖就都明白了:

使用Python和Perl繪制北京跑步地圖4.繪制GPS資料

圖中高亮的部分,就是要下載下傳gpx檔案的實際位址。我們将其儲存在urllist中。同時,中繼資料被儲存在json檔案裡。

值得注意的是,因為下載下傳時需要cookie,是以讀者需要将自己在益動gps的userid和登入的cookie都替換掉(這種網站不值得為它開發自動登入)。

接下來就是下載下傳的過程,擷取導出資料按鈕的url的xpath,構造一個帶cookie的請求,然後儲存檔案即可,非常容易。

之後,我們便儲存了大約300多個gpx檔案。

所謂gpx資料,是一種通用規範的gps資料格式,詳細的資料可自行搜尋。

我們需要使用python的gpx解析器, gpxpy是個好選擇,使用

pip3 install gpxpy 即可安裝。

gpxpy提供了豐富的接口,當然為了統計,我們隻需要提取一部分資料:

readgpx函數會讀取檔案名x,并将一個字典傳回。并得到類似下面的一張表:

使用Python和Perl繪制北京跑步地圖4.繪制GPS資料

因為我們隻需要繪制北京的區域,是以需要一個坐标表達式篩掉北京之外的地區。篩選代碼使用了pandas,在附件裡有更詳細的代碼。

exceptids=詳細[(詳細.lng<116.1)|(詳細.lng>116.7)|(詳細.lat<39.9)|(詳細.lat>40.1)].id

這樣,我們就将所有在北京完成的運動資料篩選了出來。

很不幸,這個庫使用perl作為開發語言,并使用了gd作為視覺渲染庫。我花費了大量的時間,在安裝gd上面。

ubuntu預設安裝perl, gd是需要libgd的,libgd卻在官網上極難下載下傳,下載下傳後卻又發現版本不對,這讓我在國外網際網路上遨遊了好幾個小時,都要死掉了。。。到最後,我才發現,安裝libgd庫隻要下面這一步就可以了:

apt-get install libgd-gd2-perl

我覺得這就是apt-get方式坑爹的地方,apt get gd 或者libgd根本找不到,如果不去查,誰知道這麼寫啊! 至于perl的cpan管理工具,哎,不說了都是淚。

接下來下載下傳gd 2.56,解壓之後,

perl ./makefile.pl

make

make install

即可

這份gpx繪制庫是這麼介紹自己的:

this folder contains several perl scripts for processing and plottin  gps track data in .gpx format.

當然我們不廢話,把所有的gpx資料拷貝到sample_gpx檔案夾下,然後華麗麗的運作

./runme.sh

如果沒有問題的話,應該是下面這樣:

我假設各位讀者對bash都已經很熟悉了,更多的需求可以檢視runme.sh。

最後得到的結果如下圖:

當時看到這個結果,我都驚呆了!這是自己跑了2000公裡左右的結果,北京三環内(主要集中在長安街以北)主要的道路都跑遍了,朝陽公園,天壇公園,尤其北三環和北土城路(10号線北段)被我各種虐。每一段白線都是一段故事,每一個點都是我的一個腳印啊!

這文章寫得顯然不夠詳細,遠遠沒有hand by hand。而且并沒有提供更多的資料分析(顯然這些工作我都做了)不過相信跑步的程式員一定都很厲害,我這就權作抛磚引玉了。

其實完全可以做成一個web服務,跑友們上傳自己的跑步軟體的id,就可以自動渲染出各種漂亮的跑步路徑和分析圖,應該會很有意義吧!

這件事情花費了我七八個小時,簡直吐血,大量的時間用在了如何安裝gd上,而不是下載下傳資料上。教訓告訴我,一定要讀安裝包裡自帶的說明文檔,因為庫和庫之間的版本不同,是以可能造成版本地獄,到時候新版本解除安裝不了,老版本沒法用的時候可别說我沒提醒啊!

值得一提的是,益動gps下載下傳的gpx檔案不帶換行符,這導緻gpx_disualization庫無法解析它(這貨正規表達式寫錯了),我懶得再去動perl正則,于是通過替換增加了換行符。

gd還需要libpng等一衆perl庫,在附件裡都有提供下載下傳。