GoogleMapsAPIで緯度経度から周辺の神社情報を取得する

#1.はじめに
Google Maps APIでどうしても緯度経度を使ってその周辺の情報を取得したくなったので、やってみました。

「あいふぉんでけんさくすればいーじゃん」と言われそうですが、
最終的に地域の神社をすべて取得したいなーと考えていたので、まずはその前段となる、ある地点の周辺の神社を取得することにしました。

Google Maps APIってなんだってレベルから始めたので、順を追って書いていきます。

・必要なもの
パソコン
googleアカウント

#2.取得までのステップ
①APIキーの取得
②検索キーワードの指定
③検索したい場所の緯度経度を取得
④コマンドの作成
　(ほぼコピペで使えます。)
⑤実行環境の作成(Google Colaboratoryを使うので、Googleアカウント作成)
⑥データを表示or保存

#3. 完成形
Web画面で以下の文字列をコピペするだけで
その地点周辺の神社の情報を取り出せるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422678/947f85fa-51ef-cb7c-ae5e-1fde03b0d5b0.png)

※APIキーの取得、取得したい場所の名称(「神社」「カフェ」)の指定が必要
　他、オプションもまとめておきます。

使うには、以下のコマンドが必要であり、利用者によって異なる要素(<>でくくられている部分)があります。

```python

# 色々とインポートする。
!pip install -U googlemaps
import pandas as pd
import googlemaps
# 取得したキーを''内に入力
key = '<APIキー>'
gmaps = googlemaps.Client(key=key)
# 取得したい地点の緯度経度を入力
lon_lat = (<取得したい施設の緯度,経度>)
# 取得したい施設のキーワードをunicodeへ変換
keyword = '<取得したい施設のキーワード(unicode形式)>'

# APIキー・緯度経度・キーワードを入れた式を実行し、json形式で結果を取得
results_json = gmaps.places_nearby(location = lon_lat, radius = 2000, keyword = keyword, language = 'ja')

# JSON形式では読みにくいので、DataFrame形式に変換
df_results = pd.io.json.json_normalize(results_json, record_path='results')
# 住所と施設名称のみに情報を削る。
df_address_name = df_results[["vicinity","name"]]
# 表示
df_address_name
```

なので、<>部について取得方法を説明します。
・APIキー
・取得したい場所のキーワード
・取得したい場所の地点

#4.APIキーの取得
Google Maps APIを使うにはAPIキーなるものが必要です。

