Come si calcola la distanza tra due punti specificati da latitudine e longitudine?
Per chiarire, vorrei la distanza in chilometri; i punti usano il sistema WGS84 e vorrei capire le precisioni relative degli approcci disponibili.
Questo link potrebbe esserti utile, in quanto descrive in dettaglio l'uso della formula di Haversine per calcolare la distanza.
Estratto:
Questo script [in Javascript] calcola le distanze ad ampio raggio tra due punti - cioè la distanza più breve sulla superficie terrestre - usando la formula di 'Haversine'.
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2-lat1); // deg2rad below
var dLon = deg2rad(lon2-lon1);
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c; // Distance in km
return d;
}
function deg2rad(deg) {
return deg * (Math.PI/180)
}
Ecco un'implementazione in C#:
static class DistanceAlgorithm
{
const double PIx = 3.141592653589793;
const double RADIUS = 6378.16;
/// <summary>
/// Convert degrees to Radians
/// </summary>
/// <param name="x">Degrees</param>
/// <returns>The equivalent in radians</returns>
public static double Radians(double x)
{
return x * PIx / 180;
}
/// <summary>
/// Calculate the distance between two places.
/// </summary>
/// <param name="lon1"></param>
/// <param name="lat1"></param>
/// <param name="lon2"></param>
/// <param name="lat2"></param>
/// <returns></returns>
public static double DistanceBetweenPlaces(
double lon1,
double lat1,
double lon2,
double lat2)
{
double dlon = Radians(lon2 - lon1);
double dlat = Radians(lat2 - lat1);
double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
return angle * RADIUS;
}
}
Per calcolare la distanza tra due punti su una sfera è necessario fare il calcolo del Grande Cerchio.
Ci sono un certo numero di librerie C/C++ per aiutare con la proiezione delle mappe in MapTools se hai bisogno di riproiettare le distanze su una superficie piana. Per fare questo avrete bisogno della stringa di proiezione dei vari sistemi di coordinate.
Potresti anche trovare MapWindow uno strumento utile per visualizzare i punti. Inoltre, dato che è open source, è un'utile guida su come usare la libreria proj.dll, che sembra essere la principale libreria di proiezione open source.