Python の overpy を用いて OpenStreetMap のデータをダウンロード

【概要】Pythonのoverpyライブラリを使用して、OpenStreetMapから地図データをダウンロードする方法を解説する。取得したデータは、地図アプリケーションの開発、経路探索、地理情報の分析などに活用できる。

【目次】

  1. 前準備
  2. Python を用いて OpenStreetMap のデータをダウンロード

OpenStreetMap (https://www.openstreetmap.org)は、世界規模で利用可能な無料のオンライン地図データベースである。誰でも自由に利用・編集でき、地図データを様々な形式で取得できる。

先人に感謝

キーワード: OpenStreetMap, Python, overpy, Overpass API, 地図データ, ノード, ウェイ, タグ

前準備

Python のインストール(Windows上)

注:既にPython(バージョン3.12を推奨)がインストール済みの場合は、この手順は不要である。

winget(Windowsパッケージマネージャー)を使用してインストールを行う。

  1. Windowsで、管理者権限コマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)。
  2. wingetが利用可能か確認する。
    winget --version
    
    winget --version コマンドの実行結果
  3. 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
    

【関連する外部サイト】

【サイト内の関連ページ】

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上)

  1. Windowsで、管理者権限コマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)。
  2. 以下のコマンドを実行する。
    pip install -U overpy
    

Google Map を用いた緯度経度の取得

データをダウンロードする際には、対象地域の緯度経度を指定する必要がある。ここでは、Google Mapを使用して緯度経度を調べる方法を説明する。

  1. Google Map(https://www.google.co.jp/maps)を開く。
  2. 目的の場所に移動する。
    Google Mapで場所を表示した画面
  3. 地図上で右クリックし、「この場所について」を選択する。
    Google Mapの右クリックメニュー
  4. 画面下部に緯度と経度が表示されるので、これを記録する。
    Google Mapで緯度経度が表示された画面

Python を用いて OpenStreetMap のデータをダウンロード

Python プログラムの実行方法

【サイト内の関連ページ】 Python のまとめ: 別ページ »

Overpass API と OpenStreetMap のデータ構造

Overpass APIは、OpenStreetMapのデータを検索・取得するための読み取り専用APIである。クエリを送信すると、条件に合致するデータが返される。overpyは、このAPIをPythonから利用するためのライブラリである。

OpenStreetMapのデータは、以下の3種類の要素で構成される。

各要素にはタグ(属性情報)を付与できる。タグは「キー=値」の形式で、例えばhighway=primaryは「主要道路」を意味する。

注意:公開されているOverpass APIサーバ(overpass-api.de)には利用制限がある。1日あたり約10,000リクエスト、ダウンロード量1GB以下が目安である。大量のデータを取得する場合は、Planet.osmの利用を検討すること。

データのダウンロード手順

  1. 緯度と経度の設定

    前準備で調べた緯度と経度をPythonの変数に設定する。

    次のPythonプログラムを実行する。

    lat = 34.4461
    lon = 133.2315
    緯度経度を設定するPythonコードの実行画面
  2. データタイプの設定

    取得するデータの種類をタグで指定する。ここでは「highway」(道路)タグを持つウェイを取得する。

    次のPythonプログラムを実行する。

    type = 'highway'
    タイプを設定するPythonコードの実行画面
  3. データのダウンロードと表示

    指定した緯度経度を中心に、±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コードの実行画面

    道路データが取得され、各道路の名前とノードの緯度経度が表示される。指定した範囲に道路がない場合、出力は空になる。

    ダウンロードした道路データの表示結果
  4. ウェイデータの確認

    取得したウェイ(道路などの線形データ)の一覧を確認する。

    次のPythonプログラムを実行する。

    result.ways
    result.waysの実行結果

    各行が1つのウェイを表す。nodes = []内の数値は、そのウェイを構成するノードのIDである。

  5. ノードデータの確認

    取得したノード(点データ)の一覧を確認する。

    次のPythonプログラムを実行する。

    result.nodes
    result.nodesの実行結果

    各行が1つのノードを表し、ID、緯度、経度の情報を持つ。

まとめ