Vai al contenuto

Calcolare la distanza di due punti della terra: la formula dell’emisenoverso.

Tempo fa ho avuto la necessità di implementare delle funzioni per estrarre da un database tutti i comuni limitrofi ad un punto dato. L’utente inseriva il nome della città, venivano ricercate le corrispondenti coordinate geografiche utilizzando i servizi di Google Maps e poi, attraverso una query di ricerca, veniva interrogata la base dati restituendo i comuni limitrofi in un raggio di km prestabilito (in linea d’aria!).

Per arrivare a ciò, mi è stata di grande aiuto la cosiddetta distanza ortodromica, cioè è il percorso più breve tra due punti sulla superficie di una sfera (e si suppone che la Terra è una sfera perfetta, anche se non lo è in realtà), e la formula matematica dell’emisenoverso, formula della trigonometria sferica che è molto utile in navigazione e in cartografia. Attraverso tale formula e con gli opportuni accorgimenti, è possibile sapere quale distanza intercorre tra due punti geografici (latitudine e longitudine), sia in chilometri che in miglia.

Da Wikipedia, la formula matematica è la seguente:

senoverso

dove l’emisenoverso non è altro che la metà della funzione senoverso, cioè:

emisenoverso, e cioè,  emisenoverso_2 che in PHP diventa

// emisenoverso
pow(sin($dLat / 2), 2)

Lo script qui in basso non è altro che una trasposizione in PHP della prima formula citata.

function haversineDistance($lat_from, $lon_from, $lat_to, $lon_to, $earth_radius = 6371000) {
	// conversione da gradi a radianti
	$latFrom = deg2rad($lat_from);
	$lonFrom = deg2rad($lon_from);
	$latTo = deg2rad($lat_to);
	$lonTo = deg2rad($lon_to);

	$dLat = $latTo - $latFrom;
	$dLon = $lonTo - $lonFrom;

	$a = pow(sin($dLat / 2), 2) + cos($latFrom) * cos($latTo) * pow(sin($dLon / 2), 2);
	$c = 2 * asin(sqrt($a));
	$d = $earth_radius * $c;

	// ritorna la distanza in metri. 
	// per avere la distanza in kilometri basta dividere per 1000 o passare 6371 come 5° argomento della funzione.
	return $d; 
}

Attraverso la funzione asin (arcoseno) ci viene restituito il valore dell’angolo interessato che poi verrà moltiplicato per il raggio della terra. Per ovvi motivi, la distanza calcolata viene considerata in linea d’aria, senza considerare le conformazioni fisiche del terreno, strade, etc.

Nel prossimo articolo vedremo come implementare questa funzione all’interno di MySQL e come riuscire a farci restituire i punti geogrefici di interesse attigui a un determinato punto geografico dato.