2011-11-08 26 views
49

si prega di far luce su questa situazioneCalcolo distanza tra due località geografiche

In questo momento ho due serie avendo latitudine e longitudine dei luoghi vicini e hanno anche la posizione dell'utente latiude e longiude ora voglio calcolare la distanza tra posizione dell'utente e luoghi vicini e vogliono mostrarli in listview.

So che c'è un metodo per calcolare la distanza da

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

Ora, qual è il problema è come passare questi due array di avere vicino la latitudine e la longitue in questo metodo e ottenere la matrice delle distanze.

+0

controlla questo link: http://stackoverflow.com/questions/5739734/how-to-calcolare-the-distance-between-two-points-in-android-app/5739789 # 5739789 Ho pe questo ti aiuterà. –

+0

grazie per la tua risposta ma voglio calcolare la distanza usando il metodo sopra. –

+0

chiarisci, tecnicamente ci hai fornito solo una firma del metodo, che non è abbastanza informazioni per sapere dove trovare la documentazione del metodo.Prova ad aggiungere informazioni sulla classe contenente – Marmoy

risposta

140

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

Guardare in distanceTo o distanceBetween. È possibile creare un oggetto Location da una latitudine e longitudine:

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

o

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

Questo dà la distanza tra due posti su strada? –

+1

no restituisce Spostamento (La minima distanza tra due punti) –

+1

'float pk = (float) (180/3.14169);' - piccolo errore ortografico, questo non è Pi ... dovrebbe essere 3.141 ** 5 ** 9 o 'Math.PI' usato (anche la classe' Math' invece '' FloatMath'). 57 upvotes e nessuno notato? : D – snachmsm

3

C'è solo una posizione utente, quindi è possibile iterare L'elenco dei luoghi nelle vicinanze può chiamare la funzione distanceTo() per ottenere la distanza, è possibile memorizzare in un array se lo si desidera.

Da quello che ho capito, distanceBetween() è per luoghi lontani, l'uscita è un ellissoide WGS84.

+0

puoi suggerire quale di questi fornisce la distanza esatta ? –

0

distanceTo vi darà la distanza in metri tra i due data posizione ej target.distanceTo (destinazione).

distanza Tra ti fornisce la distanza ma memorizza la distanza in una matrice di float (risultati [0]). il documento dice che se i risultati hanno lunghezza 2 o maggiore, il rilevamento iniziale viene memorizzato nei risultati [1]. Se i risultati ha lunghezza 3 o superiore, il cuscinetto finale viene immagazzinata nei risultati [2]

speranza che questo aiuti

ho usato distanceTo per ottenere la distanza dal punto A al punto B penso che è il modo andare.

10

Prova questo codice. qui abbiamo due valori di longitudine e latitudine e la funzione selected_location.distanceTo (near_locations) restituisce la distanza tra quei luoghi in metri.

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

qui "distanza" è la distanza tra locationA & locationB (in metri)

+4

ottimo per menzionare la metrica .. !!! –

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; 

    } 
Problemi correlati