今回はGoogle Maps Platform の Places APIを使います。検索したらExcelファイルに施設の名前、住所、電話番号、開店時間などを保存します。

Places APIを使えるようにする方法はGoogle Maps API を使ってみた – Qiitaが画像もつかって説明してくれているのでわかりやすいです。Google Cloud Platformはどこをクリックしていいかわかりにくくて使いにくいです。

さてGoogle Cloud Platformでプロジェクトを作成したら(既存のプロジェクトがあるならそれを使ってもよいが…)、APIライブラリのPlaces APIを探してこれを有効化します。そしてAPIキーを取得しましょう。

キーワードから施設の名称と住所を取得する

“https://maps.googleapis.com/maps/api/place/textsearch/json?key={取得したAPI_KEY}&query={検索したいキーワード}&language=ja”にアクセスするとjson形式でレスポンスを取得することができます。

取得されるjsonファイルはもっと長いのですが、取得したいのは施設の名称と住所、そして place_idだけなのでそれ以外の部分は省略しました。本当は営業時間や電話番号、webサイトがあれば取得したいのですが、これはplace_idを使ってもう一回検索をして取得します。

UIはテキストボックスにキーワードを入力してボタンを押せばExcelファイルに取得したデータが保存されるようにします。

まずExcelファイルをどこに保存するかを決めるための手段を用意します。これはこのかん毎度のように登場しているどこにファイルを保存するかをユーザーに決めさせるためのメソッドです。

これまで簡単に使えるのでWindowsForms(.NET Framework)を使ってきましたが、jsonファイルを簡単に使えるようにしたいのでWinFormsアプリケーション(.NET 5.0)を使います。

URLエンコードするためにHttpUtilityクラスを使用するのですが、WindowsForms(.NET Framework)の場合、HttpUtilityクラスを使用するには、System.Web.dllを参照設定に追加しなければなりません。でもWinFormsアプリケーション(.NET 5.0)なら自分でやる必要はありません。

Places APIでデータを取得する

まずPlaces APIでデータを取得しましょう。これで検索した結果がjson形式で取得されます。

取得したjson形式のデータをクラスで扱えるようにする

次に取得したjson形式のデータをC#で扱いやすい形に変形します。取得したいのは施設の名称と住所、そして place_idだけなのでそれを取得できれば充分です。

そこでこのようなクラスを作成します。

そのあとGetJsonTextFromSearchWord(keyword)メソッドを実行して得られたjsonデータをJsonSerializer.Deserializeメソッドに渡せばMapInfoクラスのインスタンスが得られます。そのなかにはResultオブジェクトの配列があり、ここから施設の名称と住所、place_idを取得することができます。

place_idから施設に関するその他の情報も取得する

次にplace_idから施設の情報を取得します。取得したいのは電話番号とWebサイト、営業時間です。以下のメソッドを実行するとjson形式でレスポンスが返されます。

json形式で返されるレスポンスは以下のようなものです。実際はもっと長いですが、必要な部分以外は省略しています。

そこで以下のようなクラスを作成してJsonSerializer.Deserializeメソッドを実行します。

Excelファイルに保存する

ここまでできたらあとは取得したデータをExcelファイルに保存するだけです。DataクラスはAPIのレスポンスを解析して取得できたデータをまとめておくためのクラスです。

それでは検索ボタンが押されたときの処理全体をみてみましょう。