自転車用経路探索ソフトを作ってみた

突然ですが,下のAからBへの最適な経路はどのようなルートが考えられるでしょうか.

最短経路を考えれば下のようになります.多くの経路探索サービスでもほぼ同様なルートが出るでしょう.

しかし,このルートを自転車で走ろうとするとどうなるでしょう.国土地理院の地理院地図を見てみましょう.

出典:国土地理院ウェブサイト, 自分で作る色別標高図

実はこのあたり結構高低差が激しいです.しかもさっきのルートは尾根と谷を何度も横断するようなルートとなっており,自転車で通るにはとても厳しいルートとなっています(少なくとも貧弱な私には).

そこで,なるべく傾斜をよけて目的地へ向かうようなルートを検索してくれるソフトウェアを作成しました.そのソフトウェアで出したルートが下のようになっております.地理院地図と見比べていただければ,うまく高低差の激しいルートを避けて最低限の上下で向かえるルートになっていると思います.


使用したライブラリ,データ

OSMnxとFoliumというライブラリを使いました,前者はOpenStreatMapを利用して地理データの操作が行えるライブラリ,後者は地理データの可視化をするためのライブラリです.両者ともに少々インストールが特殊なので,利用する際は以下のサイト等を参考にしていただけるとよいと思います.
GeoPandasのインストールに失敗した場合の対処法(Fiona/GDALのエラー + Rtreeのインストール) | USHITORA Lab.

また,高低差のデータはOpenStreatMapには登録されていないようで,OSMnxでデータを得るにはGoogleMapsAPIを経由する必要があります.これを使うこともできなくはないのですが,今回の用途ではリクエスト数が膨大になり,とても私には払えない金額になりそうなのでこれは使えません.

しかしながら,国土地理院の基盤地図情報サービスで細かな標高データを無料でダウンロードすることができます(登録必要,用途によって別途申請などが必要なので注意).今回はこちらを使わせていただきます.

このような高品質なデータを無料で使わせていただけるのは学生には非常にありがたいサービスです.

大まかな方針

OSMnxに,ox.shortest_path()という,経路グラフ上の最短距離を探索する関数があります.このオプションで各辺のコストを指定することができます.そのため各辺に対して,距離,高低差,勾配の大きさ等に応じた独自のコストを作成して,それで最短経路探索をさせました.

感想

正直最終的に行っていることはそれほど難しいことではなく,一番難しかったのはどの方法で実現するかを考えるところでした.この方法ならここまでできるとわかってもその先の手段が実現的でなかったりその逆だったりというパターンをいくつか踏んで苦労しました.初めてGISデータを取り扱ったこともあり,慣れないデータ形式に少し手間取りましたが,何とか実用的なものを作れました.似たようなものを作りたいという方に,このような方法があるという参考になれば幸いです.
また,地理データを扱う際,表現が変わるとデータの整列順序が変わるのが非常に紛らわしかったです.北半球では各地点を直感的に行列上で表そうとすると,行番号が上がるにつれて低緯度方向に移動するので,この方向で表現されているデータと逆方向に整列されたデータがあり,それらを変換する必要があるので少々面倒でした.