Kasasagi’s memorandum

JavaとかProcessingとか。最近はAtcoderとか。

Google Maps APIを利用して住所等の取得

こんにちは、かささぎです。正月準備なんもやってない。

今回は、前回の記事で作成したExcelファイルを、Google Maps APIを利用して埋めていきます。
と思ったのですが、JavaJSONを扱うのが面倒だったので、JavaScriptでやることにしました。そこでExcelではなくスプレッドシートを利用します、すみません。
そもそもJSONJavaScriptのためのフォーマットなので、そちらのほうが適しているのは明白です。
Javaで実装する場合にはPOIやJSONライブラリが必要ですが、JavaScriptなら、GASだけで実装できます。
GASの記事はこちら→GASを用いたウェブシステム - Kasasagi’s memorandum
スプレッドシートExcelファイルを開くこともできるので、前回のファイルをそのまま利用できます。

今回はこちらのGoogle Maps APIを利用します。Google マップ ウェブサービス API  |  Google Developers
Google Mapの画像を取得したり、データを利用できたりします。
Android,iOSなどいろいろな環境で利用できますが、今回はウェブサービスのものを利用します。
ウェブサービスAPIでも、地点間の道順を計算するGoogle Maps Direction APIや、標高のデータを使用できるGoogle Maps Elevation APIなどいろいろ用意されています。今回は、住所と地理的座標を取得できるGoogle Maps Geocoding APIを利用します。

このAPIを利用するにはAPIkeyを発行する必要があります。key発行についてはGASの記事にあるのでご覧ください。
で、このkeyを用いて以下にアクセスしてみます。

https://maps.googleapis.com/maps/api/geocode/json?address={アドレス}&key={APIキー}

jsonのところをxmlに変えてxml形式で取得もできるそうですが、JSON推奨らしいです。
{アドレス}には検索する住所や、検索する建物・施設などのデータを入れます。つまり、普段GoogleMapで検索するように入れます。
{APIキー}には発行したAPIkeyを入れます。
すると、こんな感じでJSONのファイルを取得できます。
f:id:yh9092:20171229133354p:plain
あとは、これをJavaScript側で実行し、値をいい感じに取得するだけです。

<プログラムコード>

gist969b7b4372222d2445669d285839069d

myFunction関数を呼び出し、getData関数内で、APIにアクセスしデータを取得しています。
while文内では、まずsearchにシート内の検索するデータを格納します。
searchが空白セルでないときは、getData関数で検索します。
得るデータは連想配列で、それぞれ住所、緯度、経度のデータが入っています。
連想配列は返り値をそのまま利用できとても便利です。
そのデータをスプレッドシートに書き込んで、次の行に移る、のループです。

getData関数は、まあJSONのあるURLにアクセスして読んでるだけです。
注意しなければならない点は、GoogleMapで検索した時に、複数候補が出てくるように、resultsのデータが複数になることがあることです。
基本は一番上のデータが信頼度が高く、今回のような場合は最初のデータでいいためこれを利用しています。
データの格納ができたら、連想配列をそのまま渡して終わりです。

<実行結果>
f:id:yh9092:20171229135206p:plain
ブラウザでアクセスした場合住所は日本語なんですが、GASで取得すると英語になるのはなぜでしょうか。まあ今回は住所については利用しない予定なので、深くは気にしません。八戸高専の住所がJapanだったり、鳥羽商船の住所がパソコンスクールだったりしてますが気にしません。

ちなみにこのAPIは、無料版だと利用制限があります。2500回/日までのアクセスで、それ以上は従量課金制らしいです。
60件*数回程度しかアクセスしていないのですが、引っ掛かりました。カウント方法は別なんですかね?

あとは、この緯度・経度データを利用して、地図にプロットしていきます。Javaでマップ画像を利用するのが難しそうなので、JavaScriptに逃げたくなってます。がんばります。

それでは。