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();

位置情報を利用する方法については、「条件にあう位置情報プロバイダから、位置情報を利用する簡単な例」をみてください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門