Python の overpass を用いて OpenStreetMap のデータをダウンロード
OpenStreetMap (https://www.openstreetmap.org)は,
世界規模の無料で使えるオンラインの地図データベースシステム.
Python の overpass パッケージは, OpenStreetMap の Overpass API を Python から使えるようにする機能を持ったソフトウェア.
前準備
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 overpass pip install -U geopandas
Google Map を用いて緯度経度を調べてみる
あとでデータをダウンロードするときのために,Google Map を使って緯度・経度を調べてみる
- Google Map を開く
- Google Map で好きな場所に移動する
- 右クリックして,「この場所について」を選ぶ
- 緯度,経度が表示されるので,メモしておく
Python を用いて OpenStreetMap のデータをダウンロード
Python プログラムの実行
- Windows では python (Python ランチャーは py)
- Ubuntu では python3
【サイト内の関連ページ】 Python のまとめ: 別ページ »
- Python で,ダウンロードしたい地図の緯度と経度の設定
次の Python プログラムを実行
*さきほど調べた緯度と経度
(実行例)
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 形式のデータになっていることを確認
print(response)
- 欲しいデータのタイプの設定
OpenStreetMapの「ライン」のデータのうち,「highway」であるようなデータが欲しいとする.OpenStreetMap には,ポイントやラインやエリアには,「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行: 1個の「ライン」オブジェクト
- 各行の nodes = [] の中身: 端のポイントや途中のポイントのID
- 「ノード」のデータの確認
次の 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行: 1個の「ポイント」オブジェクト
- 各行の中身: ID,緯度,経度
まとめ
- ラインのデータ: ポイントのIDが2個以降並んでいる
- ポイントのデータ: ID,緯度,経度