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

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

【目次】

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

先人に感謝

キーワード: 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:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「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 を用いて以下のコンポーネントを追加している。

インストール完了の確認

winget list Microsoft.VisualStudio.2022.BuildTools

上記以外の追加のコンポーネントが必要になった場合は Visual Studio Installer で個別にインストールできる。

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、緯度、経度の情報を持つ。

まとめ