Come si calcola la distanza tra due coordinate GPS (usando latitudine e longitudine)?
Calcolare la distanza tra due coordinate per latitudine e longitudine, inclusa un'implementazione Javascript.
Le posizioni Ovest e Sud sono negative. Ricorda che i minuti e i secondi sono su 60 quindi S31 30' è -31.50 gradi.
Non dimenticare di convertire i gradi in radianti. Molte lingue hanno questa funzione. Oppure un semplice calcolo: radianti = gradi * 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;
}
Ecco alcuni esempi di utilizzo:
distanceInKmBetweenCoordinates(0,0,0,0) // La distanza tra gli stessi punti dovrebbe essere 0 0
distanceInKmBetweenCoordinates(51.5, 0, 38.8, -77.1) // Da Londra ad Arlington 5918.185064088764
Questo codice Lua è adattato da cose trovate su Wikipedia e nello strumento di Robert Lipe [GPSbabel] (http://www.gpsbabel.org/):
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
Immagino che tu lo voglia lungo la curvatura della terra. I tuoi due punti e il centro della terra sono su un piano. Il centro della terra è il centro di un cerchio su quel piano e i due punti sono (approssimativamente) sul perimetro di quel cerchio. Da questo puoi calcolare la distanza trovando qual è l'angolo da un punto all'altro.
Se i punti non hanno la stessa altezza, o se devi tenere conto del fatto che la terra non è una sfera perfetta, diventa un po' più difficile.