タイトルのまんま。まずはOpenStreetMap.orgに行って目的の場所を表示する。
画面上の「エクスポート」ボタンをクリックしてエクスポート画面を呼び出したら、「エクスポート」でデータのダウンロードが開始される。範囲が広すぎるとダウンロードされないので、そういうときはエクスポートボタン下のOverpass APIとかからダウンロードする。OpenStreetMap JapanはUIが違ってエクスポート方法はよくわからない。
これでダウンロードされるファイルは「.osm」と拡張子のついた(もしくは拡張子の無い)ファイルだが、実態はXMLである。
データは「ノード」とその連続する集合である「ウェイ」、ノードやウェイの集合である「リレーション」からなる。簡単に言えば点と線とグループといったところ。道の情報を取り出したいので「ウェイ」の部分を”始点ノード,終点ノード”のcsvファイルに直したい。またノードやウェイ、リレーションには図のような感じで<tag k=”ラベル(key)” v=”値”>のように特徴が記述されている。これらも必要なものは取り出したい。
という訳で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が表示されるので、表示したいものだけをカンマ区切りで指定。
「ええのんか?」と聞かれるのでy。そしたら*_edges.csvが出力される。
それでここからはそれをgephiで表示させる話。gephiでは「始点ノードID,終点ノードID」という形のcsvファイルでグラフをインポートできる(辺が登場する回数がそのまま重みになる)ので、srcとdstの列だけを残す。ラベルの1行目は消す。それでgephiにインポートすると以下の感じになる。
「僕の知ってる烏丸四条と違う…」
というのも座標がランダムで与えられているので当たり前。しかしgephiはノードに座標を与えるのがちょっと面倒くさい。まず、「データ工房」でデータのエクスポートを行う。ノードテーブルと辺テーブルのどちらもエクスポートする。*_edges.csv[Nodes].csvみたいなファイルで出力されているノードテーブルに、osm_extractNode.pyで出力したノード情報の「lat」(緯度)と「lng」(経度)の列を追加。
(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」を選択
「Column」を「lat」に、「Copy to」を「Y-coordinate」にして「Set column」をクリック。すると「OK」という表示が出ます。出ない場合は「lat」列とnodeの数が合ってません。同様に「lng」を「X-coodinate」にセット。最後に「OK」をクリック。
そして「概観」に戻ると・・・
おおおお。(なんか一部アレだけど)それっぽい。試しに地図の画像となんとなく合わせてみると、
いい感じ。しかしOpenStreetMapはGPSのプロットデータなのでノードがやたらと多い。試しに下の図で示すぐらいもっと大きな範囲でやってみたところ、*_edges.csvのデータ量が30GB近くになってしまった。
ノードは交差点だけでいいから、隣接ノードとの角度からノードを減らすようにする必要がありそう。それはまた今度
コメント