ドリリウム

釣り、DIY、バイク、車、家具作り、アクアリウム、コーヒー。熱意を持って趣味を続けていると勝手に集まる知識や経験、役立つことやおもしろいことを記事にしています。

MENU

【PHP + Google API】全国のキーワードにマッチする施設をリストアップする(Googleプレイス検索)

f:id:katamichinijikan:20180714110617p:plain

GoogleのAPIのうち、Google Places APIを使用してGoogle Map上に登録されているお店や施設をキーワードで検索し、リストを取得してみます。

API Keyの取得

GoogleのAPIを使用するにはAPI Keyの取得が必要です。

API Keyは各APIのページにある「キーの取得」ボタンから取得することができます。

https://developers.google.com/places/web-service/intro?hl=ja

取得にあたり、プロジェクトを作成する必要があります。

詳細は後述するリンク先を参照してください。とてもわかりやすくAPI Keyの取得方法を解説されており、僕も参考にさせていただきました。

Google Places APIで取得できるデータ

Google Places APIで取得できるデータの種類は以下の通りです。

  • 緯度
  • 経度
  • 施設名
  • 営業時間中か否か
  • 画像
  • 評価レート
  • 施設の種別
  • 住所

実際に取得できる生データは後述します。

Google Places APIの使い方(プレイス検索)

使用方法は、以下のURLにパラメータを付与して使用します。

https://maps.googleapis.com/maps/api/place/nearbysearch/json?パラメータ

 なお、パラメータ直前の「json」を「xml」に変更することで、データをXML形式で受け取ることも可能ですが、GoogleはJSONを推奨しています。

Google Places APIのパラメータ

必須パラメータ

指定が必要な必須パラメータは以下の3種類です。

  • key:冒頭でも説明したAPI Keyを指定します。
  • location:検索の中心位置の緯度経度を指定します。
  • radius:検索の範囲をメートルで指定します。(上限50000メートル)

プレイス検索は、とある地点を中心とした範囲の施設を検索することができます。そのためにlocation(範囲の中心)とradius(範囲の広さ)を指定する必要があります。

全国、あるいはある都道府県内をすべて検索する方法は後述します。

任意パラメータ

任意に指定できるパラメータは多数あるため、特に使用頻度が高そうなものを紹介します。

  • keyword:施設を絞り込むキーワードです。
  • language:検索結果の言語です。
  • types:施設の種別です。

keywordには、実際にGoogle Mapを使用して施設を検索する時のように自由なキーワードを指定することができます。例えば「コンビニ」「喫茶店」「コインパーキング」ような感じです。

languageには、言語コードを指定します。日本語は「ja」です。

言語コードの一覧は以下のURLを参照してください。

https://developers.google.com/maps/faq?hl=ja#languagesupport

typesには、施設の種別コードを指定します。

一覧は以下のURLを参照してください。結構充実しています。

https://developers.google.com/places/web-service/supported_types?hl=ja

Google Places APIのパラメータを指定する

パラメータを指定した一例です。

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=43.041403,141.31998&radius=5000&type=restaurant&key=API Key

この例では、とある緯度経度43.041403,141.31998(北海道札幌市中央区旭ヶ丘一丁目)を中心とした5kmの範囲にあるレストランの情報を取得することができます。

 

同様に、キーワードで検索したい場合にはkeywordパラメータにキーワードを指定します。以下の例では、「ボーリング」をキーワードに指定しています。

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=43.041403,141.31998&radius=5000&keyword=ボーリング&key=API Key

 Google Places APIで取得できるデータ

Google Places APIでJSON形式のデータを取得すると以下のようなデータを取得することができます。

{ "html_attributions" : [],
    "results" : [ {
        "geometry" : { "location" : { "lat" : 緯度, "lng" : 経度 }, "viewport" : {             "northeast" : { "lat" : 北東端の緯度, "lng" : 北東端の経度 }, "southwest" : { "lat" : 南西端の緯度, "lng" : 南西端の経度 } } },
        "icon" : アイコン画像のURL,
        "id" : 施設ID(廃止予定、今後はplace_idを使う),
        "name" : 施設名称,
        "opening_hours" : { "open_now" : 営業中か否か(true/false), "weekday_text" : [営業曜日] },
        "photos" : [ 施設の写真(URL、サイズ) ],
        "place_id" : 施設ID,
        "rating" : 評価レート,
        "reference" : 廃止,        
        "scope" : 公開されている施設はこの値がGOOGLEになっている,
        "types" : [ 施設の種別 ],
        "vicinity" : 住所 },

], "status" : ステータス }

 

results配列内に、それぞれの施設の情報が格納されています。

{}で囲まれた青字部分が1施設に対する情報です。実際にはこれがずらずらと並びます。

最後にあるstatusには以下のいずれかのステータスコードが格納されています。

  • OK:検索結果が1件以上かる正常に検索が終了
  • UNKNOWN_ERROR:サーバーでエラーが発生
  • OVER_QUERY_LIMIT:リクエスト数の上限を超えた
  • REQUEST_DENIED:API Keyが間違っているなど、無効なリクエスト
  • NOT_FOUND:検索結果が0件

PHPによる実装

いくつかの場所の周辺10kmにある、「ボーリング場」を検索してみます。

//配列にいくつかの緯度経度のセットを格納
//緯度経度はカンマでつなぎ、スペースは含めない
$latlngList = array("43.041403,141.31998", "43.157152,141.39035", "43.12192,141.374715", "43.042741,141.395135");
$key = '自身のAPI Key';
$keyword = 'ボーリング場';
foreach($latlngList as $latlng){
    $url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location='.$latlng.'&radius=10000&language=ja&keyword='.$keyword.'&key='.$key;
    $data= json_decode(@file_get_contents($url), true);
    foreach($data["results"] as $info){
        $lat = $info["geometry"]["location"]["lat"]; //対象施設の緯度
        $lng = $info["geometry"]["location"]["lng"]; //対象施設の経度
        //緯度経度をもとに日本語の住所を取得
        $geo = json_decode(@file_get_contents('http://maps.google.com/maps/api/geocode/json?latlng='.$lat.','.$lng.'&sensor=false&language=ja'), true);
        $address = $geo['results'][0]['formatted_address'];
        //緯度、経度、施設名、住所をカンマ区切りで画面に出力
        echo $lat.",".$lng.",".$info["name"].$info["vicinity"].$address."<br>";
    }
}

途中の赤字の2行でGoogle Geocoding APIを使用して緯度経度から住所を取得しています。Google Places APIで取得している住所(vicinity)と何が違うのかというと、実際に出力してみるとわかるのですが、vicinityでは住所の建物名が抜けてしまいます。Google Geocoding APIを使用することで100%補えるかどうかは確認していませんが、少し精度が増すと思います。

全国の施設をまとめて検索したい

全国の施設をまとめて検索するには、全国を網羅する緯度経度の一覧が必要です。

潮位表を作成した時の副産物で、大変地味な作業により集めた全国すべての市町村の緯度経度の一覧がありましたので、こちらで公開しています。

緯度経度一覧 - 全国の都道府県・市町村単位の緯度経度一覧表

なお、GoogleのAPIの利用制限に引っかからないよう、課金登録していない場合には2度に分けることをおすすめします。

さいごに

こちらを参考にさせていただきました。

Google Maps API の使い方(第1回 APIキーの取得) – Output48

PHPでJSONのデータを処理する方法

緯度経度から住所を取得してリスト化したい【逆ジオコーディング】

ありがとうございます。