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などに保存しておけば検索して利用しやすくなると思う。