PHP, MYSQL – Distanza tra due coordinate geografiche conoscendo latitudine e longitudine

Come abbiamo visto qualche mese fa in un articolo, Google Maps ci mette a disposizione un sistema per trasformare un indirizzo civico in coordinate geografiche (cioè latitudine e longitudine). Alla pagina linkate troverete un link completo da scaricare.

Ma, una volta che abbiamo recuperato latitudine e longitudine, come facciamo a trovare la distanza tra due punti geografici?
Ancora: come facciamo a trovare il numero di aziende che si trovano a una certa distanza dal punto geografico passato?

Situazioni simili si possono presentare, per esempio, se dobbiamo realizzare un sito di e-commerce (negozio online) in cui dobbiamo calcolare le spese di trasporto in base alla distanza da percorrere tra l’azienda che offre il prodotto e il compratore destinatario.
Dobbiamo inoltre distinguere il caso in cui le coordinate siano già preventivamente in nostro possesso, oppure quando una delle due coordinate ci vengono fornite dall’utente (per esempio digitando il suo indirizzo e inviandolo tramite form).

I due script che trovate di seguito mostrano due casistiche distinte:
1) recupero della distanza tra due coordinate geografiche, conoscendo di entrambe già dall’inizio latitudine e longitudine. La distanza sarà ricavata tramite formula matematica e con l’uso del linguaggio php.
2) estrazione dei punti geografici già in nostro possesso che si trovano entro una determinata distanza dalle coordinate inviateci dall’utente, per esempio tramite form. In questo caso noi avremo a disposizione, nel nostro database, un certo numero di aziende/luoghi con associate delle coordinate geografiche. Il calcolo sarà fatto direttamente in una query del database, che sarà di tipo mysql.

Distanza tra due coordinate geografiche

Il codice non ha bisogno di grandi spiegazioni. Come esempio, calcoliamo la distanza tra “Piazza Brà” e “Stazione Porta Nuova” di Verona. In questo caso ho messo in chiaro latitudine e longitudine per ognuna, ma nulla vieta che una delle coordinate siano passate dinamicamente, per esempio attraverso un form: in questo modo potremmo calcolare la distanza da un punto iniziale (da noi stabilito) a un luogo indefinito indicatoci dall’utente.

[Edit 17 dicembre 2015]: la formula (così come la query nella sezione più sotto) è stata recuperata in rete e mantenuta così come trovata. Il risultato della formula dovrebbe essere espresso in miglia, per cui occorrerà effettuare la dovuta conversione per ottenere il valore in km. Se qualcuno fosse in grado di spiegarla nel dettaglio, lasci pure un commento che provvedo ad aggiornare.
Ringrazio Gurzo per la segnalazione (si veda nei commenti).

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
//Piazza Brà, Verona
$lat1=45.43936;
$lon1=10.9929; 

//Stazione Porta Nuova, Verona
$lat2=45.42928;
$lon2=10.98233; 

$distance = (3958*3.1415926*sqrt(($lat2-$lat1)*($lat2-$lat1) + cos($lat2/57.29578)*cos($lat1/57.29578)*($lon2-$lon1)*($lon2-$lon1))/180); 

echo $distance;
?>

Estrazione dei luoghi geografici entro una certa distanza da un punto stabilito

L’esempio è apparentemente più complesso del precedente, ma si tratta di specificare alcuni chiarimenti prima di iniziare:
– nel vostro database dovrà trovarsi una tabella chiamata coordinate, che conterrà (oltre ai campi a vostra scelta) i campi latitudine e longitudine. In pratica si tratta di avere una lista di record che corrispondono ad aziende/luoghi a cui sono state associate le rispettive coordinate latitudine e longitudine.
– sarà l’utente a inviare, tramite form, il punto di origine. Probabilmente dovrete stabilire dei semplici campi input per inserire l’indirizzo (i soliti via, cap, paese, ecc.), perché è difficile che un utente ordinario inserisca di sua iniziativa la latitudine e la longitudine della sua abitazione: voi vi dovrete occupare di trasformare il suo indirizzo in coordinate geografiche, magari usando il link che vi ho proposto a inizio articolo. Per semplicità ho riportato la latitudine e la longitudine rispettivamente nelle variabili $_POST['lat'] e $_POST['lng'].

Cosa fa lo script?
Una volta ottenuto il punto di origine dall’utente, il codice fa direttamente il calcolo della distanza in una query mysql ed estrae tutti quei record le cui coordinate si trovano entro 100 km dal punto di origine stesso.
Leggere il codice è più semplice che spiegarlo. Qui sotto mi limito a mostrare semplicemente la query completa.

1
2
3
4
<?php
$query="SELECT * FROM coordinate WHERE ";
$query.="TRUNCATE ( 6363 * sqrt( POW( RADIANS('".$_POST['lat']."') - RADIANS(latitude) , 2 ) + POW( RADIANS('".$_POST['lng']."') - RADIANS(longitude) , 2 ) ) , 3 ) < 100";
?>
Etichette:,
Ultimi Commenti
  1. Leonardo Antonicelli
  2. Andrea
  3. Sav
  4. Federico
  5. Federico
  6. Mirco Caporali
  7. roberto
  8. Max Cubi
  9. Max Cubi
  10. Mahjong
  11. Antonio
      • Antonio
          • Antonio
    • Antonio
  12. Gurzo
  13. Gurzo
  14. Antonio
  15. Antonio
  16. Alex

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *