howto: calcolare la distanza con mysql conoscendo latitudine e longitudine

Nel post "howto: punti di interesse per tom tom in php" si è visto come ottenere latitudine e longitudine di un indirizzo geografico.
Ora ipotizzo di aver salvato una serie di posizioni geografiche in una tabella di mysql e di aver salvato in due campi distinti la latitudine e la longitudine. Come posso calcolare la distanza tra i due punti?
Innanzitutto 30 secondi di geometria. Poichè la terra è "all'incirca sferica" posso esprimera la distanza tra due posizioni geografiche come arco che congiunge i due punti sulla superficie terrestre.

Il database potrebbe essere creato cosi
create database mylocations; use mylocations; CREATE TABLE `locations` ( `id` int(11) NOT NULL auto_increment, `latitude` float(9,6) NOT NULL, `longitude` float(9,6) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
ad ottenere questo:
describe locations; +-----------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | latitude | float(9,6) | NO | | NULL | | | longitude | float(9,6) | NO | | NULL | | +-----------+------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
ammettiamo di voler calcolare la distanza tra una posizione geografica del database e un punto prefissato (diciamo latitudine 45.812775 longitudine 9.035438 ) la query sql sarebbe:
SELECT TRUNCATE( 6363 * sqrt( POW( RADIANS( 45.812775 ) - RADIANS( latitude ) , 2 ) + POW( RADIANS( 9.035438 ) - RADIANS( longitude ) , 2 ) ) , 3 ) AS distance FROM locations WHERE id ='.$id
Il risultato che ottengo è un numero decimale che esprime la distanza in km dal punto prefissato.
Naturalmente non si tratta della distanza che percorrere in auto per raggiungere la destinazione! Inoltre le distanze tra punti molto molto vicini fra loro ma separati da grandi dislivelli di quota avranno una distanza maggiore di quanto calcolato.
Pero tutto sommato otteniavo un valore approssimativo ma abbastanza reale. In realtà è la distanza minima percorribile.
Se invece voglio ottenere l'elenco delle posizioni geografiche che distano meno di 10 km dal punto prefissato (diciamo latitudine 45.812775 longitudine 9.035438 ), eseguo questa query:
SELECT *, TRUNCATE ( 6363 * sqrt( POW( RADIANS(45.812775 ) - RADIANS(latitude) , 2 ) + POW( RADIANS(9.035438 ) - RADIANS(longitude) , 2 ) ) , 3 ) AS distance FROM locations WHERE TRUNCATE ( 6363 * sqrt( POW( RADIANS(45.812775 ) - RADIANS(latitude) , 2 ) + POW( RADIANS(9.035438 ) - RADIANS(longitude) , 2 ) ) , 3 ) < 10 ORDER BY distance ASC";
----------------
Nota:
----------------
In una mail list ho trovato questo meccanismo di conversione che puo tornare utile.
Latitudine e longitudine possono anche essere espresse in gradi, primi secondi etc come in questo caso.
42° 9' 10'' N 10° 14' 10'' E
per trasformarli nel formato decimale usato da Google Maps, Yahoo Maps e TomTom si procede cosi
$dec_lat = $gradi_lat + $minuti_lat/60 + $secondi_lat/3600;
$dec_long = $gradi_long + $minuti_long/60 + $secondi_long/3600;e si ottiene:
42,124521 10,144242
- dam's blog
- 4585 reads

grande sysnaz ! non ho il
grande sysnaz !
non ho il tempo per testarla, ma ti ringrazio cmq per il contributo
--
enjoy
Dam
Post new comment