2017年11月3日 星期五

osm pbf 資料庫離線查詢必備指令

臺灣的各大學校園範圍 (臺北地區) 想要從 OSM 撈有趣的座標資料, 先前介紹過 Overpass Turbo 等等網頁工具。 如果你需要經常查詢、 需要寫程式查詢、 不想一直連線、 想要撈的資料量較大, 那麼還有另一個選擇: 直接下載 OSM 原始資料庫。 從 國網的映射 可以下載全球資料庫, 目前大約有 60G, 或是從 geofrbrik 可以下載按照國家或區域拆開的個別資料庫, 例如 臺灣 目前大約有 60M。

下載回來的是 (具有壓縮效果的) PBF 二進位檔案格式。 要先把它轉成 .osm 格式才好後續處理。 請安裝 osmctools 套件, 然後: osmconvert TW.pbf > TW.osm 。 結果從一個 60M 的檔案產生出一個 1.2G 巨無霸大檔! (不敢想像整顆藍星的資料轉成 .osm 會變多大...)

再來要從裡面撈一小部分有興趣的資料。 因為 .osm 是 xml 格式, 所以我試過用 xmlstarlet 跟 xml2json.py 過濾資料, 結果都是 out of memory 收場。 我猜因為 xml 是樹狀而非線性結構, 所以通用的 xml 程式都必須把所有資料吃進記憶體才能開始處理, 無法逐筆處理。 (可是我這部電腦有 16G 的 ram 啊?) 總之, 最後還是用 osmctools 裡面、 認得 .osm 特定格式的 osmfilter 過濾器才成功轉檔: osmfilter TW.osm --keep="amenity=university" > university.osm。 經過漫長的 47 秒, 產生出 1.4M 的 university.osm, 終於就可以用一般的程式處理它了。

先這樣安裝 osmtogeojsonsudo npm install -g osmtogeojson 然後用它把 .osm 轉成 .geojson: osmtogeojson university.osm > university.geojson 。 它也可以從 stdin 讀資料, 所以過濾跟轉檔可以一氣呵成: osmfilter TW.osm --keep="amenity=university" | osmtogeojson > university.geojson

接下來的 geojson 就很好處理了。 例如可以用 potluckmap 或其他 osm 私房地圖工具 去顯示它。 或是用 json 轉檔瑞士刀 去分析它的欄位, 例如數一下有幾筆資料: jq '.features | length' university.geojson 或是抓出 「只有單一座標、 沒有多邊形範圍」 的所有資料: jq '.features | map(select(.geometry.type=="Point"))' university.geojson。 你用 各種圖徵名稱 (例如上面的 "amenity=university") 撈到什麼有趣的資料? 請分享一下吧!

1 則留言:

  1. 要從osm.pbf截取資料的話,gdal的ogrinfo或是osmium也都是不錯的指令

    回覆刪除

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