以前、同種の位置情報サービスであるロケタッチのスポット検索を実装した。foursquareもロケタッチもスポット検索についてはほぼ類似の機能・アクセス方法を提供している。(特定のURLを呼び出して検索を実行し、結果はJSON形式で返却される。)
- ロケタッチ:https://api.loctouch.com/v1/spots/search
- foursquare:https://api.foursquare.com/v2/venues/search
いずれもパラメータを与えて検索を実行するが、foursquareはユーザに関する情報(*)も付加しないといけないという違いがある。
(*)認証は必要ではないが、アプリケーションの連携を許可した際に得られるアクセストークンが必要。
もちろんブラウザからも実行できるが、今後の自動チェックインのことも考えて、検索機能をサーブレットとして実装し、サーバからfoursquareにリクエストを発行する形態にすることを考える。
- ロケタッチ:クライアント(ブラウザ)からリクエスト発行
https://api.loctouch.com/v1/spots/search
クロスドメイン呼び出しになるので、JSONPを利用して検索結果を受け取る。
- foursquare:サーバからリクエスト実行
http://triplifeplan.appspot.com/xloc/spotsearch (URLは仮)
内部的な処理手順は以下のとおりとなる。
(1)ブラウザからサーブレット呼び出し
(2)サーバからfoursquareに検索リクエストを発行し、検索結果を受け取る
(3)JSON形式でブラウザに検索結果を返す
(4)ブラウザは結果を処理(表示など)する
いずれも「URL呼び出し→JSON形式で結果受取」という流れになるので、ブラウザアプリケーションのコーディング(JavaScript)は同じように行える。
- サーブレットの作成(サーブレット名:SearchSpotServlet)
サーブレットクラスを作成し、内部ロジックを完成させる。URLで指定したパラメータは、HttpServletRequest オブジェクトに対する getParameter()メソッドで取得することができる。スポット検索の結果をgoogle-gjonライブラリを使ってJSON形式に変換する。全体のコードは以下のイメージ。// Java public class SearchSpotServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException{ // foursquare検索用パラメータ String ll = "35.710063,139.810697"; String query = null; Integer limit = null; String intent = null; // URLの入力パラメータの解析 (?key1=value1&key2=value2) if (req.getParameter("ll") != null) { ll = req.getParameter("ll"); } if (req.getParameter("query") != null) { query = req.getParameter("query"); } if (req.getParameter("limit") != null) { limit = Integer.parseInt( req.getParameter("limit") ); } if (req.getParameter("intent") != null) { intent = req.getParameter("intent"); } Result<VenuesSearchResult> result = null; // 検索結果をセットする変数 try { result = searchSpotFoursquare(ll, query, limit, intent); // 検索実行 // 内部でfoursquare-api-javaライブラリを利用している Gson gson = new Gson(); // JSONライブラリの初期化 String jsonStr = gson.toJson(result); // 検索結果をJSON形式に変換する resp.setContentType("application/json; charset=UTF-8"); resp.getWriter().println(jsonStr); // JSON形式の検索結果をブラウザに返す } catch (FoursquareApiException e) { // 例外処理 e.printStackTrace(); } } }
- サーブレットクラスとURLを関連付ける(/searchspot)
方法はこちら。 - サーブレットを呼び出す
作成したサーブレットはJSON形式で結果を返すので、jQueryのgetJSON関数を使う。// JavaScript url = 'http://localhost:8888/searchspot?ll=35.694201,139.736648&limit=30&query=駅' $.getJSON(url, {}, function(data){ // dataにJSONデータがセットされる }
検索を含めたコードのイメージは以下。
// JavaScript function searchFrsqSpots(){ var ll; // 検索の中心となる経緯度。必須項目 var limit; // 検索結果の数。仕様上は省略可だが、今回は必ず指定する。 var query; // 検索キーワード(例:「駅」)。省略可。 var url; // サーブレットのパス // スポット検索のパラメータを設定 ll = gMap.getCenter().lat() + ',' + gMap.getCenter().lng(); // 地図は limit = ($('#txtFrsqLimit').val() == '')? '30' : $('#txtFrsqLimit').val(); query = $('#txtFrsqKeyword').val(); url = gServerPath + 'searchspot?ll=' + ll + '&limit=' + limit; if (query != ''){ url += '&query=' + query; } // スポット検索実行 var venues; // 検索結果(のうち地点に関するもの)の格納場所 var spots = []; // 表示用のデータ格納場所 $.getJSON(url, {}, function(data){ // サーブレット実行 venues = data['result']['venues']; // 結果から地点情報を取り出す for (var i = 0; i < venues.length; i++) { var spot = new Object(); // 中略 - 必要な項目のみ表示用の変数にコピーする spots.push(spot); } showGridLoctSpotList(spots); // 結果を表形式で画面表示 displayLoctSpots(spots); // 結果をマーカーにして地図に表示 } }
- 実行例