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

OpenStreetMap (https://www.openstreetmap.org)は, 世界規模の無料で使えるオンラインの地図データベースシステム.

先人に感謝

キーワード: OpenStreetMap, Python, overpy, 地図データダウンロード, ポイント, ライン, エリア, タグ

前準備

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

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

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

  1. Windowsで,管理者権限コマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)。
  2. winget(Windowsパッケージマネージャー)が利用可能か確認する:
    winget --version
    
  3. 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
    
  4. 【関連する外部サイト】

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

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

  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. 右クリックして,「この場所について」を選ぶ
  4. 緯度,経度が表示されるので,メモしておく

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

Python プログラムの実行

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

  1. Python で,ダウンロードしたい地図の緯度と経度の設定

    次の Python プログラムを実行

    *さきほど調べた緯度と経度

    (実行例)

     lat = 34.4461
    lon = 133.2315 
  2. 欲しいデータのタイプの設定

    OpenStreetMapの「ライン」のデータのうち,「highway」であるようなデータが欲しいとする.OpenStreetMap には,ポイントやラインやエリアには,「highway」のようなタグが付いている.

    引き続き,次の Python プログラムを実行

     type = 'highway' 
  3. lat, lon, type の設定が終わったところで,spyder のコンソールで,次のプログラムを実行し,データのダウンロードと表示を行う.

    * OpenStreetMapもタイル地図だが,次のプログラムでは,最下位のレイヤ(もっとも詳細なレイヤ)からダウンロードが始まる

    次の 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)) 

    表示を確認する.(道路がないようなところを緯度経度で指定していると表示は空になる).表示されるのは道路のデータであり,緯度経度が並んでいる.

  4. ライン」のデータの確認
    • ラインが線分のとき: 端のポイントが2個
    • ラインが折れ線のとき: 端のポイントが2個で,途中のポイントがある

    次の Python プログラムを実行

     result.ways 
    • 表示の1行: 1個の「ライン」オブジェクト
    • 各行の nodes = [] の中身: 端のポイントや途中のポイントのID
  5. ノード」のデータの確認

    次の Python プログラムを実行

     result.nodes 
    • 表示の1行: 1個の「ポイント」オブジェクト
    • 各行の中身: ID,緯度,経度

まとめ