Расчет расстояния между двумя географическими точками - PullRequest
62 голосов
/ 08 ноября 2011

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

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

Я знаю, что есть метод для вычисления расстояния как

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

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

Ответы [ 6 ]

164 голосов
/ 08 ноября 2011

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

Просмотр расстояния до или расстояния между.Вы можете создать объект 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);

или

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;
}
14 голосов
/ 10 октября 2013

Попробуйте этот код.здесь у нас есть два значения долготы и широты, а функция 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 (в метрах)

3 голосов
/ 11 октября 2013
    private static Double _MilesToKilometers = 1.609344;
    private static Double _MilesToNautical = 0.8684;


    /// <summary>
    /// Calculates the distance between two points of latitude and longitude.
    /// Great Link - http://www.movable-type.co.uk/scripts/latlong.html
    /// </summary>
    /// <param name="coordinate1">First coordinate.</param>
    /// <param name="coordinate2">Second coordinate.</param>
    /// <param name="unitsOfLength">Sets the return value unit of length.</param>
    public static Double Distance(Coordinate coordinate1, Coordinate coordinate2, UnitsOfLength unitsOfLength)
    {

        double theta = coordinate1.getLongitude() - coordinate2.getLongitude();
        double distance = Math.sin(ToRadian(coordinate1.getLatitude())) * Math.sin(ToRadian(coordinate2.getLatitude())) +
                       Math.cos(ToRadian(coordinate1.getLatitude())) * Math.cos(ToRadian(coordinate2.getLatitude())) *
                       Math.cos(ToRadian(theta));

        distance = Math.acos(distance);
        distance = ToDegree(distance);
        distance = distance * 60 * 1.1515;

        if (unitsOfLength == UnitsOfLength.Kilometer)
            distance = distance * _MilesToKilometers;
        else if (unitsOfLength == UnitsOfLength.NauticalMiles)
            distance = distance * _MilesToNautical;

        return (distance);

    }
3 голосов
/ 08 ноября 2011

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

Из того, что я понимаю, distanceBetween() для отдаленных мест, это вывод эллипсоида WGS84.

1 голос
/ 05 сентября 2013

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

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

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

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

0 голосов
/ 19 апреля 2016
public double distance(Double latitude, Double longitude, double e, double f) {
        double d2r = Math.PI / 180;

        double dlong = (longitude - f) * d2r;
        double dlat = (latitude - e) * d2r;
        double a = Math.pow(Math.sin(dlat / 2.0), 2) + Math.cos(e * d2r)
                * Math.cos(latitude * d2r) * Math.pow(Math.sin(dlong / 2.0), 2)
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double d = 6367 * c;
                return d;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...