Python の overpy を用いて OpenStreetMap のデータをダウンロード
【概要】Pythonのoverpyライブラリを使用して、OpenStreetMapから地図データをダウンロードする方法を解説する。取得したデータは、地図アプリケーションの開発、経路探索、地理情報の分析などに活用できる。
【目次】
OpenStreetMap (https://www.openstreetmap.org)は、世界規模で利用可能な無料のオンライン地図データベースである。誰でも自由に利用・編集でき、地図データを様々な形式で取得できる。
先人に感謝
キーワード: OpenStreetMap, Python, overpy, Overpass API, 地図データ, ノード, ウェイ, タグ
前準備
Python のインストール(Windows上)
注:既にPython(バージョン3.12を推奨)がインストール済みの場合は、この手順は不要である。
winget(Windowsパッケージマネージャー)を使用してインストールを行う。
- Windowsで、管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー >
cmdと入力 > 右クリック > 「管理者として実行」)。 - wingetが利用可能か確認する。
winget --version
- Pythonをインストールする(下のコマンドにより Python 3.12 がインストールされる)。
REM Python 3.12 をシステム領域にインストール winget install --scope machine --id Python.Python.3.12 -e --silent --accept-source-agreements --accept-package-agreements REM パス長制限の解除 reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f reg query "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled REM Python のパス設定 set "PYTHON_PATH=C:\Program Files\Python312" set "PYTHON_SCRIPTS_PATH=C:\Program Files\Python312\Scripts" if exist "%PYTHON_PATH%" setx PYTHON_PATH "%PYTHON_PATH%" /M >nul if exist "%PYTHON_SCRIPTS_PATH%" setx PYTHON_SCRIPTS_PATH "%PYTHON_SCRIPTS_PATH%" /M >nul for /f "skip=2 tokens=2*" %a in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do set "SYSTEM_PATH=%b" echo "%SYSTEM_PATH%" | find /i "%PYTHON_PATH%" >nul if errorlevel 1 setx PATH "%PYTHON_PATH%;%PYTHON_SCRIPTS_PATH%;%SYSTEM_PATH%" /M >nul
【関連する外部サイト】
【サイト内の関連ページ】
- Python詳細ガイド:Pythonまとめ »
Visual Studio 2022 Build Tools とランタイムのインストール
overpyはコンパイラを必要としないが、データ処理でよく使用するnumpyやpandas等のライブラリはC/C++コンパイラを必要とする場合がある。将来的な拡張に備えて、Visual Studio Build Toolsをインストールしておくことを推奨する。
管理者権限でコマンドプロンプトを起動し(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)、以下を実行する。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要である。
REM Visual Studio 2022 Build Toolsとランタイムをシステム領域にインストール
winget install --scope machine --wait --accept-source-agreements --accept-package-agreements Microsoft.VisualStudio.2022.BuildTools Microsoft.VCRedist.2015+.x64
REM インストーラー、セットアッププログラム、インストールパス
set "VS_INSTALLER=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vs_installer.exe"
set "VS_SETUP=C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe"
set "VS_PATH=C:\Program Files\Microsoft Visual Studio\2022\BuildTools"
REM C++開発ワークロードのインストール
"%VS_SETUP%" modify --installPath "%VS_PATH%" --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --quiet --norestart
"%VS_SETUP%" modify --installPath "%VS_PATH%" --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --includeRecommended --quiet --norestart
"%VS_SETUP%" modify --installPath "%VS_PATH%" --add Microsoft.VisualStudio.ComponentGroup.ClangCL --includeRecommended --quiet --norestart
"%VS_SETUP%" modify --installPath "%VS_PATH%" --add Microsoft.VisualStudio.Component.VC.CMake.Project --includeRecommended --quiet --norestart
"%VS_SETUP%" modify --installPath "%VS_PATH%" --add Microsoft.VisualStudio.Component.Windows11SDK.22621 --includeRecommended --quiet --norestart
overpy ライブラリのインストール(Windows上)
- Windowsで、管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー >
cmdと入力 > 右クリック > 「管理者として実行」)。 - 以下のコマンドを実行する。
pip install -U overpy
Google Map を用いた緯度経度の取得
データをダウンロードする際には、対象地域の緯度と経度を指定する必要がある。ここでは、Google Mapを使用して緯度経度を調べる方法を説明する。
- Google Map(https://www.google.co.jp/maps)を開く。
- 目的の場所に移動する。
- 地図上で右クリックし、「この場所について」を選択する。
- 画面下部に緯度と経度が表示されるので、これを記録する。
Python を用いて OpenStreetMap のデータをダウンロード
Python プログラムの実行方法
- Windows では python(Python ランチャーは py)
- Ubuntu では python3
【サイト内の関連ページ】 Python のまとめ: 別ページ »
Overpass API と OpenStreetMap のデータ構造
Overpass APIは、OpenStreetMapのデータを検索・取得するための読み取り専用APIである。クエリを送信すると、条件に合致するデータが返される。overpyは、このAPIをPythonから利用するためのライブラリである。
OpenStreetMapのデータは、以下の3種類の要素で構成される。
- ノード(Node):緯度・経度を持つ点。店舗や信号機などの地物を表す
- ウェイ(Way):複数のノードを順に結んだ線。道路や建物の輪郭を表す
- リレーション(Relation):複数の要素をグループ化したもの。バス路線などを表す
各要素にはタグ(属性情報)を付与できる。タグは「キー=値」の形式で、例えばhighway=primaryは「主要道路」を意味する。
注意:公開されているOverpass APIサーバ(overpass-api.de)には利用制限がある。1日あたり約10,000リクエスト、ダウンロード量1GB以下が目安である。大量のデータを取得する場合は、Planet.osmの利用を検討すること。
データのダウンロード手順
- 緯度と経度の設定
前準備で調べた緯度と経度をPythonの変数に設定する。
次のPythonプログラムを実行する。
lat = 34.4461 lon = 133.2315
- データタイプの設定
取得するデータの種類をタグで指定する。ここでは「highway」(道路)タグを持つウェイを取得する。
次のPythonプログラムを実行する。
type = 'highway'
- データのダウンロードと表示
指定した緯度経度を中心に、±0.01度(約1.1km四方)の範囲内にあるデータを取得する。
次の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))
道路データが取得され、各道路の名前とノードの緯度経度が表示される。指定した範囲に道路がない場合、出力は空になる。
- ウェイデータの確認
取得したウェイ(道路などの線形データ)の一覧を確認する。
次のPythonプログラムを実行する。
result.ways
各行が1つのウェイを表す。
nodes = []内の数値は、そのウェイを構成するノードのIDである。 - ノードデータの確認
取得したノード(点データ)の一覧を確認する。
次のPythonプログラムを実行する。
result.nodes
各行が1つのノードを表し、ID、緯度、経度の情報を持つ。
まとめ
- ウェイ:2個以上のノードIDで構成される線形データ
- ノード:ID、緯度、経度を持つ点データ