PHPで「ぐるなび」を使って喫茶店を探す

(1/1)
ぐるなび Web サービス:レストラン検索API」は、ぐるなびに掲載されている飲食店の基本情報(住所など)や緯度経度、設備情報、クーポン URL、画像 URL などを取得することができる WebAPI サービスだ。
これと、Google マップを描いたり住所から緯度・経度を求める WebAPI「Google Maps API」および、京都の通り名住所から緯度・経度を求める WebAPI「ジオどす II」をマッシュアップすることで、住所やランドマークから最寄りの喫茶店を求める PHP プログラムを作ってみることにする。

この記事では以前、「駅データ.jp」が提供する WebAPI を利用し駅の近くの珈琲店を探すプログラムを紹介していたが、2012 年(平成 24 年)10 月、駅名検索API がサービスを中断したため、WebAPI を変更し、プログラムの機能も変更した。

2018 年(平成 30 年)11 月 6 日、ぐるなび Web サービスの新 API(v3)に対応した。

サンプル・プログラムの実行例

PHPで「ぐるなび」を使って喫茶店を探す

サンプル・プログラムのダウンロード

圧縮ファイルの内容
searchCafe.phpサンプル・プログラム本体
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」などを参照。include_path が通ったディレクトリに配置すること。

サンプル・プログラムの流れ

PHPで「ぐるなび」を使って喫茶店を探す
プログラムの流れは「PHP で最寄り駅を求める」の時と同じで、緯度・経度から施設情報を求める部分を、「ぐるなび Web サービス:レストラン検索API」に差し替えただけである。

解説:クラスファイル

住所やランドマークから緯度・経度を求める処理は、「PHP で最寄り駅を求める」で作成したクラス pahooGeoCode を利用する。
クラスファイル "pahooGeoCode.php" の配置、各種WebAPI用のアプリケーション ID の設定方法については、「解説:pahooGeoCode クラス」を参照してほしい。

「ぐるなびWebサービス:レストラン検索API」による店舗探索

ぐるなび Web サービス:レストラン検索API」は、入力パラメータ(IN)は GET 渡しで、出力結果(OUT)は JSON で戻すという形である。今回使う入力パラメータと出力結果のデータ構造の一部を以下に記す。
WebAPI
URL
https://api.gnavi.co.jp/RestSearchAPI/v3/

入力パラメータ
フィールド名 要否 内  容
keyid 必須 ぐるなびより提供されたアクセスキー
input_coordinates_mode 任意 入力パラメータに含まれる緯度/経度の測地系を指定
1:日本測地系
2:世界測地系(デフォルト)
latitude 任意 検索地点の緯度(小数表記)
longitude 任意 検索地点の経度(小数表記)
coordinates_mode 任意 レスポンスに含まれる緯度/経度の測地系を指定
1:日本測地系
2:世界測地系(デフォルト)
range 任意 緯度/経度からの検索範囲(半径)
1:300m、2:500m(デフォルト)、3:1000m、4:2000m、5:3000m
freeword 任意 検索ワードをUTF-8でURLエンコードすること「,」区切りで複数ワードが検索可能(10個まで)
出力パラメータ (JSON)
フィールド名 内  容
@attributes api_versionAPIのバージョン
total_hit_count該当件数
hit_per_page表示件数
page_offset表示ページ
total_hit_count表示ページ
rest[] id店舗ID
update_date情報更新日時
name店舗名
name_kana店舗名称(カタカナ)
latitude緯度(小数表記)
longitude経度(小数表記)
categoryフリーワードカテゴリー
urlPCサイトURL
url_mobile携帯サイトURL
address住所
tel電話番号
opentime営業時間
holiday休業日

アプリIDの入手

0028: //ぐるなびWebサービス アクセスキー:http://api.gnavi.co.jp/api/ で発行
0029: define('GNAVI_ACCESSKEY', '*************************');

ぐるなび Web サービス」を利用するには、利用申請を行い、アカウントを発行してもらい、アクセスキーを取得する必要がある。アカウントは無料である。

サンプル・プログラムをダウンロードしたら、定数 GNAVI_ACCESSKEY に自分のアクセスキーを記述する。

解説:ぐるなびWebサービス

