2011-05-09 16 views
10
double distance; 

Location locationA = new Location("point A"); 

locationA.setLatitude(latA); 
locationA.setLongitude(lngA); 

Location locationB = new Location("point B"); 

locationB.setLatitude(latB); 
LocationB.setLongitude(lngB); 

distance = locationA.distanceTo(locationB); 

el código anterior no funciona y estoy obteniendo 0.0 Km como distancia? También en el constructor de la clase de ubicación, ¿qué significa el proveedor de cadenas? En el código anterior, estoy usando PointA y PointB como proveedores.cómo encontrar la distancia entre dos geopoints?

¿por qué el código anterior no funciona?

gracias de antemano.

Logcat 05-09 17: 48: 56.144: INFO/loc actual (1573): Lat 0,0 lng 0,0 05-09 17: loc INFO/checklocation (1573):: 48: 56.155 lat 54.4288665 lng 10.169366

+1

¿Estás seguro de que tus valores de latA/latB y lngA/lngB son diferentes y están en el rango correcto? ¿Puedes dar ejemplos de los valores que estás usando? Además, tenga en cuenta que el resultado de 'distanceTo' está en metros, no en kilómetros. – Dave

+0

sí. Me estoy convirtiendo a metros. He puesto el resultado logcat. los valores que estoy obteniendo son diferentes para las diferentes ubicaciones ... – user590849

+0

No necesita convertir a metros, el resultado ya está en metros. Publique una muestra de código completo, ya que creo que el problema aquí no está en el código que ha publicado. – Dave

Respuesta

14

Trate Location.distanceBetween(..)

Actualización:

Si se van a latitud/longitud de GeoPoint entonces están en microgrados. Debes multiplicar por 1e6.

+0

Para la misma entrada, esto dará el mismo resultado. Creo que hay un problema en la entrada que se utiliza, desde el código que no se muestra en la pregunta original. – Dave

+0

@ user590849 - ¿Estás recibiendo lon/lat de GeoPoint? Esos están en microdegrees: debes multiplicar por 1e6. –

1

Una forma alternativa de lograr lo anterior,

public class Distance { 

    public static double distance(double lat1, double lon1, double lat2, double lon2) { 

     double theta = lon1 - lon2; 

     double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) 
       + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) 
       * Math.cos(deg2rad(theta)); 
     dist = Math.acos(dist); 
     dist = rad2deg(dist); 
     dist = dist * 60 * 1.1515; 
     //if (unit == "K") { 
     // dist = dist * 1.609344; 
     // else if (unit == "N") { 
     //dist = dist * 0.8684; 
     //} 
     return (dist); 
    } 


    public static final double PI = 3.14159265; 
    public static final double deg2radians = PI/180.0; 


    public static double getDistance(double latitude1, double longitude1, double latitude2,double longitude2) { 

     double lat1 = latitude1 * deg2radians; 
     double lat2 = latitude2 * deg2radians; 
     double lon1 = longitude1 * deg2radians; 
     double lon2 = longitude2 * deg2radians; 
     // Williams gives two formulae; 
     // this is the more accurate for close distances. 
     // In practice, the two differed only in the 8th or 9th place, for 
     // separations as small as 1 degree. 
     double radd = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin((lat1 - lat2)/2), 
       2.0) 
       + Math.cos(lat1) 
       * Math.cos(lat2) 
       * Math.pow(Math.sin((lon1 - lon2)/2), 2.0))); 

     return radd; 
    } 





    /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ 
    /* :: This function converts decimal degrees to radians : */ 
    /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ 
    private static double deg2rad(double deg) { 
     return (deg * Math.PI/180.0); 
    } 

    /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ 
    /* :: This function converts radians to decimal degrees : */ 
    /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ 
    private static double rad2deg(double rad) { 
     return (rad * 180.0/Math.PI); 
    } 

} 
0
double CalculateDistance(double nLat1, double nLon1, double nLat2, double nLon2) 
{ 
    double nRadius = 6371; // Earth's radius in Kilometers 
    // Get the difference between our two points 
    // then convert the difference into radians 

    double nDLat = ToRad(nLat2 - nLat1); 
    double nDLon = ToRad(nLon2 - nLon1); 

    // Here is the new line 
    nLat1 = ToRad(nLat1); 
    nLat2 = ToRad(nLat2); 

    double nA = pow (sin(nDLat/2), 2) + cos(nLat1) * cos(nLat2) * pow (sin(nDLon/2), 2); 

    double nC = 2 * atan2(sqrt(nA), sqrt(1 - nA)); 
    double nD = nRadius * nC; 

    return nD; // Return our calculated distance 
} 

http://www.jaimerios.com/?p=39

+0

Publicar fragmentos de código "distanceBetween (a, b)" como este no es una respuesta. La pregunta aquí es por qué 'locationA.distanceTo (locationB)' (supuestamente) da un resultado de 0 metros? – Dave

2

Esto no es una respuesta, pero tenga en cuenta que la firma para el constructor Location es Location(String provider).

es decir, la cadena se pasa al constructor debe ser uno de LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER o LocationManager.PASSIVE_PROVIDER, no "point A" y "point B".

16

sólo un fragmento rápida ya que no veo una solución completa y sencilla con geopuntos anteriores:

public float getDistanceInMiles(GeoPoint p1, GeoPoint p2) { 
    double lat1 = ((double)p1.getLatitudeE6())/1e6; 
    double lng1 = ((double)p1.getLongitudeE6())/1e6; 
    double lat2 = ((double)p2.getLatitudeE6())/1e6; 
    double lng2 = ((double)p2.getLongitudeE6())/1e6; 
    float [] dist = new float[1]; 
    Location.distanceBetween(lat1, lng1, lat2, lng2, dist); 
    return dist[0] * 0.000621371192f; 
} 

Si desea metros, vuelve dist [0] directamente.

+0

Funciona perfecto, gracias! – jbc25

9

Como se indicó anteriormente, la clase de ubicación es el camino a seguir. Aquí está el código que he usado:

Location locationA = new Location("point A"); 

locationA.setLatitude(pointA.getLatitudeE6()/1E6); 
locationA.setLongitude(pointA.getLongitudeE6()/1E6); 

Location locationB = new Location("point B"); 

locationB.setLatitude(pointB.getLatitudeE6()/1E6); 
locationB.setLongitude(pointB.getLongitudeE6()/1E6); 

double distance = locationA.distanceTo(locationB); 

En este ejemplo, tanto el punto A como el punto B son instancias de la clase GeoPoint.

Cuestiones relacionadas