Как получить координаты городов, указанных пользователем?
Как вычислить расстояние между городами! Есть массивы из городов. Пользователь указывает пункт А и пункт Б. На пример Киев - Москва. Как узнать расстояние. Я понимаю, что нужно брать координаты. Но как взять координаты. Не вручную же прописывать координаты. Города у меня прописаны вручную. Для примера вот что мне нужно было:
if (city.getText().toString().trim().equals("Ивано-Франковск") ||
city.getText().toString().trim().equals("Болехов") ||
city.getText().toString().trim().equals("Бурштын") ||
city.getText().toString().trim().equals("Галич") ||
city.getText().toString().trim().equals("Городенка") ||
city.getText().toString().trim().equals("Долина") ||
city.getText().toString().trim().equals("Калуш") ||
city.getText().toString().trim().equals("Коломыя") ||
city.getText().toString().trim().equals("Косов") ||
city.getText().toString().trim().equals("Рогатин") ||
city.getText().toString().trim().equals("Снятын") ||
city.getText().toString().trim().equals("Тысменица") ||
city.getText().toString().trim().equals("Тлумач") ||
city.getText().toString().trim().equals("Яремче")) {
check_region = "ok";
my_oblast = "Вся Ивано-Франковская область";
}
Это для примера. Но теперь мне нужно как то получить координаты, или так я ничего не смогу получить
Ответы (2 шт):
Используйте какое-то апи. Например я работал с этим https://developer.accuweather.com/ там есть возможность получить все города, а так же их координаты. Расчет расcтояния между двумя точками на сферическом теле, сложная геодезическая задача, которую можно упростить несколькими формулами. В студенческие годы я делал несколько проектов осуществляющих это. Например можете посмотреть этот https://github.com/Orlinskas/Weather_Widget
Вот функция которая находила дистанцию от локации до города, можете изменить её под свои нужды.
private double calculate(Location location, City city) {
double PK = (180/Math.PI);
double a1 = location.getLatitude() / PK;
double a2 = location.getLongitude() / PK;
double b1 = city.getCoordLat() / PK;
double b2 = city.getCoordLon() / PK;
double t1 = Math.cos(a1)*Math.cos(a2)*Math.cos(b1)*Math.cos(b2);
double t2 = Math.cos(a1)*Math.sin(a2)*Math.cos(b1)*Math.sin(b2);
double t3 = Math.sin(a1)*Math.sin(b1);
double tt = Math.acos(t1 + t2 + t3);
return 6366000*tt;
}
Рекомендую воспользоваться гугловским Geocoder.
Пример того, как это можно сделать:
fun getDistanceBetweenCitiesInMeters(
context: Context, // Если код в активности / фрагменте, то можно убрать этот параметр и просто использовать контекст
firstCityName: String,
secondCityName: String
): Int? {
val firstLocation = getCoordinatesOfCityByName(context, firstCityName) ?: return null
val secondLocation = getCoordinatesOfCityByName(context, secondCityName) ?: return null
return firstLocation.distanceTo(secondLocation).toInt()
}
private fun getCoordinatesOfCityByName(context: Context, cityName: String): Location? {
if (!Geocoder.isPresent()) return null
val geocoder = Geocoder(context, Locale.getDefault()) // Имеет смысл вынести в поле класса
val address = geocoder.getFromLocationName(cityName, 1)
.firstOrNull() ?: return null
return Location("").apply {
latitude = address.latitude
longitude = address.longitude
}
}
Пример вызова из Activity:
getDistanceBetweenCitiesInMeters(this, "Москва", "Владивосток")