In articoli passati abbiamo affrontato alcune funzionalità di Google Maps che ci permettono di gestire indirizzi e calcolo a distanza.
Visto che l’argomento ha suscitato l’interesse di molti lettori, facciamo il punto della situazione, per non perdersi i dettagli. Ricordo che tutti gli articoli hanno il rispettivo script da scaricare, del tutto gratuitamente.
Riassumendo, nella pratica abbiamo visto come:
– trovare la distanza tra due coordinate geografiche conoscendo latitudine e longitudine
– trasformare un indirizzo in latitudine e longitudine. Se cercate un esempio più complesso, sempre per trasformare un indirizzo in coordinate ma con delle aggiunte, lo potete leggere a questo link.
– integrare e personalizzare una mappa di Google Maps nel nostro sito
– cambiare le coordinate in modo automatico con un click sulla mappa oppure trascinando il marker
– personalizzare il tooltip e aggiungere uno o più marker
Esempio completo: trasformare un indirizzo e calcolare la distanza da un punto
In questo articolo vi propongo uno script che riassume, in modo chiaro e diretto, le funzionalità di Google Maps che abbiamo già visto. Il concetto è lo stesso dei precedenti articoli, ma il codice è più pulito e facilmente modificabile (e soprattutto, come sempre, potete scaricarlo e modificarlo come vi sembra più opportuno).
Il suo scopo è:
– prendere un indirizzo e trasformarlo in coordinate geografiche;
– trovare la distanza tra queste coordinate geografiche e uno o più indirizzi passati.
Nell’esempio, ho preso come punto di origine l’indirizzo “Via Vittorio Veneto Cerea Vr”. Lo script recupererà le sue latitudine e longitudine. Dopodiché, passo tutti i cap delle frazioni di Verona e stampo a video la distanza tra questi e il mio indirizzo di base.
Nello specifico, entrando in campo tecnico, questi sono i passaggi:
– con una funzione, passando l’indirizzo come parametro, estrae latitudine e longitudine e le inserisce in un unico array di due elementi
– con una seconda funzione, prende due indirizzi come parametri, li trasforma in coordinate geografiche (richiamando la prima funzione) e ritorna la loro distanza in chilometri
– attraverso un ciclo for
estrae la distanza tra un punto di origine e, ricorsivamente, tutti i cap di Verona; poi li stampa a video
Il codice è completamente commentato e non avrete difficoltà a seguirlo, anche perché non richiede grandi modifiche. Vediamo nel dettaglio lo script.
Download script
Trasformare un indirizzo in coordinate
Attraverso una funzione, ci occuperemo di trasformare l’indirizzo fisico passato in coordinate geografiche (latitudine e longitudine):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
define("MAPS_HOST", "maps.google.com"); define("KEY", "abcdefg"); //Trasforma l'indirizzo passato in coordinate latitudine-longitudine e lo ritorna in un array //Recupera l'indirizzo passato in $address e, tramite le api geocode di Google Maps, lo trasforma in latitudine e longitudine. function address_in_coord($address){ $geocode_pending=true; //Initialize delay in geocode speed $delay=0; $base_url="http://".MAPS_HOST."/maps/geo?output=xml&key=".KEY; while($geocode_pending){ $request_url = $base_url . "&q=" . urlencode($address); $xml=simplexml_load_file($request_url) or die("url not loading"); $status = $xml->Response->Status->code; if (strcmp($status, "200") == 0){ // Successful geocode $geocode_pending = false; $coordinates = $xml->Response->Placemark->Point->coordinates; $coordinatesSplit = explode(",", $coordinates); // Format: Longitude, Latitude, Altitude $lat = $coordinatesSplit[1]; $lng = $coordinatesSplit[0]; //echo $lat." --- ".$lng; //punto di origine $array=array(); $array[]=$lat; $array[]=$lng; return $array; }elseif(strcmp($status, "620")==0) { // sent geocodes too fast $delay += 100000; }else{ // failure to geocode $geocode_pending=false; return "Address ".$address." failed to geocoded. Received status ".$status."\n"; } usleep($delay); }//while } |
Distanza tra due indirizzi
In una seconda funzione passeremo come parametro l’indirizzo fisico di origine e quello di destinazione. La funzione precedente (address_in_coord
) trasformerà ognuno di questi in latitudine e longitudine, che la funzione distanza()
prenderà per calcolare la distanza.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Ritorna la distanza tra due punti (ognuno con proprie latitudine e longitudine) //$origine = stringa contenente l'indirizzo del punto di origine //$destinazione = stringa contenente l'indirizzo del punto di destinazione function distanza($origine, $destinazione){ $origine_arr=address_in_coord($origine); $destinazione_arr=address_in_coord($destinazione); $lat1=$origine_arr[0]; $lon1=$origine_arr[1]; $lat2=$destinazione_arr[0]; $lon2=$destinazione_arr[1]; $distance = (3958*3.1415926*sqrt(($lat2-$lat1)*($lat2-$lat1) + cos($lat2/57.29578)*cos($lat1/57.29578)*($lon2-$lon1)*($lon2-$lon1))/180); return $distance; } |
Il cuore dello script: passare gli indirizzi
Per far avviare lo script, ci basta richiamare la funzione distanza()
, passandogli due indirizzi: in ordine, indirizzo di destinazione e indirizzo di origine. Il risultato sarà la distanza tra i due indirizzi in chilometri.
Nel nostro esempio, però, vogliamo far passare ricorsivamente tutti i cap di Verona come indirizzi di destinazione. Per fare questo, creiamo un ciclo for e, per ogni cap, richiamiamo la funzione distanza()
: a video stamperemo tutte le distanze tra “Via Vittorio Veneto Cerea Vr” e il cap presente.
Naturalmente al posto dei cap avreste potuto inserire vari indirizzi, immagazzinandoli in un array e facendoli passare ricorsivamente in un ciclo allo stesso modo.
1 2 3 4 5 6 7 |
//stampo la distanza tra tutti i cap di Verona (da 37121 a 37142) e il punto di origine $origine="Via Vittorio Veneto Cerea Vr"; for($i=37121; $i<37143; $i++){ if($i!=37130 and $i!=37140){ //escludo i cap nel range non di Verona echo distanza($i.' Verona', $origine)." Cap: ".$i."<br />"; } } |
Buona sera Marangoni, ho letto con interesse il suo articolo, però salvo mia cattiva interpretazione, il calcolo della distanza tra i due o più punti è lineare e dunque per fini reali non valido. E’ a conoscenza di script o altro (api di google) che permettono di calcolare e restituire la reale distanza tra i due punti seguendo lo standard di tutti i sistemi di navigazione ovvero il viaggio più veloce percorrendo la viabilità ordinaria? Grazie, Marco
Salve Marco,
esatto, la distanza è fatta in base a calcoli in linea d’aria. Al momento non ho ancora trovato script (funzionanti) che permettano di calcolare la distanza su scala effettiva.
Forse nella documentazione ufficiale si trovano delle api di Google apposite: devo ancora “spulciare” tutte le pagine, per cui potrebbe essermi sfuggito. Metto il link qui sotto per completezza:
https://developers.google.com/maps/documentation/javascript/reference?hl=it-IT
Oh grazie mille allora sottoporrò al mio programmatore la cosa
Buongiorno,
ho letto il tuo articolo, perché sono alla ricerca di un programma, o altra utilty che mi permetta di ottenere le coordinate GPS di una serie di indirizzi+città, diciamo circa 200.000, è una follia, oppure potrò ottenere le coordinate ? Grazie mille. Aldo
Ciao Aldo,
la cosa migliore è cercare in rete un file che contenga già la lista dei comuni con le coordinate, che puoi estrapolare. Se ti servono indirizzi precisi, però, è molto difficile trovare quello che ti serve.
Hai già la lista degli indirizzi-città in un file o in un database? Se è così ti basta passarli uno a uno con il mio script che vedi sopra (“trasformare un indirizzo in latitudine e longitudine”).
Ciao Manuel e grazie per la risposta…..io li passerei uno ad uno….peccato che sono 350.000 ! finirei fra 10 anni. E poi dovrei prendere lat e long e rimetterli in un csv per farlo importare dal tema.
Grazie comunque.
Dovresti trovare un sistema per farlo in automatico. Non so in quale formato li hai quei 350 mila indirizzi (database? txt/csv?), ma se hai la lista sottomano la soluzione più ottimale sarebbe recuperarli uno a uno con uno script php, poi usare le api di Maps per recuperare le coordinate e salvare le coordinate in una tabella di database in modo da poterle manipolare come meglio credi.
Siccome sono così tanti, serve qualche accortezza per non mandare in “time limits” la pagina. Per esempio ne esegui 200, poi ricarichi la pagina e gli dici di processare i successivi 200; naturalmente il ricarico di pagina lo fai fare automaticamente al php una volta raggiunti i 200 record.
Qua dipende anche quanto tempo vuoi perderci, perché non conosco il tuo livello di esperienza in programmazione 😉