Python の overpy を用いて OpenStreetMap のデータをダウンロード
先人に感謝
キーワード: OpenStreetMap, Python, overpy, 地図データダウンロード, ポイント, ライン, エリア, タグ
前準備
Python のインストール(Windows上)
注:既にPython(バージョン3.12を推奨)がインストール済みの場合は,この手順は不要である.
winget(Windowsパッケージマネージャー)を使用してインストールを行う
- Windowsで,管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー >
cmd
と入力 > 右クリック > 「管理者として実行」)。 - winget(Windowsパッケージマネージャー)が利用可能か確認する:
winget --version
- Pythonのインストール(下のコマンドにより Python 3.12 がインストールされる).
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f REM Python をシステム領域にインストール winget install --scope machine --id Python.Python.3.12 -e --silent REM Python のパス set "INSTALL_PATH=C:\Program Files\Python312" echo "%PATH%" | find /i "%INSTALL_PATH%" >nul if errorlevel 1 setx PATH "%PATH%;%INSTALL_PATH%" /M >nul echo "%PATH%" | find /i "%INSTALL_PATH%\Scripts" >nul if errorlevel 1 setx PATH "%PATH%;%INSTALL_PATH%\Scripts" /M >nul
- Python詳細ガイド:Pythonまとめ »
【関連する外部サイト】
【サイト内の関連ページ】
Visual Studio 2022 Build Toolsとランタイムのインストール
管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行する。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要である。
REM Visual Studio 2022 Build Toolsとランタイムのインストール
winget install --scope machine Microsoft.VisualStudio.2022.BuildTools Microsoft.VCRedist.2015+.x64
set VS_INSTALLER="C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe"
set VS_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools"
REM C++開発ワークロードのインストール
%VS_INSTALLER% modify --installPath %VS_PATH% ^
--add Microsoft.VisualStudio.Workload.VCTools ^
--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 ^
--add Microsoft.VisualStudio.Component.Windows11SDK.22621 ^
--includeRecommended --quiet --norestart
必要なPythonライブラリのインストール(Windows上)
- Windowsで,管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー >
cmd
と入力 > 右クリック > 「管理者として実行」)。 - 以下のコマンドを実行し,必要なライブラリをインストールする.
pip install -U 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,緯度,経度