Как получить координаты городов, указанных пользователем?

Как вычислить расстояние между городами! Есть массивы из городов. Пользователь указывает пункт А и пункт Б. На пример Киев - Москва. Как узнать расстояние. Я понимаю, что нужно брать координаты. Но как взять координаты. Не вручную же прописывать координаты. Города у меня прописаны вручную. Для примера вот что мне нужно было:

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 шт):

Автор решения: Vlad Orlinskas

Используйте какое-то апи. Например я работал с этим 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;
    }
→ Ссылка
Автор решения: Alex_Skvortsov

Рекомендую воспользоваться гугловским 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, "Москва", "Владивосток")

→ Ссылка