Python の overpy を用いて OpenStreetMap のデータをダウンロード
【目次】
先人に感謝
キーワード: OpenStreetMap, Python, overpy, Overpass API, 地図データ, ノード, ウェイ, タグ
前準備
Python 3.12 のインストール(Windows 上) [クリックして展開]
以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合、この手順は不要である。
方法1:winget によるインストール
管理者権限のコマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
powershell -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; $m=[Environment]::GetEnvironmentVariable('Path','Machine'); if($m -notlike \"*$s*\") { [Environment]::SetEnvironmentVariable('Path', \"$p;$s;$m\", 'Machine') }"
--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。
方法2:インストーラーによるインストール
- Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
- ダウンロードしたインストーラーを実行する。
- 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから
pythonコマンドを実行できない。 - 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。
インストールの確認
コマンドプロンプトで以下を実行する。
python --version
バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。
Build Tools for Visual Studio 2022 のインストール(Windows 上)
overpyはコンパイラを必要としないが、データ処理でよく使用するnumpyやpandas等のライブラリはC/C++コンパイラを必要とする場合がある。将来的な拡張に備えて、Visual Studio Build Toolsをインストールしておくことを推奨する。
p>以下のコマンドを管理者権限のコマンドプロンプトで実行する (手順:Windowsキーまたはスタートメニュー →cmd と入力 → 右クリック → 「管理者として実行」)。
REM VC++ ランタイム
winget install --scope machine --id Microsoft.VCRedist.2015+.x64 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet /norestart"
REM Build Tools + Desktop development with C++(VCTools)+ 追加コンポーネント(一括)
winget install --id Microsoft.VisualStudio.2022.BuildTools --accept-source-agreements --accept-package-agreements ^
--override "--passive --wait --norestart --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.ComponentGroup.ClangCL --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.Windows11SDK.26100"
--add で追加されるコンポーネント
上記のコマンドでは,まず Build Tools 本体と Visual C++ 再頒布可能パッケージをインストールし,次に setup.exe を用いて以下のコンポーネントを追加している。
VCTools:C++ デスクトップ開発ワークロード(--includeRecommendedにより、MSVC コンパイラ、C++ AddressSanitizer、vcpkg、CMake ツール、Windows 11 SDK 等の推奨コンポーネントが含まれる)VC.Llvm.Clang:Windows 向け C++ Clang コンパイラClangCL:clang-cl ツールセットを含むコンポーネントグループ(MSBuild から Clang を使用するために必要)VC.CMake.Project:Windows 向け C++ CMake ツールWindows11SDK.26100:Windows 11 SDK(ビルド 10.0.26100)
インストール完了の確認
winget list Microsoft.VisualStudio.2022.BuildTools
上記以外の追加のコンポーネントが必要になった場合は Visual Studio Installer で個別にインストールできる。
overpy ライブラリのインストール(Windows上)
- Windowsで、管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー >
cmdと入力 > 右クリック > 「管理者として実行」)。 - 以下のコマンドを実行する。
pip install -U overpy
Google Map を用いた緯度経度の取得
データをダウンロードする際には、対象地域の緯度と経度を指定する必要がある。ここでは、Google Mapを使用して緯度経度を調べる方法を説明する。
- Google Map(https://www.google.co.jp/maps)を開く。
- 目的の場所に移動する。
- 地図上で右クリックし、「この場所について」を選択する。
- 画面下部に緯度と経度が表示されるので、これを記録する。
Python を用いて OpenStreetMap のデータをダウンロード
- Windows では python(Python ランチャーは py)
- Ubuntu では python3
【サイト内の関連ページ】 Python のまとめ: 別ページ »
Overpass API と OpenStreetMap のデータ構造
Overpass APIは、OpenStreetMapのデータを検索・取得するための読み取り専用APIである。クエリを送信すると、条件に合致するデータが返される。overpyは、このAPIをPythonから利用するためのライブラリである。
OpenStreetMapのデータは、以下の3種類の要素で構成される。
- ノード(Node):緯度・経度を持つ点。店舗や信号機などの地物を表す
- ウェイ(Way):複数のノードを順に結んだ線。道路や建物の輪郭を表す
- リレーション(Relation):複数の要素をグループ化したもの。バス路線などを表す
各要素にはタグ(属性情報)を付与できる。タグは「キー=値」の形式で、例えばhighway=primaryは「主要道路」を意味する。
データのダウンロード手順
- 緯度と経度の設定
前準備で調べた緯度と経度を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、緯度、経度を持つ点データ