Yolp Android SDKを使ってみる
http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/androidsdk/
こちらのYOLP Android Map SDKでサンプル。
手順は簡単。
http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/androidsdk/tutorial1.html
ここに沿って作成。
とりあえずorg.codehaus.jacksonだけでなく、ダウンロードした、ymap.jarも
Androidプロジェクト直下のassetsフォルダーに配置し、
Build Pathに追加。
webのgoogle placeみたいなmapとlistが表示される画面を作る。
地図をロングタップすれば、その地点周辺のドトールコーヒーを検索し、ピンをプロット。listにも店名を表示。
といったアプリを作ります。
layout.xmlは以下。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/mainLayout" android:orientation="vertical" > <FrameLayout android:id="@+id/mapContainer" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="7" /> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="3" /> </LinearLayout>
FrameLayoutの子供に、ソース内からMapViewを割り当てる。
MapView生成
mapView = new MapView(this,getResources().getString(R.string.yolp_appid)); mapView.setBuiltInZoomControls(true); mapView.setLongPress(true); MapController c = mapView.getMapController(); c.setCenter(new GeoPoint(35665721, 139731006)); //初期表示の地図を指定 c.setZoom(3); //初期表示の縮尺を指定 FrameLayout mainLayout = (FrameLayout)findViewById(R.id.mapContainer); mainLayout.addView(mapView);
これだけでmapが表示される。
mapにタッチイベント割り当て。
mapView.setMapTouchListener(new MapTouchListener() { @Override public boolean onLongPress(MapView arg0, Object arg1, PinOverlay arg2, GeoPoint arg3) { // TODO Auto-generated method stub ArrayList<Overlay> overlays = (ArrayList<Overlay>) arg0.getOverlays(); overlays.clear(); arg2.clearPoint(); PinOverlay pinOverlay = new PinOverlay(PinOverlay.PIN_VIOLET); mapView.getOverlays().add(pinOverlay); pinOverlay.addPoint(arg3,null); StringBuilder url = new StringBuilder("http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/localSearch?output=json"); url.append("&appid="); url.append(getResources().getString(R.string.yolp_appid)); url.append("&cid=6e6c4795b23a5e45540addb5ff6f0d00"); url.append("&dist=1&sort=dist"); url.append("&lat="); url.append(""+(float)(arg3.getLatitudeE6()/1000000.f)); url.append("&lon="); url.append(""+(float)(arg3.getLongitudeE6()/1000000.f)); HttpAsyncTask httpClient = new HttpAsyncTask(); httpClient.execute(url.toString()); return false; } });
onLongPressイベントの中でyolp APIにアクセス。
緯度経度を割るのを忘れずに。
返ってきた値を
mapView.getOverlays().add(new YDFOverlay(result));
これだけで地図にピンが描画され、クリックすると店名が表示される。
AsyncTaskを使っているのでソースが前後していますが、
主な流れとしては上記の感じ。
これで喫煙者がタバコ吸いたくなって、ドトールなら吸えるだろう。サクっとアプリでドトール検索するかができちゃう。
感想
apiの結果パースせなアカンかーとかって思ったけど、そこはydfフォーマット。
サクっとAPIのレスポンスを食ってくれます。
楽チン。
チュートリアルではsetContentViewにmapViewをそのまま渡してるけど、地図以外も設置したいので、いつもどおりsetContentViewにはlayout.xmlを渡しました。
layoutは出来る限り、ソースの中には記述したくない派です。
しかしMapViewの第二引数がAttributeSetではなく、String appIdなので
MapViewを継承したカスタムビュー作成を試みたが、
MapViewがコンストラクタの第一引数にContent型ではなく、
Activity型になっており、うまくいかなかった。
欲を言えば、第一引数がContentで、
第二引数がAttributeSetのコンストラクタが用意されており、
appIdはattributeで渡すって感じになっていれば、layout.xmlに記述できたり、
カスタムビューが作成できたり、
ソース内でインスタンス生成しなくても済むので、今後そう改善されることを期待。
まだまださわりの機能しかつかっておらず、ルート検索や、目玉のARナビとか、いろんな機能が満載なSDK。
やはり日本語ドキュメントという点もわかりやすいですしね。
参考文献
ListView
http://www.adakoda.com/android/000077.html
HttpClient
http://techbooster.org/android/application/1801/
http://d.hatena.ne.jp/terurou/20110702/1309541200
AsyncTask(非同期リクエスト)
http://android.keicode.com/basics/async-asynctask.php
- 作者: Zigurd Mednieks,Laird Dornin,G. Blake Meike,Masumi Nakamura,永井勝則
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/02/17
- メディア: 大型本
- クリック: 22回
- この商品を含むブログ (7件) を見る