Comment calculer la distance entre deux coordonnées GPS (en utilisant la latitude et la longitude) ?
[Calculer la distance entre deux coordonnées par latitude et longitude][1], incluant une implémentation Javascript.
Les lieux Ouest et Sud sont négatifs. Rappelez-vous que les minutes et les secondes sont en dehors de 60, donc S31 30' ; est -31,50 degrés.
N'oubliez pas de convertir les degrés en radians. De nombreux langages disposent de cette fonction. Ou bien un simple calcul : radians = degrés * PI / 180
.
function degreesToRadians(degrees) {
return degrees * Math.PI / 180;
}
function distanceInKmBetweenEarthCoordinates(lat1, lon1, lat2, lon2) {
var earthRadiusKm = 6371;
var dLat = degreesToRadians(lat2-lat1);
var dLon = degreesToRadians(lon2-lon1);
lat1 = degreesToRadians(lat1);
lat2 = degreesToRadians(lat2);
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return earthRadiusKm * c;
}
Voici quelques exemples d'utilisation :
distanceInKmBetweenCoordinates(0,0,0,0,0) // La distance entre les mêmes points doit être de 0 0 distanceInKmBetweenCoordinates(51.5, 0, 38.8, -77.1) // De Londres à Arlington 5918.185064088764
Ce code Lua est adapté de ce que l'on trouve sur Wikipedia et dans l'outil de Robert Lipe GPSbabel :
local EARTH_RAD = 6378137.0
-- earth's radius in meters (official geoid datum, not 20,000km / pi)
local radmiles = EARTH_RAD*100.0/2.54/12.0/5280.0;
-- earth's radius in miles
local multipliers = {
radians = 1, miles = radmiles, mi = radmiles, feet = radmiles * 5280,
meters = EARTH_RAD, m = EARTH_RAD, km = EARTH_RAD / 1000,
degrees = 360 / (2 * math.pi), min = 60 * 360 / (2 * math.pi)
}
function gcdist(pt1, pt2, units) -- return distance in radians or given units
--- this formula works best for points close together or antipodal
--- rounding error strikes when distance is one-quarter Earth's circumference
--- (ref: wikipedia Great-circle distance)
if not pt1.radians then pt1 = rad(pt1) end
if not pt2.radians then pt2 = rad(pt2) end
local sdlat = sin((pt1.lat - pt2.lat) / 2.0);
local sdlon = sin((pt1.lon - pt2.lon) / 2.0);
local res = sqrt(sdlat * sdlat + cos(pt1.lat) * cos(pt2.lat) * sdlon * sdlon);
res = res > 1 and 1 or res < -1 and -1 or res
res = 2 * asin(res);
if units then return res * assert(multipliers[units])
else return res
end
end
Je suppose que tu veux qu'elle suive la courbure de la terre. Vos deux points et le centre de la terre sont sur un plan. Le centre de la terre est le centre d'un cercle sur ce plan et les deux points sont (approximativement) sur le périmètre de ce cercle. À partir de là, vous pouvez calculer la distance en déterminant l'angle entre un point et l'autre.
Si les points n'ont pas la même hauteur, ou si vous devez tenir compte du fait que la terre n'est pas une sphère parfaite, cela devient un peu plus difficile.