2012-07-02 14 views
5

Potrzebuję opracować aplikację, w której użytkownik musi zlokalizować swój samochód, który zaparkował i pokazać odległość między nim a zaparkowanym samochodem. Korzystałem z usług GPS i lokalizacji.jak znaleźć prawidłową odległość między dwoma punktami geograficznymi na mapie?

Dla odległości użyłem haversine wzór, ale odległość zawsze pokazuje 0 metrów.

Próbowałem dużo szukać rozwiązania w google, ale dint uzyskać prawidłowe rozwiązanie.

Czy ktoś może podać swoje sugestie?

+0

duplikat http://stackoverflow.com/questions/2741403/get-the-distance-between-two-geo- punkty – logcat

+0

Przeczytaj wszystkie odpowiedzi na to pytanie http://stackoverflow.com/questions/7696112/gettting-different-distance-when-using-the-google-map-and-user-defined-function/7752341#7752341 – MKJParekh

+0

spójrz na pytanie [tutaj] (http://stackoverflow.com/questions/19218081/how-to-calculate-distance-from-different-markers-in-a-map-and-then-pick-up-the-l) . Ta ma podobną odpowiedź z wieloma obliczeniami odległości. Zobacz zaakceptowaną odpowiedź. – Akshat

Odpowiedz

1

android.location.Location.distanceBetween (podwójne startLatitude dwukrotnie startLongitude dwukrotnie endLatitude dwukrotnie endLongitude pływakowe [] Wyniki)

Geopoints mają getLongitudeE6() i getLatitudeE6(), aby pomóc. Pamiętaj, że są to E6, więc musisz podzielić przez 1E6.

12

Dokumenty Google mają dwie metody

enter image description here

Jeśli otrzymujesz lat/lon z GeoPoint następnie są one w microdegrees. Musisz pomnożyć przez 1e6.

Ale wolałem użyć poniższej metody. (Jego podstawie Haversine Formuły)

http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe

double dist = GeoUtils.distanceKm(mylat, mylon, lat, lon); 

/** 
* Computes the distance in kilometers between two points on Earth. 
* 
* @param lat1 Latitude of the first point 
* @param lon1 Longitude of the first point 
* @param lat2 Latitude of the second point 
* @param lon2 Longitude of the second point 
* @return Distance between the two points in kilometers. 
*/ 

public static double distanceKm(double lat1, double lon1, double lat2, double lon2) { 
    int EARTH_RADIUS_KM = 6371; 
    double lat1Rad = Math.toRadians(lat1); 
    double lat2Rad = Math.toRadians(lat2); 
    double deltaLonRad = Math.toRadians(lon2 - lon1); 

    return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad)) * EARTH_RADIUS_KM; 
} 

Na koniec chciałbym podzielić się informacjami bonusowy.

Jeśli szukasz dojechać i trasa między dwoma lokalizacjami następnie udać się do

http://code.google.com/p/j2memaprouteprovider/

+1

Hej ... czy możesz wyjaśnić, jak to działa? –

+0

@ Archie.bpgc Zobacz moją zaktualizowaną odpowiedź. –

+0

@VipulShah - Myślę, że daje to bezpośrednią odległość między dwoma GeoPoints, a nie w kierunku lub odległości do jazdy, prawda? – user370305

3

Spróbuj użyć metody to w android.location API

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

Ta metoda oblicza przybliżoną odległość w metrach między dwoma lokalizacjami, oraz opcjonalnie początkowe i końcowe łożyska najkrótszej ścieżki między nimi:

NB: Jeśli otrzymujesz od GeoPoint lat/lon, to są one w mikrodegrees. należy pomnożyć przez 1E6

jeśli chcesz obliczyć distace między 2 Geopoint przez Haversine wzoru

public class DistanceCalculator { 
    // earth’s radius = 6,371km 
    private static final double EARTH_RADIUS = 6371 ; 
    public static double distanceCalcByHaversine(GeoPoint startP, GeoPoint endP) { 
     double lat1 = startP.getLatitudeE6()/1E6; 
     double lat2 = endP.getLatitudeE6()/1E6; 
     double lon1 = startP.getLongitudeE6()/1E6; 
     double lon2 = endP.getLongitudeE6()/1E6; 
     double dLat = Math.toRadians(lat2-lat1); 
     double dLon = Math.toRadians(lon2-lon1); 
     double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
     Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
     Math.sin(dLon/2) * Math.sin(dLon/2); 
     double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
     return EARTH_RADIUS * c; 
    } 
} 
1

Problem z formułą harvesine jest to, że nie obliczyć rzeczywistą odległość. Jest to odległość od 2 punktów na kuli. Rzeczywista odległość zależy od ulic lub dróg wodnych. Formuła harvesine jest również nieco skomplikowana, dlatego łatwiej jest poprosić Google-Api o podanie rzeczywistej odległości. Z Googlemaps Api musisz nauczyć się api kierunków.

3

distanceBetween() Metoda daje Ci odległość między dwoma punktami. Dostał się dystans trasy między dwoma punktami zobaczyć moje ansewer Here

0

distanceBetween nie reffer do rzeczywistej odległości (odległość drogowa) więc proponuję wam odwiedzić ten kod źródłowy google i będzie dispaly Ci dystans prawdziwa droga między 2 punkty geograficzne. Link ma 2 wersje jedna dla Android i jeden dla jeżyna to sprawdzić

Powiązane problemy