以下のリンクから取得方法を確認してください。
[APIキーの取得方法](https://qiita.com/k2999/items/a9f41ea697a4f955ec1c)
英語ですが、[公式ドキュメント](https://developers.google.com/places/web-service/get-api-key)もあります。

##課金について
APIキーを取得するときにクレジットカードの登録をします。
自動で課金が始まるわけではなく、無料枠を超えてから従量課金されます。
今回の場合、2019/6/29現在では、約8000リクエストまで無料なので、1か所について調べるだけでしたらそうそうは課金されません。(連続で実行したら当然課金されますが笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422678/e12011f2-113f-2433-9bbb-144c4caa1e1e.png)

※Googleによる料金体系変更や実行環境によって課金がされたとしても責任を負いません。


#5.取得したい場所のキーワード
場所の名称を指定します。今回の場合、神社を調べたいので、単純に「神社」を指定します。

但し文字コードを変換する必要があります。
そのため、このような[サイト](https://www.gadgety.net/shin/trivia/translate.html)で変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422678/072a8e9c-0040-5114-53c2-ccea72cab395.png)



#6.検索したい場所の緯度経度を取得
この[サイト](https://fukuno.jig.jp/app/printmap/latlngmap.html#13/35.680725/139.767380/&base=std&ls=std&disp=1&vs=c1j0l0u0f1)から緯度経度を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422678/d2f30c3c-d44c-7fea-cda8-b40e53345388.png)


カーソル(真ん中の十字)を合わせると、下に緯度経度が出てくるので、メモorコピーします。
今回の場合、(緯度,経度) = (35.680725,139.767380)

#7.コマンドの作成
当てはめるだけです。

こんな感じ

```python

# 色々とインポートする。
!pip install -U googlemaps
import pandas as pd
import googlemaps
# 取得したキーを''内に入力
key = '<取得したAPIキー(重要情報なのでさすがに貼れない笑)>'
gmaps = googlemaps.Client(key=key)
# 取得したい地点の緯度経度を入力
lon_lat = (35.680725,139.767380)

# 取得したい施設のキーワードをunicodeへ変換
keyword = '\u795e\u793e'

# APIキー・緯度経度・キーワードを入れた式を実行し、json形式で結果を取得
results_json = gmaps.places_nearby(location = lon_lat, radius = 2000, keyword = keyword, language = 'ja')

# JSON形式では読みにくいので、DataFrame形式に変換
df_results = pd.io.json.json_normalize(results_json, record_path='results')
# 住所と施設名称のみに情報を削る。
df_address_name = df_results[["vicinity","name"]]
# 表示
df_address_name
```

#8.実行環境
実行環境はブラウザ上([Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja))です。
Googleのアカウント(Gmailとか)があれば誰でも無料で使えます。

ファイル＞Python3の新しいノートブックを選択します。

あとは、先ほどのコマンドをコピペして実行するだけです。

実行するとこのように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422678/947f85fa-51ef-cb7c-ae5e-1fde03b0d5b0.png)

#9.データの保存・ダウンロード
もし保存・ダウンロードしたければ、以下を実行してください。

```python
from google.colab import files

df_address_name.to_csv('/content/example.csv', encoding='utf_8_sig')

files.download('example.csv')
```

#10.Google Maps APIの読みこんだドキュメント
今回使用したAPIのドキュメントについて日本語に訳せた部分をメモとして記述します。
(2019/06/29版)
[日本語版](https://developers.google.com/maps/documentation/)はあるのですが、一部翻訳がまだ(2019/06/29現在：僕の見落としかもしれません。)です。
参照したのは、Nearby Searchです。

~~パラメータの部分だけでもメモとして後日アップします。~~
日本語化できた部分アップしました。


| _    | パラメータ            | 説明                                                                                                                                                         |
|------|-----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 必須 | key                   | APIキー                                                                                                                                                      |
| 必須 | location              | 緯度,経度(カンマ区切りで入力)                                                                                                                                |
| 必須 | radius                | 緯度経度を中心とした半径(単位：m)、50000mが最大、ただし、後述のrankbyがdistanceだと、使用不可                                                                |
| 任意 | keyword               | 検索したい施設のキーワード                                                                                                                                   |
| 任意 | language              | 調べたい原語                                                                                                                                                 |
| 任意 | minprice and maxprice | 価格を0(most affordable)～4(most expensive)で評価しているらしい。それを使って検索できるっぽい(使用していないため不明)                                        |
| 任意 | name                  | keywordとほぼ同じ、ただし施設の名称に限らず検索する。ドキュメント上でKeywordを使うことをお勧めされているため、使用することはなさそう。(実際使用していない。) |
| 任意 | opennow               | クエリを送ったタイミングで営業中のものを回答する。(今回は使用していない。)                                                                                   |
| 任意 | rankby                | 返り値の並びを決める。Prominence(default)は重要度で判定(googleの情報に基づく)、distanceはlocationからの距離                                                  |
| 任意 | type                  | 返り値の施設の制限を加える。(種類については公式ドキュメント参照https://developers.google.com/places/web-service/supported_types?hl=ja)                       |
| 任意 | pagetoken             | 返り値は60までとなっているが、表示は20まで。以降についてはnextpagetokenを付けることで動作する。                                                              |


#最後に
これを活かして、地域全体の神社の数を取得してみます！

あと思ったのは、英語読めたほうが良いなってこと。
公式ドキュメントってやっぱり便利だし、でも日本語版もなかったりするし。