Geocoder を用いてリバースジオコーディングを行なう非同期タスク
ジオコーディング (geocoding) は住所から緯度経度の情報を求めることです。
一方、緯度経度の情報から住所情報を取得することを、リバース・ジオコーディングといいます。
通常の生活ではどこかの場所を調べるときは、先に住所が取得でき、それから必要に応じて緯度経度の情報に変換することになります。
一方、スマートフォンなどの GPS を位置センサーを備えたデバイスでは、むしろ先に緯度経度の情報が取得できて、そこから「それって、そもそもどこなの?」という話になります。
もちろん、自分が今いる場所であれば普通そんな疑問もないでしょうが、知らない土地を車で走っているようなときには、「ここってどこなの?」という疑問は自然と起こります。
その疑問に答えるのがリバース・ジオコーディングということになります。
Android プログラミングでは、ジオコーディング、及び、リバース・ジオコーディングを行なうのは android.location.Geocoder クラスです。
Geocoder クラスの getFromLocation メソッドに緯度経度を渡すと、住所を表す (Address) クラスのリストを返すことになっています。
ここでは時間のかかる(可能性のある)リバースジオコーディングの作業を、非同期タスクで実施する状況を考えます。
非同期タスク (AsyncTask) については、AsyncTask を利用した非同期処理 をみてください。
コードは次のようになります。
package com.example.getaddr;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.os.AsyncTask;
public class UpdateAddrAsyncTask
extends AsyncTask<Void, Integer, String> {
static String TAG = "UpdateAddrAsyncTask";
Context context;
double lat;
double lng;
public UpdateAddrAsyncTask(
Context context,
double lat,
double lng){
this.context = context;
this.lat = lat;
this.lng = lng;
}
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(Void... params) {
String ret = "";
try {
Geocoder gcd = new Geocoder(context, Locale.getDefault());
List<Address> addresses = gcd.getFromLocation(lat, lng, 1);
if (addresses.size() > 0) {
ret = addresses.get(0).getLocality();
}
} catch (IOException e) {
e.printStackTrace();
}
return ret;
}
@Override
protected void onPostExecute(String result) {
}
}
ポイントは Geocoder の getFromLocation メソッドを呼ぶ箇所だけです。
もし結果を表示するなどの UI へのアクセスを行なう場合には、onPreExecute や onPostExecute などで実施可能です。
これを呼ぶ方法は lat, lng を double 型の緯度経度情報として、次の通りです。
new UpdateAddrAsyncTask(
getBaseContext(),
lat,
lng).execute();
位置情報を利用する方法については、「条件にあう位置情報プロバイダから、位置情報を利用する簡単な例」をみてください。