【食べログ作れる? 】 OpenStreetMap から Osmiumで飲食店の位置情報を取得してGeoJSONに出力してみた

さて、みなさん。
飲食店の位置情報を取得したくなった事ってありませんか？

Withコロナの時代なので、飲食店支援の為に、テイクアウトマップを作りたくなった時などにも、飲食店の位置情報データがあると便利です。

今回OpenStreetMapとOsmiumを使って、実際にやってみました。
その手順と知見を紹介します。

## OpenStreetMapとは？
Wikipediaのように誰でも自由に使えるオープンデータの地理情報を作るプロジェクトです。
https://www.openstreetmap.org/

ODbLというライセンス形式で、`“© OpenStreetMap contributors”`のクレジットを追加すれば、商用・非商用問わず自由にデータを利用できます。[詳細はこちら](https://www.openstreetmap.org/copyright)


## Osmiumとは？

OpenStreetMapのメタデータ（建物情報など）を扱うための、開発者向けのツールです。
Node版や、Python版もあります。

https://osmcode.org/


## 前準備

### データをダウンロード
OpenStreetMapのデータは、[Planet OSM](https://planet.openstreetmap.org/) というサイトで公開されています。ただ世界全体のデータになり、52GB程になってしまいます。

これでは使いにくいので、国や地域単位で分割したデータを提供してくれている外部サイトを使います。
[GeoFabrik.de](http://download.geofabrik.de/)からダウンロードします。

http://download.geofabrik.de/asia/japan.html

`Sub Regions` からより細かい地域別（関西、関東、九州など）データをダウンロードできます。

![スクリーンショット 2020-08-11 1.12.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142797/8d4f75b6-1dda-55df-d883-6f142f9aeb0c.png)

※ ちなみに、`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を使ったやり方を紹介します。

1. まず、[OpenStreetMap](https://www.openstreetmap.org/#map=16/35.6329/139.8804)を開きます。
1. 緯度経度を取得したい任意の地点で、右クリックします。そして「アドレスを表示」をクリック。![スクリーンショット 2020-08-11 9.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142797/17bcd7e8-15d7-fcc7-0e0a-edb89bac2ac1.png)

1. その地点の緯度経度が表示されます。![スクリーンショット 2020-08-11 9.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142797/44b7d3bb-3b45-8516-184a-3ce0657cb3cc.png)
2. 
(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`はオプションを色々指定でき、これだけでタグのフィルタリングもできます。

詳しくは、[公式ドキュメント](https://docs.osmcode.org/osmium/latest/osmium-export.html)か、こちらの記事に詳しく書かれているので、[[ Qiita ]ハンズオン準備３：モジュール化した osm.pbf を GeoJSON に変換する](https://qiita.com/hfu/items/da3ff2c1884c4bd4d600)見てみて下さい。


## 結果

<p class="codepen" data-height="371" data-theme-id="light" data-default-tab="result" data-user="naogify" data-slug-hash="ZEWQOKe" style="height: 371px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Eatplaces in Kansai">
  <span>See the Pen <a href="https://codepen.io/naogify/pen/ZEWQOKe">
  Eatplaces in Kansai</a> by nao (<a href="https://codepen.io/naogify">@naogify</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

やってみると約36200件の関西の飲食店が取得できました。
食べログの関西エリアの飲食店掲載数（2020/8/13）は、138427件（滋賀、京都、大阪、兵庫、奈良、和歌山）でした。

今回取得できた飲食店件数は、食べログ掲載店舗数の 約26% になります。

飲食店のタグは他にも、`bar`や`pub`、`biergarten`（ビアガーデン）など、他にもあるのでそれらを追加すると取得件数は増えるかもしれません。

## まとめ

どうだったでしょうか？


GIS特有の拡張子やOpenStreetMapの用語など初めてのことも多いかもしれませんが、自分の地域の建物などを検出できるのは面白いですよね。ぜひみなさんもGISの世界を覗いてみて下さい。🌏

良ければ記事のシェア、LGTMなどよろしくお願いします。

##参考URL
[Osmium Tool Manual](https://osmcode.org/osmium-tool/manual.html)