Uzyskaj odległość między dwoma punktami geograficznymi

Chcę zrobić aplikację, która sprawdzi najbliższe miejsce, z którego znajduje się użytkownik. Mogę łatwo uzyskać lokalizację użytkownika i mam listę miejsc z szerokością i długością geograficzną.

Jaki byłby najlepszy sposób na poznanie najbliższego miejsca listy względem aktualnej pozycji.

Nie mogłem znaleźć nic w API google.

Obawiam się, że muszę uciekać się do moich obliczeń i muszę zrobić matematykę, aby je obliczyć.

Co myślicie ?

Pozdrawiam i dziękuję za przeczytanie lub odpowiedź.

Author: Chmouel Boudjnah, 2010-04-30

8 answers

Location loc1 = new Location("");
loc1.setLatitude(lat1);
loc1.setLongitude(lon1);

Location loc2 = new Location("");
loc2.setLatitude(lat2);
loc2.setLongitude(lon2);

float distanceInMeters = loc1.distanceTo(loc2);

Odniesienie: http://developer.android.com/reference/android/location/Location.html#distanceTo(android.location.Location)

 123
Author: praveen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-15 22:12:33

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

Spójrz na odległość lub odległość między nimi. Możesz utworzyć obiekt lokalizacji z szerokości i długości geograficznej:

Location location = new Location("");
location.setLatitude(lat);
location.setLongitude(lon);
 121
Author: haseman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 23:34:52

Rozwiązanie przybliżone (oparte na projekcji równobocznej), znacznie szybciej (wymaga tylko 1 Tryg i 1 pierwiastek kwadratowy).

To przybliżenie ma znaczenie, jeśli twoje punkty nie są zbyt odległe. Będzie to zawsze przeceniane w porównaniu z rzeczywistą odległością haversine. Na przykład doda nie więcej niż 0,05382 % do rzeczywistej odległości, jeśli szerokość lub długość delta między dwoma punktami nie przekracza 4 stopni dziesiętnych .

The standardowy wzór (Haversine) to dokładny jeden (to znaczy, że działa dla dowolnej pary długości/szerokości geograficznej na ziemi), ale jest znacznie wolniejszy , ponieważ potrzebuje 7 trygonometrycznych i 2 pierwiastków kwadratowych. Jeśli kilka punktów nie jest zbyt daleko od siebie, a absolutna precyzja nie jest najważniejsza, możesz użyć tej przybliżonej wersji (Equirectangular), która jest znacznie szybsza, ponieważ używa tylko jednego trygonometrycznego i jednego pierwiastka kwadratowego.

// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
int R = 6371; // km
double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
double y = (lat2 - lat1);
double distance = Math.sqrt(x * x + y * y) * R;

Możesz zoptymalizować to dalej przez albo:

  1. Usunięcie pierwiastka kwadratowego Jeśli po prostu porównasz odległość do innej (w tym przypadku porównaj obie odległości do kwadratu);
  2. Factoring-out cosinus jeśli obliczysz odległość od jednego punktu głównego do wielu innych (w tym przypadku wykonasz rzut równoboczny skoncentrowany na punkcie głównym, więc możesz obliczyć cosinus raz dla wszystkich porównań).

Po Więcej informacji zobacz: http://www.movable-type.co.uk/scripts/latlong.html

Istnieje Ładna implementacja referencyjna Formuły Haversine w kilku językach pod adresem: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe

 29
Author: Laurent Grégoire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-29 10:39:10

Istnieje kilka metod, których możesz użyć, ale aby określić, która z nich jest najlepsza, musimy najpierw wiedzieć, czy jesteś świadomy wysokości użytkownika, a także wysokości innych punktów?

W zależności od poziomu dokładności, której szukasz, możesz przyjrzeć się formułom Haversine 'a lub Vincenty' ego...

Te strony szczegółowo wzory, a dla mniej matematycznie pochylonych również dostarczyć wyjaśnienie, jak je wdrożyć w skrypcie!

Haversine Wzór: http://www.movable-type.co.uk/scripts/latlong.html

Wzór Wincentego: http://www.movable-type.co.uk/scripts/latlong-vincenty.html

Jeśli masz jakieś problemy z którymś ze znaczeń w formułach, po prostu skomentuj, a ja postaram się na nie odpowiedzieć:)

 10
Author: Dwaine Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-30 00:41:02

Istnieją dwa sposoby na uzyskanie dystansu między LatLng.

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

Zobacz to

I drugi

public float distanceTo (Location dest) Jak odpowiedział praveen.

 3
Author: Xar E Ahmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-01 17:27:14

Wystarczy użyć poniższej metody, przekazać ją lat i long i uzyskać odległość w metrze:

private static double distance_in_meter(final double lat1, final double lon1, final double lat2, final double lon2) {
    double R = 6371000f; // Radius of the earth in m
    double dLat = (lat1 - lat2) * Math.PI / 180f;
    double dLon = (lon1 - lon2) * Math.PI / 180f;
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(latlong1.latitude * Math.PI / 180f) * Math.cos(latlong2.latitude * Math.PI / 180f) *
                    Math.sin(dLon/2) * Math.sin(dLon/2);
    double c = 2f * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double d = R * c;
    return d;
}
 0
Author: farhad.kargaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 18:27:16
private float getDistance(double lat1, double lon1, double lat2, double lon2) {
        float[] distance = new float[2];
        Location.distanceBetween(lat1, lon1, lat2, lon2, distance);
        return distance[0];
    }
 0
Author: Levon Petrosyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-25 19:30:06

Możesz uzyskać odległość i czas za pomocą google Map API Google Map API

Wystarczy przekazać pobrany JSON do tej metody, otrzymasz odległość w czasie rzeczywistym i czas między dwoma latlongami

void parseJSONForDurationAndKMS(String json) throws JSONException {

    Log.d(TAG, "called parseJSONForDurationAndKMS");
    JSONObject jsonObject = new JSONObject(json);
    String distance;
    String duration;
    distance = jsonObject.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text");
    duration = jsonObject.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text");

    Log.d(TAG, "distance : " + distance);
    Log.d(TAG, "duration : " + duration);

    distanceBWLats.setText("Distance : " + distance + "\n" + "Duration : " + duration);


}
 0
Author: saigopi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 12:05:28