Pregunta

  

Posible duplicado:
   Trabajando con valores de latitud / longitud en Java

Duplicar:

Necesito calcular la distancia entre dos puntos dados por dos coordenadas. El proyecto en el que estoy trabajando es un proyecto Java, por lo que el código Java será excelente, pero también se puede dar un pseudocódigo, luego puedo implementarlo yo mismo :)

Como probablemente sepa, hay tres formas de representar coordenadas:

  • Grados: Minutos: Segundos (49 ° 30'00 '' N, 123 ° 30'00 '' W)
  • Grados: Minutos decimales (49 ° 30.0 ', -123 ° 30.0'), (49d30.0m, -123d30.0 ')
  • Grados decimales (49.5000 °, -123.5000 °), generalmente con 4-6 números decimales.

Es la tercera forma en que se dan mis coordenadas, por lo que se preferirá el código para estos valores :)

¿Fue útil?

Solución

Basado en otra pregunta sobre stackoverflow , obtuve este código. Esto calcula el resultado en metros, no en millas: )

 public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
    double earthRadius = 6371000; //meters
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
               Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
               Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    float dist = (float) (earthRadius * c);

    return dist;
    }

Otros consejos

Puede usar la Biblioteca de Geodesia de Java para GPS , utiliza las fórmulas de Vincenty que tienen en cuenta la curvatura de la superficie terrestre.

La implementación es así:

import org.gavaghan.geodesy.*;

...

GeodeticCalculator geoCalc = new GeodeticCalculator();

Ellipsoid reference = Ellipsoid.WGS84;  

GlobalPosition pointA = new GlobalPosition(latitude, longitude, 0.0); // Point A

GlobalPosition userPos = new GlobalPosition(userLat, userLon, 0.0); // Point B

double distance = geoCalc.calculateGeodeticCurve(reference, userPos, pointA).getEllipsoidalDistance(); // Distance between Point A and Point B

La distancia resultante es en metros.

En C ++ se hace así:

#define LOCAL_PI 3.1415926535897932385 

double ToRadians(double degrees) 
{
  double radians = degrees * LOCAL_PI / 180;
  return radians;
}

double DirectDistance(double lat1, double lng1, double lat2, double lng2) 
{
  double earthRadius = 3958.75;
  double dLat = ToRadians(lat2-lat1);
  double dLng = ToRadians(lng2-lng1);
  double a = sin(dLat/2) * sin(dLat/2) + 
             cos(ToRadians(lat1)) * cos(ToRadians(lat2)) * 
             sin(dLng/2) * sin(dLng/2);
  double c = 2 * atan2(sqrt(a), sqrt(1-a));
  double dist = earthRadius * c;
  double meterConversion = 1609.00;
  return dist * meterConversion;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top