2015年7月18日 星期六

gpx 與 geojson 檔案格式互轉

GPX 跟 GeoJSON 都是常見的地理資料格式。 這一篇解釋如何互轉這兩種檔案格式。

[2023/7] 如果只是少少兩三個檔案, 我現在都是手動上傳到 umap, 再選擇想要的格式下載回來。 等於叫 umap 幫我轉就好了。 如果需要大量轉檔, 或寫進 script 自動處理, 才需要讀這篇。 請先安裝一個套件: apt-get install gdal-bin

什麼時候會想要把 gpx 轉成 geojson? 比方說, 從 GraphHopper 所匯出的路線規畫就是一個 gpx 檔。 以下就拿中興大學到朝陽科大的路線規畫 gh-cyut-nchu.gpx 來實驗。 注意: 當初從 GraphHopper下載 gpx 時, route、 track、 waypoints 三項資訊都要勾選。 其中 waypoints 包含起點、終點、中間手動設定的中繼點; 而 route 則包含 GraphHopper 所產生的左右轉指示點。 (實際上已經先經過前置處理: opencc < GraphHopper.gpx > gh-cyut-nchu.gpx 把簡體轉成正體。) 如果把 gh-cyut-nchu.gpx 直接上傳到 umap 或 mapbbcode, 會發現圖有點醜: 出現了不該有的長距直線、 路線指示文字也不見了。 另一方面, 如果可以改上傳 geojson 檔, 則可以指定標示點的圖像及顏色等等。

首先這樣嘗試: ogr2ogr -f geojson gh-cyut-nchu.json gh-cyut-nchu.gpx 注意! 放前面的是目的地檔; 放後面的是來源檔! 以上指定採 geojson 格式, 把 gh-cyut-nchu.gpx 轉成 gh-cyut-nchu.json。

但這會出現一個錯誤訊息: ERROR 6: GeoJSON driver doesn't support creating more than one layer 原來是因為 gpx 檔裡面有好幾個 layers; 但對 ogr2ogr 來說, geojson 格式永遠只能存放一個 layer 的資料。 還好 ogr2ogr 可以有第三個參數指定只從來源檔擷取一個 layer。

我胡亂試了好久才發現: 原來 layer 的名稱並非 xml 的標籤。 應該先用 ogrinfo -so -ro gh-cyut-nchu.gpx 查看來源檔, 發現它包含了五個 layers。 實驗之後發現: 我們只對其中 tracks (路徑) 跟 route_points (帶有說明文字的左右轉指資訊) 這兩個 layers 比較有興趣, 於是這樣擷取:

ogr2ogr -f geojson gh-cyut-nchu-TRACKS.json gh-cyut-nchu.gpx tracks
ogr2ogr -f geojson gh-cyut-nchu-RPTS.json gh-cyut-nchu.gpx route_points

所產生出來的 gh-cyut-nchu-TRACKS.json 跟 gh-cyut-nchu-RPTS.json 這兩個 geojson 檔就可以分別上傳到 umap 或 mapbbcode 上面去了。 至於如何把圖徵修漂亮實用一點, 另文再談。

[2022/6/5] 反過來, 如果你手中有 geojson 格式的圖資, 也可以用 ogr2ogr 把它轉成 gpx 格式。 例如從 ptx 公共運輸資訊撈出來的 json 格式 台中市 151 公車停靠站, 用 zq 轉出來的 geojson 格式, 如果想要進一步把它 匯入 osmand 成為我的最愛, 就必須轉成 gpx 格式: ogr2ogr -f gpx tcbus-151.gpx tcbus-151.geojson 原先的 geojson 檔當中, 凡是有 gpx 格式不認得的欄位 (例如 "description") 都會被丟棄。 如果想要保存這些欄位, 可以這樣下: ogr2ogr -f gpx -dsco GPX_USE_EXTENSIONS=YES tcbus-151.gpx tcbus-151.geojson 。 從 官網文件 看來的。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。