In un precedente articolo avevo pubblicato il codice di una funzione in ANSI C per il calcolo delle distanze sulla superficie terrestre. Poiché il C e il PHP sono due linguaggi dalla sintassi assai simile, ho deciso di fare la traduzione del codice. Inoltre, per dare un senso pratico al lavoro, ho trovato sul web l'archivio completo dei comuni italiani con le relative coordinate geografiche e su questo ho costruito un programmino PHP interattivo che permette di selezionare due comuni ed ottenere la relativa distanza geodetica, ovvero la lunghezza dell'arco massimo che unisce i due punti rappresentati dalle coordinate dei due comuni.Va sottolineato che, come spiegato in questo ottimo articolo, per distanze molto piccole la formula che utilizzo fornisce un errore piuttosto grosso, quindi i risultati vanno presi come puramente indicativi.
Ecco il codice della funzione:
function disgeod($latA, $lonA, $latB, $lonB){
define ("R","6371");
/* Converte i gradi in radianti */
$lat_alfa = M_PI * $latA / 180;
$lat_beta = M_PI * $latB / 180;
$lon_alfa = M_PI * $lonA / 180;
$lon_beta = M_PI * $lonB / 180;
/* Calcola l'angolo compreso fi */
$fi = abs($lon_alfa - $lon_beta);
/* Calcola il terzo lato del triangolo sferico */
$p = acos(sin($lat_beta) * sin($lat_alfa)
+ cos($lat_beta) * cos($lat_alfa) * cos($fi));
/* Calcola la distanza sulla superficie terrestre R = ˜6371 Km */
$d = $p * R;
return($d);
}
E questa invece è la funzione che converte i gradi sessagesimali in decimali:
function deg2dec($d=0,$m=0,$s=0,$direction)
{
$decimal=($d+($m/60)+($s/3600));
//South latitudes and West longitudes need to return a negative result
if (($direction=="S") or ($direction=="W"))
{ $decimal=$decimal*(-1);}
return $decimal;
}
Per evitare di dover caricare le due
select con tutti gli 8104 comuni, cosa che avrebbe rallentato il caricamento della pagina in modo improponibile, ho utilizzato uno script AJAX che provvede a popolare le select dinamicamente con i soli nomi dei comuni di una certa provincia preselezionata.
Potete provare il programma su questo link (Il programma è stato testato con Firefox 2 e con Internet Explorer 7)
Download
L'intero pacchetto (circa 1Mb) comprende anche l'archivio in formato sql, txt, xls e csv.
Conclusioni
Lo sviluppo di questo programmino è stato un esercizio interessante, che mi ha permesso di approfondire anche l'utilizzo e il funzionamento degli script AJAX sui quali credo che tornerò in futuro.
Riferimenti ed approfondimenti:

Vorrei segnalare questo articolo: http://www.movable-type.co.uk/scripts/latlong.html nel quale vengono descritte due formule per il calcolo delle distanze geodetiche con esempi di codice javascript. Una è la formula di Haversine, semplice ma accurata anche per brevi distanze e l'altra è la formula di Vincenty ( http://www.movable-type.co.uk/scripts/latlong-vincenty.html ) più complessa ma anche più precisa in quanto considera la terra un ellissoide, come in effetti è realmente.
Ottimo articolo! Userò le informazioni per un mio applicativo che sto sviluppando per calcolare le distanze su una mappa utilizzando virtual earth.
Complimenti per la chiarezza espositiva.