Python の overpy を用いて OpenStreetMap のデータをダウンロード
先人に感謝
キーワード: OpenStreetMap, Python, overpy, 地図データダウンロード, ポイント, ライン, エリア, タグ
前準備
Python のインストール(Windows 上)
【サイト内の関連ページ】
- Windows での Python 3.10,関連パッケージ,Python 開発環境のインストール(winget を使用しないインストール): 別ページ »で説明
- Windows での Anaconda3 のインストール: 別ページ »で説明
- Python のまとめ: 別ページ »にまとめている.
【関連する外部ページ】 Python の公式ページ: https://www.python.org/
(Windows の場合のみ)マイクロソフト C++ ビルドツール (Build Tools) のインストール
Windows での Build Tools for Visual Studio 2022 のインストール手順: 別ページ »で説明
Python のパッケージ overpy のインストール
- Windows のときは,コマンドプロンプトを管理者として実行
* Linux のときは,端末を開く(pyenvを使っているときは pip の実行に管理者権限を必要としない)
- 今のコマンドプロンプトで,次のコマンドを実行
pip install --ignore-installed --upgrade overpy
- インストールできたことの確認
バージョン番号が表示されれば OK
pip show overpy
* GitHub からソースコードをダウンロードしてインストールしたい場合
- Visual Studio の x64 Native Tools コマンドプロンプトを管理者として実行起動する
起動は,Windows のメニューで「Visual Studio 20..」の下の「x64 Native Tools コマンドプロンプト (x64 Native Tools Command Prompt)」を選ぶ.「x64」は,64ビット版の意味である.
* 「x64 Native Tools コマンドプロンプト (x64 Native Tools Command Prompt)」がないとき:
Visual Studio Community のインストールを行うことで, 「x64 Native Tools コマンドプロンプト (x64 Native Tools Command Prompt)」もインストールされる.その手順は,別ページ »で説明
- x64 Native Tools コマンドプロンプトで,次のコマンドを実行
python -m pip install -U pip pip install git+https://github.com/DinoTools/python-overpy
エラーメッセージが出ていないことを確認
バージョン番号が表示されれば OK
pip show overpy
Google Map を用いて緯度経度を調べてみる
あとでデータをダウンロードするときのために,Google Map を使って緯度・経度を調べてみる
- Google Map を開く
- Google Map で好きな場所に移動する
- 右クリックして,「この場所について」を選ぶ
- 緯度,経度が表示されるので,メモしておく
Python を用いて OpenStreetMap のデータをダウンロード
Python プログラムの実行
- Windows では python (Python ランチャーは py)
- Ubuntu では python3
【サイト内の関連ページ】 Python のまとめ: 別ページ »
- Python で,ダウンロードしたい地図の緯度と経度の設定
次の Python プログラムを実行
*さきほど調べた緯度と経度
(実行例)
lat = 34.4461 lon = 133.2315
- 欲しいデータのタイプの設定
OpenStreetMapの「ライン」のデータのうち,「highway」であるようなデータが欲しいとする. OpenStreetMap には,ポイントやラインやエリアには,「highway」のようなタグ付いている.
引き続き、次の Python プログラムを実行
type = 'highway'
- lat, lon, type の設定が終わったところで,spyder のコンソールで,次のプログラムを実行し,データのダウンロードと表示を行う.
* OpenStreetMapもタイル地図だが,次のプログラムでは,最下位のレイヤ(もっとも詳細なレイヤ)からダウンロードが始まる
次の Python プログラムを実行
import overpy api = overpy.Overpass() result = api.query(""" way(%f, %f, %f, %f) [%s]; (._;>;); out body; """ % (lat - 0.01, lon - 0.01, lat + 0.01, lon + 0.01, type) ) for way in result.ways: print("Name: %s" % way.tags.get("name", "n/a")) print(" Highway: %s" % way.tags.get("highway", "n/a")) print(" Nodes:") for node in way.nodes: print(" Lat: %f, Lon: %f" % (node.lat, node.lon))
表示を確認.(道路がないようなところを緯度経度で指定していると表示は空になる). 道路のデータである.緯度経度が並んでいる.
- 「ライン」のデータの確認
- ラインが線分のとき: 端のポイントが2個
- ラインが折れ線のとき: 端のポイントが2個で,途中のポイントがある
次の Python プログラムを実行
result.ways
- 表示の1行: 1個の「ライン」オブジェクト
- 各行の nodes = [] の中身: 端のポイントや途中のポイントのID
- 「ノード」のデータの確認
次の Python プログラムを実行
result.nodes
- 表示の1行: 1個の「ポイント」オブジェクト
- 各行の中身: ID,緯度,経度
まとめ
- ラインのデータ: ポイントのIDが2個以降並んでいる
- ポイントのデータ: ID,緯度,経度