2011-11-08 15 views
49

proszę rzucić nieco światła na tę sytuacjęObliczanie odległości między dwoma lokalizacjami geograficznymi

Teraz mam dwa tablicę mającą szerokość i długość geograficzną okolicznych miejscowości, a także mieć lokalizację użytkownika latiude i longiude teraz chcę, aby obliczyć odległość między lokalizacja użytkownika i miejsca w pobliżu i chcesz pokazać je w widoku listy.

wiem, że nie jest to metoda do obliczania odległości jak

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

Teraz, co jest problemem to, jak przekazać te dwa tablica posiadające pobliżu szerokości i longitue w tej metodzie i uzyskać tablicę odległości.

+0

Sprawdź ten link: http://stackoverflow.com/questions/5739734/Jak obliczyć-odległość-między-dwa-punkty-w-android-app/5739789 # 5739789 Ho pe to ci pomoże. –

+0

dzięki za odpowiedź, ale chcę obliczyć odległość za pomocą powyższej metody. –

+0

proszę wyjaśnić, technicznie dałeś nam tylko podpis metody, który nie jest wystarczającą informacją, aby wiedzieć, gdzie można znaleźć dokumentację metody.Spróbuj dodać informacje o klasie zawierającej – Marmoy

Odpowiedz

140

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

Look w distanceTo lub distanceBetween. Można utworzyć lokalizacja obiektu od szerokości i długości geograficznej:

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); 

lub

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; 
} 
+0

Czy daje to odległość między dwoma miejscami na drodze? –

+1

nie zwraca Przesunięcie (Najkrótsza odległość między dwoma punktami) –

+1

'float pk = (float) (180/3.14169);' - małe błędne pisanie, to nie jest Pi ... powinno być 3.141 ** 5 ** 9 lub Użyto 'Math.PI' (także klasa' Math' zamiast przestarzałego 'FloatMath'). 57 przegranych i nikt nie zauważył? : D – snachmsm

3

Istnieje tylko jedna lokalizacja użytkownika, dzięki czemu można iterować Lista pobliskich miejsc może wywoływać funkcję distanceTo(), aby uzyskać odległość, można przechowywać w tablicy, jeśli chcesz.

Z tego co rozumiem, distanceBetween() jest dla odległych miejsc, jego wyjściem jest elipsoida WGS84.

+0

czy możesz zaproponować, który z nich podaje dokładną odległość ? –

0

distanceTo daje odległość w metrach pomiędzy dwoma dana lokalizacja EJ target.distanceTo (docelowego).

distanceBetween daje również odległość, ale zapisze odległość w tablicy float (wyniki [0]). Doktor mówi, że jeśli wyniki mają długość 2 lub większą, początkowe łożysko jest przechowywane w wynikach [1]. Jeśli wyniki ma długość 3 lub większej, ostateczna łożysko jest przechowywana w wynikach [2]

nadziei, że to pomoże

Użyłem distanceTo uzyskać odległość od punktu A do punktu B myślę, że jest to sposób iść.

10

Wypróbuj ten kod. tutaj mamy dwie wartości długości i szerokości geograficznej oraz selected_location.distanceTo (near_locations) funkcja zwraca odległość między tymi miejscami w metrach.

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); 

tu "odległość" jest odległość między locationA & locationB (w metrach)

+4

świetnie nadaje się do wymieniania metryki .. !!! –

3
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); 

    } 
0
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; 

    } 
Powiązane problemy