Google Maps – Riassunto ed esempio completo: estrarre coordinate da indirizzo e calcolo distanza

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.

Per chi fosse alle prime armi o cercasse informazioni di base sull’uso di Google Maps, faccia invece riferimento agli articoli seguenti che spiegano come:

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 />";
	}
}
Ultimi Commenti
  1. Marco
  2. Nerd Corner
  3. Aldo
  4. Aldo

Lascia un commento

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