Overpass API を使って OpenStreetMap から牛丼店の情報を取得し、Google マイマップに表示する


この記事は、下記の記事に触発されて書きました

uMapとOverpass API(overpass turbo)を使ってOpenStreetMatsuyaマップを作る

Overpass API

OpenStreetMap の地理情報を取得するための API です。

OSM の Overpass API の説明

取得した情報のライセンスはODbL です。
オープンソースライセンスと同様に、共有、創作、翻案が行えます。

参考 : オープンデータのライセンスを考える(9)ODbLの概要

牛丼店の地理情報を取得するクエリは下記のようになる

OSMサーバー?data=[out:json];node["amenity"="fast_food"]["cuisine"="beef_bowl"];out;

約600件 登録されている。
全国の牛丼店の店舗数は 4000 店らいしので、網羅率は!5%くらいです。
網羅率を上げるのは、皆さんの協力が必要です。
興味を持った人はこちらから。
ポケモンGOマッパーのためのOSM入門

取得範囲を指定していないので、台湾に2店ほどあるが、気にしないことに。

Google マイマップ に表示する

Google マイマップ に表示するために KML ファイルを用意します。

overpass turbo を使うと、KML ファイルが取得できる。
しかし、マーカーの情報が表形式になって見難い。

uMap のような可読性のある表示になるようにします。

今回は、Python を使ってみました。

Json を解析する

python のjsonライブラリを使います。

Python 標準ライブラリ json

import json

f = open('sample.json', 'r')
json_dict = json.load(f)

elements = json_dict["elements"]
for element in elements:

    lon = element["lon"]
    lat = element["lat"]
    tags = element["tags"]

    if "name" in  tags:
        name = tags["name"].encode('utf-8')

マーカーの情報を作成する

OSMのタグは多いので、どこまで対応するか悩ましい。
下記を参考にする。

OpenStreetMatsuya

    if "branch" in  tags:
        branch = tags["branch"].encode('utf-8')
        info += branch + LF
    if "opening_hours" in  tags:
        opening_hours = tags["opening_hours"].encode('utf-8')
        info += "営業時間: ".encode('utf-8') + opening_hours + LF

KML ファイルを作成する

python の simplekml ライブラリを使います。

simplekml : A Simple KML creator

import simplekml

kml = simplekml.Kml()

kml.newpoint( name=name, description=info, coords=[( lon, lat )] )

ソースコードの全体は下記に。

Google マイマップを作成する

下記からログインする。

KML ファイルをアップロードする。

作成した Google マイマップ

スクリーンショット