MENU

Google Places APIを弄んでみた。

ちょっと前までディベロッパープレビューとして公開してたみたいだけど、どこにもそんな記述がなかったので、遊んでみた。追々語りますが、まだ実用的には使えないみたいという結論ですがw

そもそもGoogle Places APIって?

公式ドキュメントはこちら
Google Places API - Google Maps API ウェブ サービス - Google Code

Googleさん曰く、

Google Places API は、この API 内で施設、地理的位置、有名なスポットとして定義されている「プレイス」についての情報を HTTP リクエストを使用して返すサービスです。プレイス リクエストでは、場所を緯度と経度の座標として指定します。

だそうです。ようするに、特定の地点から直近のお店だったり施設だったりを提供してくれるAPIです。

んで、どうやったらGoogle Places APIが使えるの?

詳しくは制限と要件という項目に書いてあるけど、Google APIs Consoleでプロジェクトを作成して、Places APIを有効にして、APIキーを取得したらあとはご自由に、的な。

例えばこのページの表示しているように、
・東京駅(location=35.6814,139.7674)周辺の宿泊施設(types=lodging)をエイヤっ!
って感じで取得できます。

https://maps.googleapis.com/maps/api/place/search/json?location=35.6814,139.7674&radius=3000&types=lodging&language=ja&sensor=false&key=APIキー

こんな感じ。

{
   "html_attributions" : [],
   "results" : [
      {
         "geometry" : {
            "location" : {
               "lat" : 35.6746940,
               "lng" : 139.7606560
            }
         },
         "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/lodging-71.png",
         "id" : "5e2cdfc2ce23e9eac994429ee0c7a55ab32793df",
         "name" : "ザ・ペニンシュラ東京",
         "rating" : 4.20,
         "reference" : "CoQBdQAAADg_j0JYT6-QLqynjMjKFcWz70z6ZPwDGFaYdMz2KT-fLiAk3bKy-v7ti9WectYK412BLM009r_CsqB4xk6fLYcTTwuHeznzAJxzszHF_CFx5v_Qjy5XCpjZquDKpgEnHxDjk-mbYKEzjvbLd1JzXBkFxKgv3QIUdCKR-OicyNpwEhDVxkNAtWDf5VQ-GQnmqG_XGhR0yqgal3Ytlus11TPAhHBZZHRsPg",
         "types" : [ "lodging", "establishment" ],
         "vicinity" : "東京都千代田区有楽町1-8-1"
      },
      //(以下繰り返し)
      {}
   ],
   "status" : "OK"
}

ここでは宿泊施設を指定したけど、その他ATMやら図書館とかヒンドゥー寺院とか(!)いろんなタイプが選択可能。
Google Places API: サポートされるプレイス タイプ - Google Maps API ウェブ サービス - Google Code

で?実際使えそう?(その1)

もうぜんぜん無理。だって、

API キーを取得済みのユーザーは、24 時間に 1 000 件のリクエストを実行できます。

だもんね。一応、

API コンソールでの ID の確認が済んでいるユーザーは、24 時間に 100 000 件のリクエストを実行できます。コンソールでの ID の確認では、請求を可能にするためのクレジットカードが必要です。このカードに Places API の使用料が請求されることはありませんのでご安心ください。

ってあるから試してみたら、確かに制限は100,000に変更されたけど、やっぱ自前キャッシュ的な対応しないと無理なんじゃね?

で?実際使えそう?(その2)

Javascriptだけの実装では無理。

当然ながら実装するサーバ(例えばこのblog.motoo.netとか)から外部のサーバ(ここではhttps://maps.googleapis.com/)にアクセスするわけだから、クロスドメインでのアクセスということになり、XMLでの取得は無理で、JSON、というかJSONPでのアクセスが必要となるわけだけど、このGoogle Places APIではJSONPをサポートしていないみたい(2012-03-07現在)。これがわからずに数時間を無駄にしました……。

Googleの中の人曰く「We don't provide a JSONP interface for Autocomplete」だって。

仕方ないから、自サーバ上にJSON取得用のPHPを置いて、それ経由で取得する必要あり。
(自サーバのPHPを経由する時点でJSONPじゃなくてJSONでもいいんだけど)

<?php

header('Content-type: application/json; charset=utf-8');

if (isset($_GET['callback'])) echo "{$_GET['callback']}(";
readfile("https://maps.googleapis.com/maps/api/place/search/json?{$_SERVER['QUERY_STRING']}");
if (isset($_GET['callback'])) echo ');';

こんな感じの踏み台を用意して、

	jQuery.ajax({
		url: './get_GooglePlacesJSON.php',
		dataType: 'jsonp',
		type: 'GET',
		data: {
			location: '35.6814,139.7674',
			radius: 3000,
			types: 'lodging',
			language: 'ja',
			sensor: 'false',
			key: '1234567890_ABCDEFGABCDEFGABCDEFGABCDEFG'
		},
		jsonp : 'callback',
		success: function(json, status) {
			//成功したときの処理
		},
		error: function () {
			//失敗したときの処理
		}
	});

ってやればいいんじゃないの?

中身をほじくって勉強したい方はgooglePlacesAPI.htmlのソースを舐めまわしたら良いと思うよ。(そしてフィードバック求む!)