1. 程式人生 > >使用python進行運動軌跡合並:多次騎行跑步軌跡疊加顯示

使用python進行運動軌跡合並:多次騎行跑步軌跡疊加顯示

手冊 加載 所有 圖片 畫圖 xml解析 大小 get 查看

現有各種各樣的運動app、運動手表手環以及gps碼表等可以用於記錄日常騎行或跑步等運動軌跡;但軌跡顯示多數只限於顯示一天的軌跡,經過搜索只發現一篇文章介紹跑步軌跡疊加方法(查看),根據教程嘗試了下還因為perl語言的一些插件沒搞定,果斷放棄決定自己動手豐衣足食。

先上效果圖:

ps:那條長線不是繪制的有問題,的確是單日騎行距離最遠的一次,260多公裏(開始30多公裏由於碼表磁鐵位置問題只記錄了幾公裏,碼表記錄233公裏)。

技術分享圖片

技術分享圖片

濟南市附近軌跡,缺個環泰:

技術分享圖片

衛星地圖軌跡:

技術分享圖片

軌跡繪制方法:

作為一位騎行愛好者,手頭剛好有一部捷安特碼表。雖然其對應的APP顯示的數據一應俱全,但是軌跡顯示效果非常一般,如下圖所示。作為一名經驗豐富的IT從業者,多年的職業訓練帶來的敏銳直覺告訴我(沒錯,就是要自吹自擂然後加粗強調一下!):

既然它的app能畫出軌跡,碼表本身必然保存有軌跡的原始數據,而且很有可能是gps的經緯度組成的點的序列。只要能拿到這些軌跡的原始數據,就能根據經緯度畫出所有軌跡。

技術分享圖片技術分享圖片

說幹就幹,首先把碼表通過USB連接電腦,嘗試一下看能不能訪問內部的文件。進展順利,發現內部有很多如下所示的.fit文件,而且文件名恰好跟自己的運動日期匹配,且文件大小根據對應日期騎行距離的長短大小不一,想必就是軌跡記錄源文件了。

技術分享圖片

嘗試用文本編輯器打開上述.fit文件,居然是亂碼——很不幸,.fit文件是二進制文件,無法直接使用。經過一系列搜索發現.fit文件可以通過如下命令轉換為另一種文本類型的gpx文件。

gpsbabel -i garmin_fit -f 170712051156.fit

-o gpx -F 170712051156.gpx

但是目錄下一百個文件,逐個文件執行命令並生成對應的gpx文件那得啥時候搞完?

一、gpx文件獲取

linux優勢立馬體現出來,接下來給出獲取gpx文件的詳細步驟:

1. 進入存放.fit文件的目錄,列出目錄下的文件;

技術分享圖片

2. 把所有的fit文件名導入到文件fitfilelist中;

技術分享圖片

打開fitfilelist查看文件內容,是一百個fit文件名(圖中截取部分):

技術分享圖片

3.使用正則表達式進行替換(正則表達式的使用),上圖中的文件內容變成下圖所示:

技術分享圖片4.通過source fitfilelist執行fitfilelist文件中的一系列gpsbabel命令,等執行完就可以看到目錄下多了很多gpx文件

技術分享圖片

5.創建gpxfile目錄並將gpx文件移動到該目錄:

技術分享圖片

查看一下gpx文件的內容,可以看到文件內容主要就是一系列經緯度、高度、時間、速度數據:

技術分享圖片

至此完成獲取gpx文件部分。

二、利用gpx文件畫軌跡圖

這部分需要一定的python、django、javascript、HTML、CSS語言基礎,以及了解高德地圖API,看著語言很多,每個知識點只需要了解一點點就好;本文也直接給出了參考代碼,不懂的地方可以去參考相關的官方文檔。

本人也是一個跟芯片手冊打交道的C語言驅動工程師,提到的這些語言基本都是為了畫圖現學的; 對於完成目標而言,學習難度並不高(能寫出商用級別的代碼又是另外一回事了)。

調用高德API畫軌跡的步驟如下:

1.將第一部分獲取到的gpx存放到/root/virenv_python3/django_for_study/mysite/polls/xmls/目錄下;

2.django的view.py python文件導入xml解析模塊:import xml.etree.ElementTree as ET,並編寫函數完成如下功能:

遍歷gpx文件,獲取每個文件中的經緯度信息保存到變量path_dot中,所有文件的path_dot組成path_list, 通過render函數渲染給模板。

高能預警此處有坑:利用ElementTree模塊遞歸查找gpx格式的xml文件(見上圖)時,想通過查找‘trkpt’這個tag獲取到每個tag下的‘lat’和‘lon’兩個屬性,但是無論如何獲取不到,後來將tag打印出來發現內容為‘{http://www.topografix.com/GPX/1/0}trkpt‘,即在trkpt前面加了文件中定義的xmlns的內容,將代碼改為下圖的496行所示就搞定了。

技術分享圖片

3.模板中通過javascript調用高德地圖API加載地圖,並為地圖添加由一系列經緯度點組成的矢量折線:

技術分享圖片

3.設置url觸發步驟2中的showmap函數,在瀏覽器中訪問該URL,大功告成。現在還有點問題就是軌跡相比地圖整體向西偏移了100米左右,我的碼表以及小夥伴的碼表數據繪制的軌跡偏移差不多。而且多次經過同一個位置的路線基本是疊加在一起的,這樣看來碼表記錄基本準確,在數據基礎上整體加個偏移就能跟地圖完美重合了;有時間再研究。

技術分享圖片

使用python進行運動軌跡合並:多次騎行跑步軌跡疊加顯示