masat999's posterous http://masat999.posterous.com Most recent posts at masat999's posterous posterous.com Tue, 18 Jan 2011 04:20:00 -0800 Google Map API + Geocoding API on Android http://masat999.posterous.com/google-map-api-geocoding-api-on-android http://masat999.posterous.com/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は海のど真ん中を返すので、ズームサイズが適切でないと島が見えずにバグったかと思ってしまいますよ。

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

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/881492/27350_100001241700967_5524_n.jpg http://posterous.com/users/YrBcdfy4Gpb masat999 masat999
Wed, 01 Dec 2010 02:04:00 -0800 Google Static Mapの活用(移動・マーカー) http://masat999.posterous.com/chief-technical-officer-google-static-maps http://masat999.posterous.com/chief-technical-officer-google-static-maps

今開発中のアプリと連携してGoogle Static Mapをサイト上に表示する仕組みを実装しているところで、地図を移動する時のロジックを調べてました。ズームレベルと移動距離の関係ってどこかに仕様無いのか?

ありました。ドンピシャな答えをまとめてくれてる人がいました。

Google Static Mapsの画像はズームレベル0のとき、幅256ピクセルで経度360度分を表示し、高さ256ピクセルで緯度170度分(画像は南緯・北緯ともに85度 までの模様)を表示します。ズームレベルが1になると4倍ズームになるので表示できる範囲が半分になり、256ピクセルで経度180度分、緯度85度分を 表示します。

これを計算式にすると以下のような感じになります。
[東へ移動したときの中心経度]=
(180 + [元の中心経度] - [画像幅] / 256 * 180 / 2^[ズームレベル]) mod 360 - 180
[南へ移動したときの中心緯度]=
(90 + [元の中心緯度] - [画像高さ] / 256 * 85 / 2^[ズームレベル]) mod 180 - 90

すばらしいです。この場を借りてお礼申し上げます。

ちなみに、アプリ上からGPSで取得した緯度・経度はDBに保存して、Static Map上のマーカーとして表示しています。当然のことですが、データが蓄積すると全てデータを取得することは不可能になるので、”今いる場所から半径○○メートル以内”且つ”最新○○件”のデータを取得するようにしたいと思っています。

そこで問題なのが、単純なクエリーだと範囲は長方形状になり、円ではないということです。そこはあえて妥協したくないので、これも調べてみました。内容が濃いのでリンク参照してください。

Geo/Spatial Search with MySQL

リンク先で言っていることは、要はストアドプロシージャ使えってことです。統計上133倍速くなるそうです。が。これだけのためにストアド書くのもどうなんだろうなぁ…と立ち止まる。

DB側は単純クエリーで長方形のレンジだけ絞って、残りの円から外れるものはSQLの外でフィルタすれば良くないか?乏しいリソースなんだから何でもかんでもDBにやらせてボトルネックが集中するのは良くないよ!と心の声がつぶやくのです。ロジックは分散するけどリスクを議論するほど大きなシステムでもないですし。

ってことでやるべき事のベクトルは定まりました。後は実装してiPhone版もそろそろ手をつけてみなきゃ。
そういえばデザインもそろそろ上がってくるはずなんだけど、どうなってんだ?

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/881492/27350_100001241700967_5524_n.jpg http://posterous.com/users/YrBcdfy4Gpb masat999 masat999
Mon, 15 Nov 2010 22:53:00 -0800 AndroidでGoogle Mapなアプリ製作中 http://masat999.posterous.com/androidgoogle-map http://masat999.posterous.com/androidgoogle-map

AndroidでGoogleMapと連携するアプリ作ってました。ま、位置ゲーみたいなネタアプリです。
(外部公開するかどうかは未定)

Sc-2

さ、次はiアプリ版も作るか、なんて意識が移ったところで気づいたのが

Google Map API 使えへん・・・

急いで調べてみたところ、モバイルGoogle MapアプリからKMLをパラメータで読みこむことで解決。自分で一からモバイルGoogle Map実装するなんて時間の無駄でアホらしい。つーかそもそもできるかどうかもわからんしwww

Androidでも同じことできたんちゃうの?な疑問に改めてAPIドキュメントを読み返したが、今のところAPIではKMLはサポートされてないようなのでほぼ保留。XMLのparse処理を独自スキーマからKMLに変更するぐらいかな。

とにかくサーバー側でのXML掃き出しがKMLに準拠していれば、他にも使い回しが利くはず…。

時間ができたら iアプリ編と兼ねてTipsなんかも載せてみたいと思う今日この頃です。(遠い目)

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/881492/27350_100001241700967_5524_n.jpg http://posterous.com/users/YrBcdfy4Gpb masat999 masat999