venerdì 22 giugno 2007

Come si calcola la distanta tra 2 punti espressi in latitudine e longitudine

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ù!