Duplicate possible:
Travailler avec les valeurs de latitude/longitude en Java
Je dois calculer la distance entre deux points donnée par deux coordonnées. Le projet sur lequel je travaille est un projet Java. Le code Java sera donc génial, mais un pseudo-code peut également être donné, puis je peux le mettre en œuvre moi-même :)
Comme vous le savez probablement, il existe trois manières de représenter des coordonnées:
C'est la troisième façon dont mes coordonnées sont données, donc le code pour ces valeurs sera préféré :)
Basé sur ne autre question sur stackoverflow , j'ai ce code .. Cela calcule le résultat en mètres, pas en miles :)
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;
}
Vous pouvez utiliser le bibliothèque de géodésie de Java pour GPS , il utilise le formules de Vincenty qui prend en compte la courbure de la surface de la terre.
La mise en œuvre se déroule comme ceci:
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 distance résultante est en mètres.
En C++, cela se fait comme ceci:
#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;
}