LoginSignup
5
8

More than 3 years have passed since last update.

はじめてのOSMnx ~最短経路探索を添えて~

Last updated at Posted at 2020-10-30

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で見ると東京スカイツリー周辺の道路はこのような感じです.
tokyoSkyTreeMap.png

そしてOSMnxで,道路ネットワークを取得し表示した画像です.
tokyoSkyTreeGraph.png

重ねると一致していることがよくわかると思います.
overlay.jpg

この道路ネットワークの種類と取得方法を詳しく見ていきましょう.

道路ネットワークの種類

道路といっても歩行者用もあれば車用もありますよね?
なので色んな種類の道路ネットワークが取得できます.

  • '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'を入れる

全体のコードは以下のようになります.

shortestPath.py
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個目を選んでいます.

tokyoSkyTreeRoot.png

最短経路っぽいルートがきちんと出力されるのが確認できました.

参考資料

開発者様が書いたインストール方法
OpenStreetMap
開発者様のGithub
・サンプルプログラムが沢山上げられてます
OSMnxのモジュールの説明

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8