Расчет расстояния между двумя географическими точками

пожалуйста, пролей свет на эту ситуацию

Прямо сейчас у меня есть два массива, имеющих широту и долготу близлежащих мест, а также широту и долготу местоположения пользователя. Теперь я хочу рассчитать расстояние между местоположением пользователя и близлежащими местами и показать их в виде списка.

Я знаю, что существует метод расчета расстояния как

public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results);

Теперь в чем проблема, как передать в этот метод эти два массива, имеющих близкие широту и долготу, и получить массив расстояний.


person Sunny    schedule 08.11.2011    source источник
comment
проверьте эту ссылку: stackoverflow.com/questions/5739734/ Надеюсь, это поможет вам.   -  person Dinesh Sharma    schedule 08.11.2011
comment
спасибо за ответ, но я хочу рассчитать расстояние, используя вышеуказанный метод.   -  person Sunny    schedule 08.11.2011
comment
пожалуйста, поясните, технически вы предоставили нам только подпись метода, которой недостаточно, чтобы знать, где можно найти документацию по методу. Попробуйте добавить информацию о содержащем классе   -  person Marmoy    schedule 08.11.2011
comment
Прекратите использовать distanceTo, потому что он возвращает неправильные значения: stackoverflow.com/questions/30664031/   -  person Karamsa    schedule 05.06.2015
comment
@Karamsa, но в вашей ссылке описано, что работает правильно.   -  person CoolMind    schedule 05.06.2019
comment
Является ли Google Distance Matrix API правильным выбором для расчета расстояния между двумя географическими точками ??   -  person K Pradeep Kumar Reddy    schedule 03.09.2019


Ответы (5)


http://developer.android.com/reference/android/location/Location.html

Смотреть вдаль

Возвращает приблизительное расстояние в метрах между этим местоположением и заданным местоположением. Расстояние определяется с помощью эллипсоида WGS84.

или расстояние между

Вычисляет приблизительное расстояние в метрах между двумя точками и, при необходимости, начальный и конечный пеленги кратчайшего пути между ними. Расстояние и азимут определяются с помощью эллипсоида WGS84.

Вы можете создать объект Location по широте и долготе:

Location locationA = new Location("point A");

locationA.setLatitude(latA);
locationA.setLongitude(lngA);

Location locationB = new Location("point B");

locationB.setLatitude(latB);
locationB.setLongitude(lngB);

float distance = locationA.distanceTo(locationB);

or

private double meterDistanceBetweenPoints(float lat_a, float lng_a, float lat_b, float lng_b) {
    float pk = (float) (180.f/Math.PI);

    float a1 = lat_a / pk;
    float a2 = lng_a / pk;
    float b1 = lat_b / pk;
    float b2 = lng_b / 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;
}
person Karthi    schedule 08.11.2011
comment
Дает ли это расстояние между двумя местами по дороге? - person Harsha M V; 29.01.2013
comment
нет, он возвращает смещение (кратчайшее расстояние между двумя точками) - person Zeeshan Chaudhry; 20.02.2013
comment
float pk = (float) (180/3.14169); - небольшая орфографическая ошибка, это не число Пи ... должно быть использовано значение 3.141 5 9 или Math.PI (также класс Math вместо устаревшего FloatMath). 57 голосов, и никто не заметил? : D - person snachmsm; 18.09.2015
comment
Кто-нибудь подтвердит, принимает ли locationA.distanceTo(locationB) во внимание высоту? - person Secret Squirrel; 23.02.2016
comment
Для чего нужен второй блок кода? Почему бы вам просто не использовать Location. distanceBetween()? - person spaaarky21; 04.05.2016
comment
Секретная белка: locationA.distanceTo (locationB) будет игнорировать высоту, даже если установлена ​​с помощью setAltitude (‹meters›). См. stackoverflow.com/questions/38149168/ - person Mike H; 19.03.2017
comment
@Karthi - это первый блок, возвращающий расстояние в метрах? - person Arnold Brown; 11.07.2019
comment
В чем разница между вычислением расстояния с использованием API матрицы расстояний Google и вычислением с использованием приведенного выше кода? - person K Pradeep Kumar Reddy; 03.09.2019
comment
Это возвращается через км или мили? - person luke cross; 20.06.2020

Попробуйте этот код. здесь у нас есть два значения долготы и широты, а функция selected_location.distanceTo (near_locations) возвращает расстояние между этими местами в метрах.

Location selected_location = new Location("locationA");
            selected_location.setLatitude(17.372102);
            selected_location.setLongitude(78.484196);
Location near_locations = new Location("locationB");
            near_locations.setLatitude(17.375775);
            near_locations.setLongitude(78.469218);
double distance = selected_location.distanceTo(near_locations);

здесь расстояние - это расстояние между местоположением A и местоположением B (в Meters)

person sandeepmaaram    schedule 10.10.2013

Существует только одно местоположение пользователя, поэтому вы можете выполнять итерацию. Список ближайших мест может вызвать функцию distanceTo(), чтобы получить расстояние, вы можете сохранить в массиве, если хотите.

Насколько я понимаю, distanceBetween() предназначен для далеких мест, на выходе получается эллипсоид WGS84.

person Reno    schedule 08.11.2011
comment
не могли бы вы подсказать, какой из них обеспечивает точное расстояние? - person Paresh Mayani; 18.07.2012

distanceTo даст вам расстояние в метрах между двумя заданными местоположениями ej target.distanceTo (destination).

DistanceBetween также даст вам расстояние, но оно сохранит расстояние в массиве с плавающей запятой (results [0]). в документе говорится, что если длина результатов равна 2 или больше, первоначальный азимут сохраняется в результатах [1]. Если длина результатов 3 или больше, окончательный подшипник сохраняется в результатах [2].

надеюсь, что это поможет

Я использовал distanceTo, чтобы получить расстояние от точки A до B, я думаю, что это правильный путь.

person eOnOe    schedule 05.09.2013

Я хотел реализовать это сам, в итоге я прочитал страницу в Википедии на Формула расстояния большого круга, потому что никакой код не был достаточно читабельным, чтобы я мог использовать его в качестве основы.

Пример C #

    /// <summary>
    /// Calculates the distance between two locations using the Great Circle Distance algorithm
    /// <see cref="https://en.wikipedia.org/wiki/Great-circle_distance"/>
    /// </summary>
    /// <param name="first"></param>
    /// <param name="second"></param>
    /// <returns></returns>
    private static double DistanceBetween(GeoLocation first, GeoLocation second)
    {
        double longitudeDifferenceInRadians = Math.Abs(ToRadians(first.Longitude) - ToRadians(second.Longitude));

        double centralAngleBetweenLocationsInRadians = Math.Acos(
            Math.Sin(ToRadians(first.Latitude)) * Math.Sin(ToRadians(second.Latitude)) +
            Math.Cos(ToRadians(first.Latitude)) * Math.Cos(ToRadians(second.Latitude)) *
            Math.Cos(longitudeDifferenceInRadians));

        const double earthRadiusInMeters = 6357 * 1000;

        return earthRadiusInMeters * centralAngleBetweenLocationsInRadians;
    }

    private static double ToRadians(double degrees)
    {
        return degrees * Math.PI / 180;
    }
person Henrick Kakutalua    schedule 04.03.2020