🧭

Pythonで簡単に経路探索をする

2023/10/07に公開

はじめに

近年, Google Maps APIやApple Maps APIなどを用いて簡単に経路探索を行うAPIが開発者向けに提供されていますが, 従量課金制のサービスが多数です.Google Maps APIは200ドル分の利用枠が無料で提供されますが, コストをあまり掛けたくない, クレジットカードを持っていない, そして経路探索を試してみたい人にはなかなか手を出しづらいのではと思っています.

現在, 私は学士研究で車両走行データの解析結果をもとに経路探索を行うサービスの実装をしていますが, コストは掛けないという制約が出されています.

これを満たすようなサービスがないかと調査してみたところ, OSMnxというPythonライブラリが使えそうです.

今回は, 地理空間情報を用いて経路探索をしてみたいという人に向けて, OSMnxの経路探索を紹介していきます.

OSMnxってなによ

OSMnxは, Geoff Boeing氏が開発した, OpenStreetMapから地理空間情報をダウンロードしモデル化, 分析, 可視化が可能なライブラリです.
数行のコードを書くだけで地理空間情報のダウンロード, 地図の近似ノード取得, 経路探索を実現します.

OpenStreetMap自体フリーのマップサービスで, 有志の開発者によってAPIが提供されているのでコストを掛けることなく地理空間情報が扱えます.

環境

  • Macbook Pro (2022) M2 Apple Silcon
  • Python 3.11.2

準備

必要なパッケージの準備
pip3 install osmnx
pip3 install scikit-learn

※OSMnxの一部モジュールにScikit-learnが使用されているため, インストールしないとエラーが発生します.

経路探索を行う

準備が完了したら, 早速経路探索を行ってみます.
今回は, 東京都港区の地理空間情報をダウンロードし,
六本木ヒルズから虎ノ門ヒルズまでのルートを探索してみます.
経路探索は車道のみで行い, 歩行者や二輪車の考慮はしません.

route.py
import osmnx as ox

# 経路探索対象地域を設定
area = 'Minatoku,Tokyo,Japan'

# 車道のみでグラフを作成
G = ox.graph_from_place(area, network_type='drive')

# 出発点は六本木ヒルズ, 到着点は虎ノ門ヒルズに指定
departure = (35.660000, 139.730000)
destination = (35.666797, 139.749408)

# 2地点の近似ノードを取得する 
#  経度(longitude), 緯度(latitude)の順番であることに注意

dep_node = ox.nearest_nodes(G, departure[1],departure[0])
des_node = ox.nearest_nodes(G, destination[1],destination[0])

# 最短経路探索
shortest_route = ox.shortest_path(G, dep_node, des_node)

# 探索ルートを可視化
ox.plot_graph_route(G, shortest_route)

可視化されたルート

経路探索が完了すると, 以下のように出発地から到着地までのルートが赤い線で引かれます.
ox.shortest_pathのweightオプションでノード間の長さを指定したり, 今回は詳しい手順は省略しますが, 別途旅行時間の重みを設定することにより, 条件を指定した経路探索を行うことが可能です.
また, 地理空間情報に各道路の速度制限を追加し住宅地はあまり通りたくないから遅めにみたいなことも設定できます.

他にも様々な関数(ノードの消去など)があるので, 自由自在にPythonで地理空間情報が扱えます.

余談

経路探索結果はPandasのデータフレームで格納されているので, 座標だけ抜き出してフロントエンド・モバイル側にJSON形式で投げて可視化ということも可能です.
もしマップアプリを作りたいという方がいれば, OSMnxを試してみる価値はあると思います.

おわりに

今回は, Pythonで経路探索を行う方法を紹介しましたが,
これから地理空間情報を扱う方や経路探索を試したい方,
簡易的なマップアプリを作りたい方の役に立つことができればなと思っています.

Discussion