想要從 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,
終於就可以用一般的程式處理它了。
先這樣安裝
osmtogeojson: sudo 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")
撈到什麼有趣的資料? 請分享一下吧!
要從osm.pbf截取資料的話,gdal的ogrinfo或是osmium也都是不錯的指令
回覆刪除