はじめに
位置情報系のアプリなら住所表示機能も割とありますよね。
Androidアプリで緯度経度から住所を取得するのにGeoCorderを利用しますが、日本の住所はそのまま使うと綺麗じゃないなと思ったので整形処理を書いてみました。
コード
/** 緯度経度から住所を取得する */
suspend fun getAddress(context: Context, latLng: LatLng): String? = withContext(
Dispatchers.IO) {
try {
val geoResult = Geocoder(context, Locale.getDefault()).getFromLocation(
latLng.latitude,
latLng.longitude,
1
)
geoResult.firstOrNull()?.let {
var address = it.getAddressLine(0)
// 日本の場合、住所を整形する
if (Locale.getDefault() == Locale.JAPAN || Locale.getDefault() == Locale.JAPANESE) {
// 国名を除去
address = address.replace(it.countryName, "")
// 郵便番号を除去
address = address.replace("〒?\\d{3}-\\d{4}".toRegex(), "")
// 区切り文字の連続を除去
address = address.replace("、{2,}".toRegex(), "、")
address = address.replace(",{2,}".toRegex(), ",")
// 先頭の区切り文字を除去
address = address.replace("^[、,]+".toRegex(), "")
// 最後の区切り文字を除去
address = address.replace("[、,]+\$".toRegex(), "")
// スペースを除去
address = address.replace(" ", "")
}
return@withContext address
}
} catch (e: Exception) {}
return@withContext null
}
住所取得処理はネットワークにアクセスし時間がかかる処理のため、suspend関数として実装しています。
住所整形について
まず、Geocorder.getFromLocationでどんな値が返ってくるか確認してみます。
試しに東京の適当な緯度経度を入れてみると、次のような結果が返ってきました。
[
Address[
addressLines=[0:"日本、〒150-0002 東京都渋谷区渋谷1丁目23−21 キャスト1510"],
feature=21,
admin=東京都,
sub-admin=null,
locality=渋谷区,
thoroughfare=1丁目,
postalCode=150-0002,
countryCode=JP,
countryName=日本,
hasLatitude=true,
latitude=35.662597,
hasLongitude=true,
longitude=139.70284909999998,
phone=null,
url=null,
extras=null
]
]
addressLines[0]の"日本、〒150-0002 東京都渋谷区渋谷1丁目23−21 キャスト1510"がほぼそのまま使えそうですね。
上で記載したコードはこれをベースに整形しています。メソッドの返り値は次のようになります。
東京都渋谷区渋谷1丁目23−21キャスト1510
おわりに
住所は多種多様なので、これで完璧!というのは難しそうですね。
こっちの方がいいんじゃない?等、ありましたら教えていただけると嬉しいです。
最後に宣伝になりますが、このコードを組み込んだAndroidアプリ「ココメモ」をリリース中です!
現在地をメモ帳感覚でラクラク記録できます。お出かけの記録などにいかがでしょうか?