В Android (с Java или Kotlin все в порядке), как я могу получить название города по долготе и широте?
Ниже я написал функцию для отображения данных адреса.Я хотел бы изменить его так, чтобы он возвращал название города:
private fun getCity(context: Context, latitude: Float, longitude: Float) {
val gcd = Geocoder(context, Locale.getDefault())
val addresses = gcd.getFromLocation(latitude.toDouble(), longitude.toDouble(), 1)
Log.d("-----", "-----")
Log.d("latitude", latitude.toString())
Log.d("longitude", longitude.toString())
if (addresses.size > 0) {
val locality = addresses[0].locality
if (locality != null) {
Log.d("locality", locality.toString())
}
val adminArea = addresses[0].adminArea
if (adminArea != null) {
Log.d("adminArea", adminArea.toString())
}
val subAdminArea = addresses[0].subAdminArea
if (subAdminArea != null) {
Log.d("subAdminArea", subAdminArea.toString())
}
val subLocality = addresses[0].subLocality
if (subLocality != null) {
Log.d("subLocality", subLocality.toString())
}
val thoroughfare = addresses[0].thoroughfare
if (thoroughfare != null) {
Log.d("thoroughfare", thoroughfare.toString())
}
val subThoroughfare = addresses[0].subThoroughfare
if (subThoroughfare != null) {
Log.d("subThoroughfare", subThoroughfare.toString())
}
val extras = addresses[0].extras
if (extras != null) {
Log.d("extras", extras.toString())
}
val premises = addresses[0].premises
if (premises != null) {
Log.d("premises", premises.toString())
}
val postalCode = addresses[0].postalCode
if (postalCode != null) {
Log.d("postalCode", postalCode.toString())
}
val featureName = addresses[0].featureName
if (featureName != null) {
Log.d("featureName", featureName.toString())
}
val getAddressLine0 = addresses[0].getAddressLine(0)
if (getAddressLine0 != null)
Log.d("getAddressLine0", getAddressLine0.toString())
for (i in 0 until addresses[0].maxAddressLineIndex) {
Log.d("getAddressLine($i)", addresses[0].getAddressLine(i).toString())
}
}
}
Если я запускаю getCity(context, 53.7f, -1.506f)
, featureName
содержит правильное название города, Уэйкфилд.
Если я запускаюgetCity(context, 53.801f, -1.549f)
, featureName
теперь содержит название улицы, Portland Place.getAddressLine(0)
return Portland Place, 5 Calverley St, Лидс LS1 3DA, Великобритания, в котором указан правильный город Лидс.Я мог бы удалить название улицы, почтовый индекс и номер дома из getAddressLine (0), чтобы оставить его с городом.К сожалению, существуют крайние случаи, когда это не сработает, потому что иногда название улицы содержит сокращения в getAddressLine(0)
, но не в thoroughfare
.
Этот вопрос Как получить название города по широте и долготе вУ android? есть ответы, которые совершенно разные, потому что адреса в разных странах хранятся по-разному.
Кажется, есть довольно много вариантов и крайних случаев, которые мне нужно кодировать, чтобы просто получитьназвание города для 2 соседних городов в Великобритании.Как я могу получить правильное название города с любой широты или долготы по всему миру?В мире слишком много городов, чтобы проверить мой код и использовать его, и может быть много крайних случаев и вариантов, о которых я даже не подозреваю.
Редактировать
Функция ниже правильно отображает город в Великобритании.К сожалению, это не удается в США, Индии и, вероятно, в любой стране, в которой есть штаты.
private fun getCity(context: Context, latitude: Float, longitude: Float): String {
val gcd = Geocoder(context, Locale.getDefault())
val addresses = gcd.getFromLocation(latitude.toDouble(), longitude.toDouble(), 1)
if (addresses.size > 0) {
val locality = addresses[0].locality
val getAddressLine0 = addresses[0].getAddressLine(0)
if (getAddressLine0 != null) {
val strs = getAddressLine0.split(",").toTypedArray()
if (strs.count() == 1) {
if (locality != null && locality != "") {
return "$locality, ${strs[0]}"
}
return strs[0]
}
for (str in strs) {
var tempStr = str.replace(postalCode, "")
if (tempStr != str) {
tempStr = tempStr.trim()
if (locality != null && locality != "" && locality != tempStr) {
return "$locality, $tempStr"
}
return tempStr
}
}
}
if (locality != null) {
return locality
}
}
return ""
}