masat999's posterous

Google Map API + Geocoding API on Android

AndroidにはGoogle APIアドオンがあるので、単純な地図アプリの実装は簡単ですよね。

ここではそのプラスアルファ編として、Geocoding API を利用して住所から緯度・経度を取得し、MapControllerを操作する方法について説明したいと思います。

// リクエストパラメータを設定する
String url = "http://maps.google.com/maps/api/geocode/xml?address=%s&region=%s&language=%s&sensor=true";
Locale locale = Locale.getDefault();
url = String.format(url, address, locale.getCountry(), locale.getLanguage());

// Androidでテキストボックスから住所文字列を取得する場合
String address = URLEncoder.encode(((EditText)findViewById(R.id.address)).getText().toString());

HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(new HttpGet(url));
client.getConnectionManager().shutdown();

// レスポンスがHttpStatus.SC_OKを返したら、XmlPullParserで処理する。(Android2.2以降ならXPathも使えるはず)
XmlPullParser parser = Xml.newPullParser();
parser.setInput(response.getEntity().getContent(), "UTF-8");
for (int e = parser.getEventType(); e != XmlPullParser.END_DOCUMENT; e = parser.next()) {
    // 略
}

// ViewPortから適切なズームサイズを設定する
int latSapn = Math.abs(/*//viewport/southwest/lat}*/ - /*//viewport/northeast/lat*/);
int lngSpan = Math.abs(/*//viewport/southwest/lng*/ - /*//viewport/northeast/lng*/);
mapController.zoomToSpan(latSpan, lngSpan);

// Locationを地図の中心に設定する
mapController.animateTo(new GeoPoint(/*//location/lat*/, /*//location/lng*/));

XmlPullParserでの処理についてやnullチェックなど、諸々を割愛してしまいましたが、要はXMLデータが取得できたら、中心となる<location>だけでなくズームサイズの設定に必要な<viewport>も返してくれているよ、ということです。

このviewportがなければ、パッと見とんでもないところに中心座標が移動してしまったように見えることがあります。例えばaddress=Hawaiiを渡してみてください。locationは海のど真ん中を返すので、ズームサイズが適切でないと島が見えずにバグったかと思ってしまいますよ。

あとは、これを別スレッドで処理するなど、モッサリ感満載の動作にならないようにケースバイケースで対処すれば大丈夫だと思います。

Filed under: android google api
0 comments

Leave a comment...

To Posterous, Love Metalab
Web Toolbar by Wibiya