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 

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

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
1 + 0 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.