Calculez la distance en mètres lorsque vous connaissez la longitude et la latitude en java [dupliquer]
-
10-07-2019 - |
Question
Double possible:
Utilisation des valeurs de latitude / longitude en Java
Dupliquer:
- Utilisation des valeurs de latitude / longitude en Java
- Comment calculer la distance entre deux points de longitude et de latitude?
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 formidable, 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 les coordonnées:
- Degrés: Minutes: Secondes (49 ° 30'00 "N, 123 ° 30'00" W)
- Degrés: minutes décimales (49 ° 30,0 ', -123 ° 30,0'), (49d30.0m, -123d30.0 ')
- Degrés décimaux (49,5000 °, -123,5000 °), généralement avec 4 à 6 nombres décimaux.
C’est la troisième façon dont mes coordonnées sont données, le code pour ces valeurs sera préféré:)
La solution
Sur la base de autre question sur stackoverflow , j'ai obtenu ce code .. Le résultat est calculé en mètres, et non 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;
}
Autres conseils
Vous pouvez utiliser la bibliothèque de géodésie Java pour GPS , il utilise la la formule de Vincenty qui prend en compte la courbure de la surface de la terre.
L'implémentation est la suivante:
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 suit:
#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;
}