トップページ -> データベース研究スタート -> インタラクティブ,ダイナミックな地図(OpenStreetMap を利用) -> Python の overpy を用いて OpenStreetMap のデータをダウンロード
[サイトマップへ]  

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

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

先人に感謝

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


前もって準備しておくこと

前準備として,Anaconda のインストールが終わっていること. 手順を下に説明しています.

Anaconda のインストール

Python 3 の開発環境である Anacondaをおすすめ.Window でのインストール手順は次の通りです(Linuxでも同様の手順です).

  1. https://www.continuum.io/downloads#windowsを開く

  2. Download」をクリックする.

  3. ダウンロードが始まるので確認する.

  4. ダウンロードした .exe ファイルを実行して,Anacondaをインストール.

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

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

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

  2. 今のコマンドプロンプトで,次のコマンドを実行
    pip install overpy 
    

Google Map を用いて緯度経度を調べてみる

あとでデータをダウンロードするときのために,Google Map を使って緯度・経度を調べてみる

  1. Google Map を開く

    https://www.google.co.jp/maps

  2. Google Map で好きな場所に移動する

  3. 右クリックして,「この場所について」を選ぶ

  4. 緯度,経度が表示されるので,メモしておく


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

Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

  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. ライン」のデータの確認

    次の Python プログラムを実行

    result.ways
    

  5. ノード」のデータの確認

    次の Python プログラムを実行

    result.nodes
    

まとめ