0183: /**
0184:  * ぐるなびWebサービスのURLを取得する
0185:  * @param double $latitude  緯度(世界測地系)
0186:  * @param double $longitude 経度(世界測地系)
0187:  * @param double $distance  範囲(メートル)
0188:  * @param string $freeword  フリーワード検索(カンマ区切り)
0189:  * @return string URL レストラン検索APIのURL
0190: */
0191: function getURL_RestSearchAPI($latitude$longitude$distance$freeword) {
0192:     $range_tbl = array(1=>300, 2=>500, 3=>1000, 4=>2000, 5=>3000);
0193: 
0194:     $keyid = GNAVI_ACCESSKEY;
0195:     $range = count($range_tbl);
0196:     foreach ($range_tbl as $key=>$val) {
0197:         if ($distance <= $val) {
0198:             $range = $key;
0199:             break;
0200:         }
0201:     }
0202:     $freeword = urlencode($freeword);
0203: 
0204:     $url = "https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid={$keyid}&input_coordinates_mode=2&coordinates_mode=2&latitude={$latitude}&longitude={$longitude}&range={$range}&freeword={$freeword}";
0205: 
0206:     return $url;
0207: }
0208: 
0209: /**
0210:  * レストラン検索APIを利用して指定座標の近くにある喫茶店を検索
0211:  * @param double $latitude  緯度(世界測地系)
0212:  * @param double $longitude 経度(世界測地系)
0213:  * @param double $distance  範囲(メートル)
0214:  * @param array $items 情報を格納する配列
0215:  * @return array(ヒットした施設数, メッセージ, APIのURL)
0216: */
0217: function searchCafe($latitude$longitude$distance, &$items) {
0218:     $url = getURL_RestSearchAPI($latitude$longitude$distance, '喫茶店');
0219:     $data = @file_get_contents($url);
0220:     $json = json_decode($data);
0221: 
0222:     //レスポンス・チェック
0223:     if (($data == FALSE|| ($json == NULL)) {
0224:         if (isset($json->error->message)) {
0225:             $msg = (string)$json->error->message;
0226:         } else {
0227:             $msg = '検索範囲に店舗が無いか,ぐるなびWebサービスのエラーです';
0228:         }
0229:         return array(FALSE$msg$url);
0230:     }
0231: 
0232:     //応答解釈
0233:     $n = 1;
0234:     foreach ($json->rest as $element) {
0235:         $items[$n]['id']        = num2alpha($n);
0236:         $items[$n]['title']     = (string)$element->name;
0237:         $items[$n]['url']       = (string)$element->url;
0238:         $items[$n]['category']  = (string)$element->category;
0239:         $items[$n]['phone']     = (string)$element->tel;
0240:         $items[$n]['opentime']  = preg_replace("/\n/ui", '<br />', (string)$element->opentime);
0241:         $items[$n]['holiday']   = preg_replace("/\n/ui", '<br />', (string)$element->holiday);
0242:         $items[$n]['latitude']  = (double)$element->latitude;
0243:         $items[$n]['longitude'] = (double)$element->longitude;
0244:         $address = (string)$element->address;
0245:         $address = preg_replace('/〒[0-9\-]+ /ui', '', $address);
0246:         $address = preg_replace("/\n/ui", '<br />', $address);
0247:         $items[$n]['address'] = $address;
0248: $items[$n]['description'] =<<< EOD
0249: <a href="{$items[$n]['url']}" target="_blank">{$items[$n]['title']}</a><br />電話:{$items[$n]['phone']}<br />住所:{$items[$n]['address']}<br />営業時間:{$items[$n]['opentime']}<br />定休日:{$items[$n]['holiday']}
0250: EOD;
0251:         $n++;
0252:     }
0253: 
0254:     return array($n, '', $url);
0255: }

ぐるなび Web サービス:レストラン検索API」を呼び出し、店舗情報を配列 $items に格納するのが、ユーザー関数 searchCafe である。WebAPI の応答を  json_decode  を使って解釈し、配列 $items に格納する。

Google マップに描画する際に必要になるので、要素 description には、店舗名、電話番号、住所、営業時間、定休日とリンク先 URL をハイパーリンクする。

参考サイト

(この項おわり)
header