Archives

OpenStreetMapのwayデータをcsvにしてgephiでnode positionも付けて表示する

タイトルのまんま。まずはOpenStreetMap.orgに行って目的の場所を表示する。

8f4601311e11b61b68c6ef306014d238-1024x511

画面上の「エクスポート」ボタンをクリックしてエクスポート画面を呼び出したら、「エクスポート」でデータのダウンロードが開始される。範囲が広すぎるとダウンロードされないので、そういうときはエクスポートボタン下のOverpass APIとかからダウンロードする。OpenStreetMap JapanはUIが違ってエクスポート方法はよくわからない。

これでダウンロードされるファイルは「.osm」と拡張子のついた(もしくは拡張子の無い)ファイルだが、実態はXMLである。

OSM XML – OpenStreetMap Wiki

データは「ノード」とその連続する集合である「ウェイ」、ノードやウェイの集合である「リレーション」からなる。簡単に言えば点と線とグループといったところ。道の情報を取り出したいので「ウェイ」の部分を”始点ノード,終点ノード”のcsvファイルに直したい。またノードやウェイ、リレーションには図のような感じで<tag k=”ラベル(key)” v=”値”>のように特徴が記述されている。これらも必要なものは取り出したい。

スクリーンショット_122413_031316_AM

という訳でXMLをパースしてそれを取り出すスクリプトを書いた。

https://gist.github.com/Drunkar/8102028#file-osm_extractway-py

https://gist.github.com/Drunkar/8102055#file-osm_extractnode-py

例えばosm_extractWay.pyを実行すると、ファイル名は?と聞かれるので同じフォルダに置いてあるosmファイルの名前を入力する。そしたら、ウェイに定義されてるすべてのkeyが表示されるので、表示したいものだけをカンマ区切りで指定。

スクリーンショット_122413_021210_AM

「ええのんか?」と聞かれるのでy。そしたら*_edges.csvが出力される。

スクリーンショット_122413_021821_AM

それでここからはそれをgephiで表示させる話。gephiでは「始点ノードID,終点ノードID」という形のcsvファイルでグラフをインポートできる(辺が登場する回数がそのまま重みになる)ので、srcとdstの列だけを残す。ラベルの1行目は消す。それでgephiにインポートすると以下の感じになる。

スクリーンショット_122413_022716_AM

「僕の知ってる烏丸四条と違う…」

というのも座標がランダムで与えられているので当たり前。しかしgephiはノードに座標を与えるのがちょっと面倒くさい。まず、「データ工房」でデータのエクスポートを行う。ノードテーブルと辺テーブルのどちらもエクスポートする。*_edges.csv[Nodes].csvみたいなファイルで出力されているノードテーブルに、osm_extractNode.pyで出力したノード情報の「lat」(緯度)と「lng」(経度)の列を追加。

スクリーンショット_122413_023902_AM

(latとlngは描画を見やすくするため5000倍に再マッピングしている。)

nodeリストに登場しているけれどedgeの端点としては出てこない点ももちろんあるのでそれは消す。

ここまで出来たらようやく表示することができる。gephiで新規プロジェクトを作成。いきなり「データ工房」から「ノードテーブル」をインポートする。必ずノードテーブルから。「lat」と「lng」を「float」で取り込みます。

続いて”karasuma.osm_edgelist [Edges].csv”を辺のテーブルとして取り込みます。
取り込めたらlatとlngの値をノードの位置として設定します。これにはgephiのプラグインの”Data Laboratory Helper”が必要。

Gephi forums ・ View topic – [TODO] Preset x and y coordinates

プラグインをインストールしたら、「データ工房」>「作業を継続」>「Set standart column」を選択

スクリーンショット_122413_024706_AM「Column」を「lat」に、「Copy to」を「Y-coordinate」にして「Set column」をクリック。すると「OK」という表示が出ます。出ない場合は「lat」列とnodeの数が合ってません。同様に「lng」を「X-coodinate」にセット。最後に「OK」をクリック。

そして「概観」に戻ると・・・

スクリーンショット_122413_030103_AM

 

おおおお。(なんか一部アレだけど)それっぽい。試しに地図の画像となんとなく合わせてみると、

karasumaGousei

 

いい感じ。しかしOpenStreetMapはGPSのプロットデータなのでノードがやたらと多い。試しに下の図で示すぐらいもっと大きな範囲でやってみたところ、*_edges.csvのデータ量が30GB近くになってしまった。スクリーンショット_121813_085638_PM

ノードは交差点だけでいいから、隣接ノードとの角度からノードを減らすようにする必要がありそう。それはまた今度