OSMデータをPythonで触る方法

OSMデータをPythonで触る方法

最近OpenStreetMapのデータを触る機会があり、いい感じに触る方法が分からなくて色々試してみたので紹介する。

・ overpass turboを使用してデータ取得
・OSMデータをDLしてきて使用

※記事内のプログラムはFlaskで組んだプログラムの一部を抜粋しています。一部足りない記述がある場合があります。

# overpass turboを使用してデータ取得

まず最初にoverpass turboというサービスのAPI経由でOSMデータを取得する方法を検討した。
このAPIを叩くためにはOverpass QLというものを使用して叩く。

[out:json];
(
 node['shop'~'.'](35.002374919567885,135.75808220871573,35.00499106117767,135.7612159415514);
);
(._;>;);
out body;

こんな記述方法。overpass turboのサイトで実際に叩いて試すことができるので、プログラムを組む前に試しておいた方がよさそう。。(一発でしっかりしたクエリ書ける気がしない)

min_lat = 35.002374919567885
min_lon = 135.75808220871573
max_lat = 35.00499106117767
max_lon = 135.7612159415514
query = ""
query += "[out:json];"
query += "("
query += "node['shop'~'.'](" + str(min_lat) + "," + str(min_lon) + "," + str(max_lat) + "," + str(max_lon) + ");"
query += ");"
query += "(._;>;);"
query += "out body;"
s_quote = urllib.parse.quote(query)
url = "http://overpass-api.de/api/interpreter?data=" + s_quote
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as res:
    body = json.load(res)
    json_data = body["elements"]
for data in json_data:
    print(data["tags"]["shop"])

これでOSMの一定エリアに存在する「shop」というタグを持ったデータを取得することができる。
しかし、これだと連続してAPIを叩いてデータを取得するのには時間がかかり過ぎてしまうため、別の方法を探すことにした。

# OSMデータをDLしてきて使用

geofabrikというサイトで配布されているOSMのデータをダウンロードしてきて使用する。
このファイルはpbfという拡張子のファイルになっており、中身を簡単に見ることはできなかった。
Pythonのosmreadを使用してデータの操作を行なった。

from osmread import parse_file, Node
file_path = join(dirname(realpath(__file__)), '../files/kansai-latest.osm.pbf')
file = parse_file(file_path)
for data in file:
    if isinstance(data, Node):
        if len(data.tags.keys() & {'shop'}) > 0:
            one_data = {
                'tags':data.tags,
                'lon': data.lon,
                'lat': data.lat
            }

これで「shop」のタグが付いたOSMのデータを取得することができる。
これをMongoDBなどに保存しておけば検索して利用しやすくなると思う。

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
KSU/M2, 推薦技術系の研究, フロントエンジニアしたりUI考えたり...etc