OSMnxに関する日本語の記事があまりなく,英語弱者の自分には情報収集が大変すぎました...
そこで他の英語弱者の役に立てばいいなと書きました.
なので英語弱者による,英語弱者のための,OSMnx入門記事となります.
#1.OSMnxについて
OSMnxとはなんぞや?と思う人も多いと思うので,初めに少し説明をしておきます.
まずOpenStreetを知っていますか?
###OpenStreetMapとは
wikipediaの地図版だと思って下さい.
誰でも書けて,誰でも使える地図,それがOpenStreetMapです.
この地図には,地名や道路などの情報が書き込まれています.
そしてその情報を使うため開発されたのがOSMnxです.
###OSMnxとは
OpenStreetMapの地図のデータを使うためのPythonのパッケージです.
地図データを取得したり,分析したり,視覚化したりすることができます.
#2.OSMnxをインストールする手順
開発者様が書いたインストール方法で簡単にできたので,それを載せときます.
###STEP1
まず初めにAnacondaを入れましょう.Anacondaの入れ方は他サイトを参照して下さい.
pipコマンドでやる方法も色んなサイトで示されていますが,Geopandasとかインストールする際にエラーがでて詰まりやすいです(体験談)
###STEP2
Anacondaを入れたら,この2つのコマンドを打つだけです.
conda config --prepend channels conda-forge
conda create -n ox --strict-channel-priority osmnx
これでもうAnacondaの仮想環境ox上でOSMnxを使える状態となります.
OSMnxを使うときは,Anaconda Promptを開いた時
activate ox
とコマンドを打って仮想環境oxに切り替えて下さい.
#3.OSMnxによる最短経路探索
OSMnxのインストール方法だけだとあまりに味気なかったんで,最短経路探索を添えておきます.
今回は東京スカイツリーを中心として道路ネットワークを取得します.
OpenStreetMapで見ると東京スカイツリー周辺の道路はこのような感じです.
そしてOSMnxで,道路ネットワークを取得し表示した画像です.
この道路ネットワークの種類と取得方法を詳しく見ていきましょう.
##道路ネットワークの種類
道路といっても歩行者用もあれば車用もありますよね?
なので色んな種類の道路ネットワークが取得できます.
- 'drive' - 車が通れる公道
- 'drive_service' - 車が通れる公道+サービス道路を含む?(ここの訳が不明です)
- 'walk' - 歩道
- 'bike' - 自転車が通れる道路
- 'all' - 私道でない全ての道路
- 'all_private' - 私道も含む全ての道路
今回は'drive'の道路ネットワークを取得しています.
##道路ネットワークの取得方法
道路ネットワークの取得する時に
- 緯度と経度
- 地名
- 住所
などのいづれかを指定します.
今回は緯度と経度を指定し,道路ネットワークを取得しています.
###緯度と経度による取得
緯度と経度から道路ネットワークを取得する関数はこれです.
ox.graph_from_point(center_point, dist=300, network_type='drive')
- center_point - 緯度,経度の入ったタプル
- dist - 指定した所から何メートル以内のデータを取るか
- network_type - どの種類の道路ネットワークを取るか
他にも引数はありますが,省略
##最短経路探索
ここまでで道路ネットワークの取得方法見てきました.
道路ネットワークを取得しさえすれば,最短経路探索はこの関数で簡単に計算できます.
ox.shortest_path(G, orig, dest, weight='length')
- G - 入力のグラフ
- orig - スタートのノード
- dest - 目標のノード
- weight - 最短経路を求めるときは'length'を入れる
全体のコードは以下のようになります.
import osmnx as ox
# 東京スカイツリーの緯度,経度
location_point = (35.7100069, 139.8108103)
# 東京スカイツリーを中心に300m以内の車道のグラフ
G = ox.graph_from_point(location_point, dist=300, network_type='drive')
# 取得した道路ネットワークを表示
ox.plot_graph(G, node_color='r')
# ノードのorigからdestまでの最短ルートを計算
orig = list(G)[0]
dest = list(G)[1]
route = ox.shortest_path(G, orig, dest, weight='length')
#最短ルートを表示
ox.plot_graph_route(G, route, route_color='y', route_linewidth=6, node_size=0)
これを実行すると,このようなノードからノードまでの最短経路のグラフが出力されます.
ノードは今回適当に0個目と1個目を選んでいます.
最短経路っぽいルートがきちんと出力されるのが確認できました.
#参考資料
開発者様が書いたインストール方法
OpenStreetMap
開発者様のGithub
・サンプルプログラムが沢山上げられてます
OSMnxのモジュールの説明