Yolp Android SDKを使ってみる

最近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を使っているのでソースが前後していますが、
主な流れとしては上記の感じ。



すべてのソースはこちら
https://github.com/tegut/Android_YolpMapSample/blob/master/src/info/tteguri/yolpmapsample/YolpMapSampleActivity.java



これで喫煙者がタバコ吸いたくなって、ドトールなら吸えるだろう。サクっとアプリでドトール検索するかができちゃう。



感想
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

プログラミングAndroid

プログラミングAndroid