2015年7月18日 星期六

把 gpx 檔案格式轉換成 geojson

GPX 跟 GeoJSON 都是常見的地理資料格式。 這一篇解釋如何將 GPX 轉成 GeoJSON。 請先安裝一個套件: 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 上面去了。 至於如何把圖徵修漂亮實用一點, 另文再談。

沒有留言:

張貼留言