allora... l'utente immette l'indirizzo in una form che manda tutto a questa funzione
Codice PHP:
public static function lat_long($indirizzo){
$cordinate = array();
if (!is_string($indirizzo))die("gli indirizzi devono essere mandati come stringa");
$encoding_address = urlencode($indirizzo);
$GoogleAPI = 'http://maps.google.com/maps/api/geocode/xml?address='.$encoding_address.'&sensor=false';
$XMLresult = file_get_contents($GoogleAPI);
$XMLobject = new SimpleXMLElement($XMLresult);
if($XMLobject->status=='OK') {
$cordinate['lat'] = $XMLobject->result->geometry->location->lat;
$cordinate['long'] = $XMLobject->result->geometry->location->lng;
}
return $cordinate;
}
poi tutto passa attraverso questa query:
Codice PHP:
"SELECT TOP 3 *, (6378.8 * ACOS(SIN(".$lat." / 57.2958) * SIN(lat / 57.2958) + COS(".$lat." / 57.2958) * COS(lat / 57.2958) * COS(lon / 57.2958 - ".$long." / 57.2958))) AS distanza FROM luoghi
WHERE lat IS NOT NULL AND lon IS NOT NULL AND ".$lat.">=lat-0.9 AND ".$lat."<=lat+0.9 AND ".$long.">=lon-0.9 AND ".$long."<=lon+0.9
AND (6378.8 * ACOS(SIN(".$lat." / 57.2958) * SIN(lat / 57.2958) + COS(".$lat." / 57.2958) * COS(lat / 57.2958) * COS(lon / 57.2958 - ".$long." / 57.2958)))< 100 ORDER BY distanza ASC "
in pratica ho ridotto tutti i record ad un "raggio" (in realtà è un quadrato) di 100km dal luogo di partenza (ricordo che per passare dal raggio in km a radianti bisogna moltiplicare per 0,009) in modo da poter snellire le operazioni da db