taki["blog"] = 2022

社会人8年目(東京5年目)の日常

Open Street Map(OSM)の操作(その1)

pythonであればOSMnxのように操作用のライブラリが充実しているけど、あえてosmファイルを読み込みながら自分でグラフ処理を行う例を書いた。今回はXMLファイルがメモリ上に乗る程度(=lxmlでパースできる)範囲のもので、これ以上大規模なデータについては後日。

ダウンロード

公式サイトからダウンロードできるが、APIがうまく動かない場合がある。添付図は広島市の例。

f:id:takilog:20180529224207p:plain

OSMファイルをnetworkxのオブジェクトに変換する

lxmlで操作すれば良い。nodeで地図上の接点を、waysで連結路を取得し、頂点と辺に変換する。一方通行やhighwayタグの取得方法はもう少し工夫できそう。highwayタグについては公式サイトを確認すると情報がまとめられているが、上の方の道を取ってくればそこそこ抽象度の高い地図となる。

gist.github.com

このサイズのグラフはnetworkx(w/ matplotlib)の描画が重すぎて動かないと思われるため、適当に辺と頂点を削除するようにしている(extraction.py参照)。いずれも1万以下程度であれば、特に問題なく描画できる。

gist.github.com

可視化結果

地図と似たような形のグラフ構造を描画することができる。

f:id:takilog:20180529224854p:plain