Distanza e tempo tra due coordinate di google Maps, indirizzo da coordinate e viceversa

In questo articolo si vuole spiegare tramite codice php come ricavare dalle Google maps:

Prerequisiti

Si ipotizza di avere già una mappa dalla quale ricavare due punti aventi ognuno latitudine e longitudine. La mappa può essere creata in diversi modi ad esempio seguendo il tutorial del w3c che spiega come creare una mappa in Javascript.

I dati di input che useremo nei tre frammenti di codice potrebbero ad esempio essere ricavati da accessi a una tabella di database; mi riferisco agli indirizzi di partenza e/o destinazione ($Address1 e $Address2 nel codice) e alle coordinate di un punto nella mappa (latitudine e longitudine).


Ricavare Coordinate (latitudine e longitudine) dato un indirizzo

$Address1 = "via Durini, 24 20122 Milano";
$Address1 = urlencode($Address1);
$request_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=
                   ".$Address1."&sensor=true";

$xml = simplexml_load_file($request_url) or die("url not loading");
$status = $xml->status;
if ($status=="OK") {
    $Lat = $xml->result->geometry->location->lat;
    $Lon = $xml->result->geometry->location->lng;
    $LatLng = "Coordinata: ( $Lat, $Lon )";  //commentare se non serve vedere le coordinate
    //echo $LatLng;  //decommentare per vedere le coordinate
    $coordinates1 = array('lat'=>$Lat, 'long'=>$Lon);
}
else echo "errore";

Nel codice sopra dopo aver lanciato la richiesta a google tramite:

$request_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=
                   ".$Address1."&sensor=true";

e interpretato il file XML risultato tramite:

$xml = simplexml_load_file($request_url) or die("url not loading");

si salvano le coordinate nell’array $coordinates1.

Distanza in km e Tempo di percorrenza tra due coordinate di maps

La seguente funzione prende le coordinate di due punti e restituisce un array contenente distanza e tempo di percorrenza.
ATTENZIONE all’ordine delle coordinate: prima le due latitudini e poi le due longitudini:

function GetDrivingDistance($lat1, $lat2, $long1, $long2)
{
   $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=
        ".$lat1.",".$long1."&destinations=".$lat2.",".$long2."&mode=
                                                driving&language=it-IT";    
   //echo "<br/>".$url."<br/>";
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
   $response = curl_exec($ch);
   $response_a = json_decode($response, true);
   $dist = $response_a['rows'][0]['elements'][0]['distance']['text'];
   $time = $response_a['rows'][0]['elements'][0]['duration']['text'];
   curl_close($ch);
   return array('distance' => $dist, 'time' => $time);
}

Il codice della funzione è stato prelevato dalla risposta a una domanda posta su
Stackoverflow.

Come esempio di uso della funzione si possono prima calcolare le coordinate di due indirizzi con il codice visto al punto precedente.

Successivamente si chiama la funzione GetDrivingDistance passandogli latitudini e longitudini ricavate (stando attenti all’ordine dei parametri:


 

Ricavare indirizzo date le coordinate (latitudine e longitudine)

Avendo latitudine e longitudine si può ricavare l’indirizzo tramite il cosiddetto reverse geocoding. Si noti come alla fine dell’URL di richiesta a googleapis il parametro sensor sia impostato a false diversamente da prima.

function getAddress($lat, $lon) {
    $url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=
                  ".$lat.",".$lon."&sensor=false";
    //echo $url;    decommentare se si vuole vedere l'url della richiesta
    $json = @file_get_contents($url);
    $data = json_decode($json);
    $status = $data->status;
    $address = '';
    if($status == "OK"){
     foreach($data->results[0]->address_components as $address_component) {
            //Via
            if(in_array('route', $address_component->types)) {
                $route = $address_component->long_name;
            }
            //Numero
            if(in_array('street_number', $address_component->types)) {
                $street_number = $address_component->long_name;
            }
            //CAP
            if(in_array('postal_code', $address_component->types)) {
                $cap = $address_component->long_name;
            }
            //Città
            if(in_array('locality', $address_component->types)) {
                $locality = $address_component->long_name;
            }
            //Nazione
            if(in_array('country', $address_component->types)) {
                $country = $address_component->long_name;
            }            
        }
    }
    return $route." ".$street_number.",".$cap." ".$locality.",".$country;
}

echo getAddress( $coordinates1['lat'], $coordinates1['long']);

I parametri $coordinates1[‘lat’] e $coordinates1[‘long’] passati a getAddress, sono la latitudine e la longitudine prelevate dall’array $coordinates1.

Per informazioni più dettagliate sul risultato basta farsi un echo della variabile $url, copia incollare il risultato sul brower e vedere la composizione del json object risultato.