[Py] 從 GPX 中取出經緯度與高程記錄資料

今天剛上地震地質學的途中,腦袋突然想到一件有趣的事情:如果可以用手機的 GPS 紀錄來做數值高程模型的話,說不定滿有趣的。現在都有各種不同的手機 APP 可以記錄軌跡資料,也有公開的格式可以使用,下面我們將用 Python 將 GPX 檔案中的高程資料讀出。

GPX 檔案結構

GPX (GPS eXchange Format) 是一種用於交換 GPS 資料所設定的 XML 檔案結構,下面我們用 iOS 「登山客」應用程式所生成的 GPX 檔案為範例說明一下:

  • <gpx> 標籤為最上層的標籤,裡面包含所有路徑資料。
  • <trk> 為路徑資料,裡面有名稱(<name>)標籤(感覺是非標準的)與路徑分段資料(<trkseq>)。
  • <trkseq> 內儲存了路徑點(<trkpt>)。
  • <trkpt> 路徑點標籤中有 lon 與 lat 兩不同的 attribute ,並包含高程(<ele>)與時間(<time>)資料。
  • <ele> 高程標籤。
  • <time> 時間標籤。

取出 GPX 的點

這邊使用 Python 3.6 內建的 XML 模組,官方說明說這些模組在無法抵擋惡意的 XML 檔案攻擊(這邊),所以請注意要處理的檔案來源是否可以信任,或使用可以抵禦惡意 XML 檔案的函數庫(如 defusedxml)。

我們用 XML 中 DOM 模組來處理檔案:

  1. 首先利用 minidom.parser() 讀取 GPX 檔案。
  2. 接著利用 minidom.getElementsByTagName(“Name”) 利用標籤名稱找到節點(Node) 的方式找出所有的記錄點 <trkpt> 。這時傳回「NodeList」物件
  3. 用 for 迴圈處理所有的點。( i 為 Element 物件)
  4. 因為記錄點的經緯度記載在<trkpt> 的屬性內,我們用 NodeListgetAttribute(“Attr”) 來取得屬性的值(「Attr」 替換成 「lon」與「lat」)
  5. 高程比較麻煩,因為他在 <trkpt> 的下層,我們首先用getElementsByTagName(“Name”) 找到 「ele」的標籤(此時傳回 NodeList 物件,裡面只有一個物件),用.item(n)取出元素(傳回 Element 物件),再用 childNodes 拿到子標籤(此時傳回 NodeList 物件),接著用.item(n)方法取出元素(n=1 ele、n=2 time),最後.nodeValue 來獲得 「ele」標籤裡面的值。

 

 


請多多指教!

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料