OSMnxはOpenStreetMap のデータを取得できるPythonライブラリーです。
ここでは、Windows上のAnacondaで使ってみます。
最新のAnacondaなどではosmnxのimportでエラーになる場合があります(モジュールのバージョン違い?)。
動作が確認できているのはWindows 10 + Anaconda3-5.3.1-Windows-x86_64(64-bit)です。
Anacondaのインストーラーはここなどを参照。
インストール自体に特に難しいところはありません。
インストール後、Anaconda Prompt(Anaconda3)を起動し、以下のコードを実行。
conda-forgeを高優先度にする
1 |
>conda config --prepend channels conda-forge |
仮想環境にOSMnxをインストール。
1 |
>conda create -n ox --strict-channel-priority osmnx |
strict-channel-priorityという引数が分かりません…..とかいうエラーが出た場合は
>conda create -n ox -c conda-forge osmnx
環境をアクティベートしてosmnxを使用できるようにして、Pythonコンソールを開きます。
1 |
>conda activate ox |
1 |
>python |
OSMnxを使って道路ネットワーク情報を取得してみます。
例えば….
「大阪府のすべての道路に関する情報を取得してShape形式でデータをダウンロード」
ちなみに以下の環境で実行時間は5時間ほどでした。
Windows 10 64bit、Intel Core i3 3.1GHz RAMー>4GB
1 |
>>>import osmnx |
1 |
>>>G = osmnx.graph_from_place(f'Osaka, Japan') |
1 |
>>>osmnx.save_graph_shapefile(G,filename='osaka_all') |
Shapeファイルは格納先を指定しない場合はdataというフォルダーが作成されその中にedgesとnodesの2つのカテゴリで保存されます。
必要なのはedgesです。
QGISで読み込むとこんな感じ。
属性テーブルです。
5時間はあんまりなので、対象を絞ってみます。
「吹田市の私道でないすべての道路や小道を取得してShape形式でデータをダウンロード」
これなら、2~3分で実行終了しました。
1 2 3 |
>>>import osmnx >>>G = osmnx.graph_from_place('Suita,Japan',network_type='all') >>>osmnx.save_graph_shapefile(G,filename='suita_all') |
ちなみにnetwork_typeは以下のようなものがあります。
drive
– 運転可能な公道を取得する(ただし、整備道路は取得しない)drive_service
– 整備道路を含む運転可能な道路を取得するwalk
– 歩行者が使用できるすべての道路と小道を取得する(このネットワークタイプは一方通行は無視します)bike
– サイクリストが使用できるすべての道路と小道を取得するall
– すべての私道でないOSMの道路と小道をダウンロードするall_private
– 私道を含むすべてのOSMの道路と小道をダウンロードする
こんな感じです。
最短経路探索してみます。
こんな感じ。
万博記念公園の迎賓館からパナスタへ向かう最短経路です。
Shape形式ではなくCSV形式でデータを取得してみます。
実行時間は1時間半くらいでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import pandas as pd import osmnx import csv G = osmnx.graph_from_place(f'Osaka, Japan', network_type='drive') # nodes node=pd.DataFrame(osmnx.save_load.graph_to_gdfs(G, nodes=True, edges=True, node_geometry=True, fill_edge_geometry=True)[0]) # edges edge=pd.DataFrame(osmnx.save_load.graph_to_gdfs(G, nodes=True, edges=True, node_geometry=True, fill_edge_geometry=True)[1]) # csv形式で出力。 node.to_csv(f'osaka_nodes.csv') edge.to_csv(f'osaka_edges.csv') |
edgeはこんなデータです。
QGISで読み込む場合はデリミテッドテキスト。
サンプルは66万行以上あるので、結構時間がかかります。
別々に取得した隣接する2つの地域のネットワークは、当然のことながら、連続していません。
結合する2つのノードを探して、接続するエッジ(リンクとも言う)を新しく作成すれば、2つの地域のネットワークは連続します。
やり方は?
これを実行できるアルゴリズムを探すか作る、あるいはツールやライブラリを探すか作る。
ArcGISなら簡単にできるのかな?
工事中
graph_from_place()では、場所の指定は住所の英語表現の順に記述します。
例えば大阪府は’Osaka,Japan’ですが、もっと範囲を絞って「淀川区」のような場合は’Yodogawa-ku,Osaka,Osaka,Japan’になります。
行政区をまたぐような場合は、Place指定ではなく範囲を指定する方法もあります。
バウンディングボックスなら
graph_from_bbox(north,south,east,west,network_type=’all’)
バウンディングボックスの四つの値はOpenStreetMapにアクセスしてエクスポートをクリックすると画面の領域の範囲で表示されます。
「ドラッグして別の領域を選択」をクリックすれば、白っぽい枠で範囲を指定できます。
地点座標と距離(例えば1km)で指定する場合は
graph_from_point((latitude,longitude),distance=1000,network_type=’all’)
地点座標はGoogleMapsナビゲーションV3などで取得できます。
距離の目安ならGoogle Maps 距離計算(積算)V3などをご参照ください。
抽出範囲例
ちなみに、Webサービスを使う場合は、Webサービスを使って道路ネットワークを取得してみるをご参照ください。
OpenStreetMapの道路ネットワークデータも100%ではありません。
OSMは自分で編集することもできますが、事前に知っておくべきことがいくつかあります。
下記のようなサイトを参照しておきましょう。
Leave a Reply