Su un'altro blog ho trovato questa soluzione:
Se rapresentiamo il comune A con la coppia (a1,b1) in cui a1 è la longitudine e b1 è la latitudine ed il comune B con la coppia (a2,b2) (con significato analogo di a2 e b2), la distanza tra A e B è data dalla formula:
d(A,B) = arccos(cos(a1-a2) * cos(b1) * cos(b2) + sin(b1) * sin(b2))
che fornisce la distanza in radianti, o raggi terrestri.
A questo punto basta moltiplicare d(A,B) x 6360 per ottenere la distanza in km.
Ho anche trovato altre formule. Io mi sono creato il mio metodo in C#:
//http://it.wikipedia.org/wiki/Raggio_terrestre
//Raggio in metri
const double RAGGIO_TERRESTRE_M = 6372795.477598;public static Double Distanza(double longitudine1, double latitudine1, double longitudine2, double latitudine2)
{
double result = (System.Math.Sin((latitudine1 - latitudine2) / 2)) * (System.Math.Sin((latitudine1 - latitudine2) / 2));
result += System.Math.Cos(latitudine1) * System.Math.Cos(latitudine2) * (System.Math.Sin((longitudine1 - longitudine2) / 2)) * (System.Math.Sin((longitudine1 - longitudine2) / 2));
result = 2 * System.Math.Asin(System.Math.Sqrt(result));return result * RAGGIO_TERRESTRE_M;
}
Sembra che i conti tornino... Le due formule sono decisamente diverse:
- d(A,B) = arccos(cos(a1-a2) * cos(b1) * cos(b2) + sin(b1) * sin(b2)) * RAGGIO_TERRESTRE_M
- d(A,B) = 2 *arcosin(sqr(sin(b1-b2)^2 + cos(b1) * cos(b2) * (cos((a1 - a2)/2))^2)) * RAGGIO_TERRESTRE_M
Anche i calcoli sono decisamente differenti. Se, per esempio, prendiamo due punti A(41.96255363, 12.06951141) e B(41.86222614, 12.45510578) li trasformiamo in radianti Ar(0.732384723, 0.210652713) e Br(0.730633678, 0.217382605) i risultati sono i seguenti:
- circa 33Km
- circa 44Km
Chi ha ragione? Faccio la media dei due valori? 38Km e non se parli più!