GPX 和 GeoJSON,軌跡資料到底該用哪個
GPX 和 GeoJSON 說到底都是一串座標,但兩者當初要回答的問題不一樣。GPX 是專門為了描述一次 GPS 記錄而生的——軌跡、海拔、每個點被記錄下來的時間。GeoJSON 是為了描述地圖上幾乎任何形狀而生的——一條健行路線、一棟建築的輪廓、一條國界線,用的都是同一小撮幾何類型。這個出發點上的差異,紙面上看起來很小,但一旦真要把一次記錄下來的健行在兩者之間搬來搬去,反而特別容易踩坑。
兩種格式各自是為了裝什麼
GPX 只為一件事而生:GPS 軌跡
GPX 有一套固定的、專門為這件事設計的結構——一條由點組成的軌跡,每個點帶經緯度,通常還帶海拔和時間戳記,另外還能加單獨的路點。這個格式裡的每一項都是因為 GPS 記錄需要它才存在的,沒有什麼需要設定,也沒有什麼是通用的。
GeoJSON 為任何一種地圖資料而生
GeoJSON 是一種通用的方式,用來把地圖上的形狀——點、線、多邊形——寫成純粹的 JSON,它在網頁地圖和 GIS 軟體裡隨處可見,正是因為它不綁定任何一種特定的資料。一條健行路線會變成一個「LineString」,建築物的輪廓、湖泊的邊界、國界線也一樣,用的是完全相同的結構。對一張要放十幾種不同地物的網頁地圖來說,這份彈性正是它的全部吸引力所在。但對一次記錄下來的健行來說,這就意味著這個格式裡根本沒有內建「軌跡」這個概念——一次健行只是 GeoJSON 能裝的眾多形狀裡的一條線而已。
轉成 GeoJSON 之後,一次健行會丟掉什麼
GeoJSON 根本沒有專門存時間的欄位。GPX 的軌跡點理所當然地帶著時間戳記;GeoJSON 的座標就是一串數字——經度、緯度,外加可選的海拔,格式本身不會再掛上別的東西。想保留時間戳記的轉換工具只能自己發明一個地方去塞,通常是塞進要素自由格式的 "properties" 物件裡的一個陣列,這更像是權宜之計而不是標準做法——另一個工具讀同一個檔案時,既不保證知道這個陣列存在,更不保證看得懂它是什麼意思。
海拔保留得乾淨一些,作為每個座標裡經度、緯度之後可選的第三個數字。但這個順序本身就是一個常見的陷阱:GeoJSON 永遠把經度寫在緯度前面,跟人平常說座標的習慣順序相反,也跟 GPX 自己屬性裡的順序相反。轉換時把這個順序弄反了不會跳出錯誤提醒,只會把路線畫到地球上完全不同的地方,或者相對該有的方位整個上下顛倒。
為什麼這對一次健行很關鍵
Strava、Garmin Connect、Komoot、Gaia GPS、CalTopo 這類健行和騎行平台,從一開始就是圍著 GPX 搭起來的。它們需要的是時間戳記完好無損的軌跡——移動時間、配速,還有回放這次健行,這些都得知道每個點是什麼時候記錄的,而不只是在哪裡。把 GeoJSON 檔案丟給這些平台,運氣好也就是把路線的形狀匯入進去,但讓這次健行真正成為「記錄」而不是一條畫出來的線的那部分時間資訊,全都不見了;運氣不好,根本就不接受這個檔案。
GeoJSON 的主場在別處:網頁地圖、GIS 軟體,還有路線需要跟其他種類的地理資料擺在一起、而不是作為一次獨立活動單獨存在的場合。網站上的自訂地圖、把步道跟地界疊在一起分析的 QGIS 專案、直接在 GitHub 儲存庫裡預覽的路線——這些地方原生讀的就是 GeoJSON,本來也用不上 GPX 的時間戳記。
兩者對照
- 用途:GPX 專為 GPS 軌跡而生。GeoJSON 是給地圖上任何形狀用的通用格式。
- 時間戳記:GPX 把它當作每個點的基本欄位。GeoJSON 根本沒有專門存時間的欄位。
- 座標順序:GPX 在自己的屬性裡把緯度寫在經度前面。GeoJSON 永遠把經度寫在緯度前面——路線錯位、跑偏的一個常見原因。
- 出身:GPX 是 2002 年發布的開放格式,專為 GPS 資料而生,不屬於任何一家公司。GeoJSON 是後來才定下來的網頁地圖和 GIS 通用標準。
- 相容性:GPX 幾乎被所有健行、騎行和地圖平台原生支援。GeoJSON 被網頁地圖和 GIS 工具原生支援,在圍著「活動」設計的健身類平台上支援面要窄得多。
- 適合場景:GPX 適合想讓計時、配速和回放都完好保留下來的一次記錄健行。GeoJSON 適合要顯示在自訂網頁地圖上、或者要跟其他 GIS 圖層放在一起分析的路線。
兩種格式互相轉換
把 GPX 轉成 GeoJSON 是常見也很成熟的一步,GPSBabel 這類工具,還有不少免費的網頁轉換工具,一次操作就能完成,路線的形狀轉換後原樣保留。但轉換之後具體剩下什麼,取決於用的是哪個工具:有的會悄悄把時間戳記丟掉,有的會把它塞進 properties 物件裡,接收端的工具不一定會去那裡找。如果後面還要用到時間資訊,轉換完最好檢查一下輸出結果。
反過來,把 GeoJSON 轉回 GPX,座標本身能轉得很乾淨,但轉換工具能補回來的時間戳記,僅限於 GeoJSON 裡原本就保留下來的那部分。一個從來沒存過時間資訊的 GeoJSON 檔案——由於 GeoJSON 並不要求必須有時間資訊,大多數檔案都是這樣——轉出來的 GPX 軌跡會一個時間戳記都沒有:地圖上是條對的線,但對需要移動時間或配速的平台來說,基本派不上什麼用場。
TrailCam 匯出的是什麼
TrailCam 用 GPS 記錄路線,單條路線或整段歷史都能匯出成 GPX 1.1,也能匯出 CSV 彙總,不匯出 GeoJSON。對一次健行來說,GPX 這個格式保留的正是讓它成為「記錄」而不是「畫出來的線」的那部分——每個點上的時間戳記,移動時間、配速、爬升全靠它才能算出來,Strava、Garmin Connect、Komoot 也都能不丟東西地直接讀取這個檔案。匯出是可選的 TrailCam Pro 功能,App 本身免費下載。
常見問題
- GeoJSON 比 GPX 更適合健行嗎?
- 如果是想完整保留一次記錄下來的健行,不適合。GeoJSON 沒有專門存時間的欄位,轉換出來的軌跡會丟掉計算移動時間、配速和爬升所依賴的時間資訊,除非轉換工具專門想辦法用非標準的方式把它保留下來。GPX 把這份時間資訊當作格式的核心部分來攜帶。
- 為什麼轉成 GeoJSON 之後我的路線跑到別的地方去了?
- 多半是經緯度順序搞反了。GeoJSON 永遠把經度寫在緯度前面,GPX 自己的屬性順序正好相反。轉換工具或自己寫的指令碼一旦把這個順序弄錯,不會跳出錯誤提醒,只會把路線畫到地球上完全不同的地方。
- TrailCam 能匯出 GeoJSON 嗎?
- 不能。TrailCam 匯出的是 GPX 1.1 或 CSV 彙總,兩者都會在每個點上保留時間戳記——這正是 Strava、Garmin Connect、Komoot 都需要的東西,回放這次健行也要靠它。
記錄你自己的軌跡
TrailCam 是一款 iPhone 上的 GPS 軌跡記錄 App,會把沿途拍下的影片、照片與語音釘在你拍它的那個位置,並支援匯出成 GPX 1.1 或 CSV。免費下載。