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

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

先人に感謝

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

前準備

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

サイト内の関連ページ

関連する外部ページPython の公式ページ: https://www.python.org/

(Windows の場合のみ)マイクロソフト C++ ビルドツール (Build Tools) のインストール

Windows での Build Tools for Visual Studio 2022 のインストール手順: 別ページ »で説明

Python のパッケージ overpy のインストール

  1. Windows のときは,コマンドプロンプト管理者として実行

    * Linux のときは,端末を開く(pyenvを使っているときは pip の実行に管理者権限を必要としない)

  2. 今のコマンドプロンプトで,次のコマンドを実行
    pip install --ignore-installed --upgrade overpy
    
  3. インストールできたことの確認

    バージョン番号が表示されれば OK

    pip show overpy
    

* GitHub からソースコードをダウンロードしてインストールしたい場合

  1. Visual Studio の x64 Native Tools コマンドプロンプト管理者として実行起動する

    起動は,Windows のメニューで「Visual Studio 20..」の下の「x64 Native Tools コマンドプロンプト (x64 Native Tools Command Prompt)」を選ぶ.「x64」は,64ビット版の意味である.

    * 「x64 Native Tools コマンドプロンプト (x64 Native Tools Command Prompt)」がないとき:

    Visual Studio Community のインストールを行うことで, 「x64 Native Tools コマンドプロンプト (x64 Native Tools Command Prompt)」もインストールされる.その手順は,別ページ »で説明

  2. x64 Native Tools コマンドプロンプトで,次のコマンドを実行
    python -m pip install -U pip
    pip install git+https://github.com/DinoTools/python-overpy
    
  • 終了の確認

    エラーメッセージが出ていないことを確認

  • インストールできたことの確認

    バージョン番号が表示されれば OK

    pip show 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,緯度,経度

    まとめ