Python の overpass を用いて OpenStreetMap のデータをダウンロード
【目次】
Python の overpass パッケージは、OpenStreetMap の Overpass API を Python から利用するラッパーライブラリである。Overpass API は、OpenStreetMap のデータベースから条件を指定してデータを抽出するための問い合わせインターフェースである。
注意事項: Overpass API には利用制限がある。短時間に大量のリクエストを送信すると、一時的にアクセスが制限される場合がある。また、OpenStreetMap のデータは Open Database License (ODbL) の下で提供されており、利用時にはライセンス条件に従う必要がある。
前準備
本記事のプログラムを実行するには、以下の環境構築が必要である。
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 上)
geopandas などの Python パッケージは、インストール時に 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 で個別にインストールできる。
必要な Python ライブラリのインストール(Windows上)
- Windowsで、管理者権限でコマンドプロンプトを起動する(手順: Windowsキーまたはスタートメニュー >
cmdと入力 > 右クリック > 「管理者として実行」)。 - 以下のコマンドを実行し、必要なライブラリをインストールする。
pip install -U overpass pip install -U geopandas
Google Map を用いて緯度経度を調べる
OpenStreetMap からデータをダウンロードするには、対象地域の緯度と経度の指定が必要である。ここでは Google Map を使用して座標を取得する。
- Google Map を開く。
- Google Map で任意の場所に移動する。
- 目的の場所で右クリックし、「この場所について」を選択する。
- 画面下部に緯度と経度が表示される。この値を記録しておく。
Python を用いて OpenStreetMap のデータをダウンロード
- Windows では python(Python ランチャーは py)
- Ubuntu では python3
【サイト内の関連ページ】 Python のまとめ: 別ページ »
- Python で、ダウンロードしたい地図の緯度と経度を設定する。
以下の Python プログラムを実行する。緯度と経度には、前節で取得した値を使用する。
MapQuery の引数は、取得範囲を示すバウンディングボックス(南端の緯度、西端の経度、北端の緯度、東端の経度)である。以下の例では、指定した座標を中心に約200m四方の範囲を取得する。
(実行例)
import overpass lat = 34.4461 lon = 133.2315 api = overpass.API() map_query = overpass.MapQuery(lat - 0.001, lon - 0.001, lat + 0.001, lon + 0.001) response = api.Get(map_query)
- 結果である response オブジェクトを確認する。
取得したデータは GeoJSON 形式 で返される。GeoJSON は地理情報データを表現するための JSON ベースの標準フォーマットであり、多くの GIS ツールやライブラリで利用できる。
print(response)
- 取得したいデータのタイプを指定して抽出する。
以下は、「ライン」データのうち「highway」タグを持つもの(道路データ)を抽出する例である。
以下の Python プログラムを実行する。
import json # GeoJSON データから必要な情報を抽出 data = json.loads(response) # highway タグを持つラインのみを抽出 highways = [] for feature in data['features']: if feature['geometry']['type'] == 'LineString': if 'highway' in feature['properties']: highways.append(feature) print(f"highway タグを持つラインの数: {len(highways)}") # 最初の highway を表示 if highways: print(highways[0]) - 「ライン」データの構造を確認する。
ラインは複数のポイント(座標)で構成される。
- ラインが線分の場合: 端点が2個
- ラインが折れ線の場合: 端点が2個に加え、中間点が存在する
以下の Python プログラムを実行する。
# ラインのデータ構造を確認 for i, highway in enumerate(highways[:3]): # 最初の3つだけ表示 print(f"ライン {i+1}:") print(f" ID: {highway['id']}") print(f" タイプ: {highway['properties'].get('highway', '不明')}") print(f" 名前: {highway['properties'].get('name', '名前なし')}") # 座標点の数を確認 coords = highway['geometry']['coordinates'] print(f" ポイント数: {len(coords)}") print(f" 座標: {coords}") print()出力の各行は1個の「ライン」オブジェクトを表す。coordinates には、ラインを構成する各ポイントの座標が格納されている。
注意: GeoJSON の座標は(経度、緯度)の順で格納される。これは一般的な(緯度、経度)の順とは逆である。
- 「ノード」データの構造を確認する。
以下の Python プログラムを実行する。
# ノード(ポイント)のデータを抽出 nodes = [] for feature in data['features']: if feature['geometry']['type'] == 'Point': nodes.append(feature) print(f"ポイントの総数: {len(nodes)}") # 最初の数個のノードを表示 for i, node in enumerate(nodes[:3]): # 最初の3つだけ表示 print(f"ノード {i+1}:") print(f" ID: {node['id']}") print(f" 緯度経度: {node['geometry']['coordinates']}") print(f" タグ: {node['properties']}") print()出力の各行は1個の「ポイント」オブジェクトを表す。各ポイントは ID、座標、およびタグ(属性情報)を持つ。
まとめ
本記事で取得したデータの構造は以下のとおりである。
- ラインデータ: 複数のポイント座標で構成され、道路や河川などの線形要素を表す
- ポイントデータ: ID、座標(経度、緯度)、およびタグ(属性情報)で構成される
取得したデータは geopandas などのライブラリを使用して、地図上への可視化や空間分析に活用できる。