さて、みなさん。
飲食店の位置情報を取得したくなった事ってありませんか?
Withコロナの時代なので、飲食店支援の為に、テイクアウトマップを作りたくなった時などにも、飲食店の位置情報データがあると便利です。
今回OpenStreetMapとOsmiumを使って、実際にやってみました。
その手順と知見を紹介します。
OpenStreetMapとは?
Wikipediaのように誰でも自由に使えるオープンデータの地理情報を作るプロジェクトです。
https://www.openstreetmap.org/
ODbLというライセンス形式で、“© OpenStreetMap contributors”
のクレジットを追加すれば、商用・非商用問わず自由にデータを利用できます。詳細はこちら
Osmiumとは?
OpenStreetMapのメタデータ(建物情報など)を扱うための、開発者向けのツールです。
Node版や、Python版もあります。
前準備
データをダウンロード
OpenStreetMapのデータは、Planet OSM というサイトで公開されています。ただ世界全体のデータになり、52GB程になってしまいます。
これでは使いにくいので、国や地域単位で分割したデータを提供してくれている外部サイトを使います。
GeoFabrik.deからダウンロードします。
Sub Regions
からより細かい地域別(関西、関東、九州など)データをダウンロードできます。
※ ちなみに、Kansai region (a.k.a. Kinki region)
となっているのは、a.k.a.
が別名という意味で、
ラッパー等がよく使うスラングらしいです。
データの範囲を指定して切り出し
地域別に分割したデータをダウンロードしたとはいえ、関西エリアでも、大阪だけで365万世帯以上あるらしいので、
県単位や、町単位などもっと狭いエリアのデータを取得したくなることってありますよね。
そんな時の為に、Osmium Tool
という、Osmiumのコマンドラインツールがあります。(OSX、Linux)
https://osmcode.org/osmium-tool/
これを使ってダウンロードしたファイルの指定の範囲を切り出します。
まずosmium-tool
をインストールします。MacではHomebrew
を使って入れることができます。
$ brew install osmium-tool
次に、指定したい範囲の左上と右下の緯度経度を --bbox
オプションで指定して切り抜きます。
$ osmium extract --bbox 左上の経度,左上の緯度,右下の経度, 右下の緯度 -o 出力したいファイル名.pbf 元のファイル名.osm.pbf
例:
$ osmium extract --bbox 135.190208,34.732968,135.337493,34.710675 -o kobe.osm.pbf kansai-latest.osm.pbf
任意の地点の緯度経度を取得する方法
やり方は色々あると思うのですが、ここではOpenStreetMapを使ったやり方を紹介します。
-
まず、OpenStreetMapを開きます。
(c) OpenSteeetMap contributors.
飲食店検出
$ osmium tags-filter 元ファイル.osm.pbf 検出条件 -o 出力先.osm.pbf
例:関西の飲食店を検出する
$ osmium tags-filter kansai.osm.pbf nwr/amenity=restaurant,cafe,fast_food -o eatplace-in-kansai.osm.pbf
検出の条件の書き方
上の例では、レストラン、カフェ、ファーストフード店を検出していますが、OpenStreetMapにタグ付けされているものなら、何でも検出できます。
高速道路
w/highway
森
wr/natural=wood wr/landuse=forest
公衆トイレ
nwr/amenity=toilets
ATM
nwr/amenity=atm
条件式の前半部分、nwr
は、OpenStreetMapの node
, way
, relations
を指定しています。
検出したいオブジェクトに合わせて変えて下さい。
参考 :
条件式の書き方:https://osmcode.org/osmium-tool/manual.html#filtering-by-tags
タグの一覧:https://taginfo.openstreetmap.org/
出力したデータを扱いやすいフォーマットに変換
出力は .pbf
形式なので、扱いやすい .geojson
に変換します。
$ osmium export 元ファイル.osm.pbf -o 出力先.geojson
例:関西の建物のデータをGeoJSONに変換
$ osmium export buliding-in-kansai.osm.pbf -o buliding-in-kansai.geojson
取得結果
{"type":"Feature","geometry":{"type":"Point","coordinates":[135.762489,34.9867552]},"properties":{"name":"新福菜館本店","amenity":"restaurant"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[135.7963664,35.024421]},"properties":{"name":"珈琲店 再願","amenity":"cafe"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[135.7963125,35.0239114]},"properties":{"name":"SEDONA Coffee & restrant","amenity":"restaurant"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[135.7964193,35.0237863]},"properties":{"amenity":"restaurant"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[136.2641978,35.3778431]},"properties":{"name":"Dek Delicia","amenity":"restaurant"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[136.2707945,35.3851189]},"properties":{"name":"我が家やきとり","amenity":"restaurant","name:en":"Wagaie Yakitori"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[134.7193303,34.8269451]},"properties":{"name":"吉野家","brand":"吉野家 YOSHINOYA","amenity":"fast_food","name:en":"YOSHINOYA","name:ja":"吉野家","name:ja_rm":"Yoshinoya"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[134.7331357,34.8378643]},"properties":{"amenity":"fast_food","brand":"マクドナルド","name":"マクドナルド","name:en":"McDonald's","name:ja":"マクドナルド","name:ja_rm":"Makudonarudo","name:ko":"맥도날드"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[135.4723519,34.7628959]},"properties":{"amenity":"restaurant","created_by":"Merkaartor 0.12","cuisine":"noodles","name":"銭形"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[135.7525259,35.0002416]},"properties":{"addr:postcode":"600-8483","amenity":"restaurant","cuisine":"japanese","name":"やきとり大吉 堀川高辻店","name:en":"Daikichi","opening_hours":"Mo-Su 17:00-01:00","phone":"81753518000","website":"http://daikichi.co.jp"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[136.5865234,34.8625583]},"properties":{"name":"CoCo一番屋","amenity":"restaurant"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[135.7124339,34.5205464]},"properties":{"name":"マガジーノ","amenity":"restaurant","cuisine":"pizza","website":"http://www.magazzino.co.jp/","created_by":"Merkaartor 0.11"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[136.2815227,35.393446]},"properties":{"amenity":"fast_food","brand":"マクドナルド","cuisine":"burger","name":"マクドナルド","name:en":"McDonald's","name:ja":"マクドナルド","name:ja_rm":"Makudonarudo","name:ko":"맥도날드"}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[136.28418249999999,35.3851785]},"properties":{"name":"ケンタッキーフライドチキン","brand":"KFC","amenity":"fast_food","cuisine":"burger","name:en":"Kentucky Fried Chicken","name:ja":"ケンタッキーフライドチキン","name:ja_rm":"Kentakki Furaidochikin"}},
(c) OpenSteeetMap contributors.
実は、osmium export
はオプションを色々指定でき、これだけでタグのフィルタリングもできます。
詳しくは、公式ドキュメントか、こちらの記事に詳しく書かれているので、[ Qiita ]ハンズオン準備3:モジュール化した osm.pbf を GeoJSON に変換する見てみて下さい。
結果
See the Pen Eatplaces in Kansai by nao (@naogify) on CodePen.
やってみると約36200件の関西の飲食店が取得できました。
食べログの関西エリアの飲食店掲載数(2020/8/13)は、138427件(滋賀、京都、大阪、兵庫、奈良、和歌山)でした。
今回取得できた飲食店件数は、食べログ掲載店舗数の 約26% になります。
飲食店のタグは他にも、bar
やpub
、biergarten
(ビアガーデン)など、他にもあるのでそれらを追加すると取得件数は増えるかもしれません。
まとめ
どうだったでしょうか?
GIS特有の拡張子やOpenStreetMapの用語など初めてのことも多いかもしれませんが、自分の地域の建物などを検出できるのは面白いですよね。ぜひみなさんもGISの世界を覗いてみて下さい。🌏
良ければ記事のシェア、LGTMなどよろしくお願いします。
##参考URL
Osmium Tool Manual