Idee web per il turismo
Geocoding: trasformare con php un indirizzo in coordinate latitudine e longitudine
Ho creato questo script quando, per sviluppare mobile.italysquare.com, avevo la necessità di sapere quali hotel erano nelle vicinanze della posizione gps rilevata dall’iPhone, ma non avevo le informazioni di latitudine e longitudine sulla tabella MySql degli hotels.
A questo punto ho creato due nuove colonne (più la colonna accuracy con i valori che vedrai spiegati sotto) sulla tabella hotel e le ho valorizzate con update partendo dall’indirizzo della struttura e tramite lo script sotto, che necessita di due files (BaseGeocode.php e GoogleGeocode.php) che potere scaricare zippati qui.
Di seguito il programma che aggiorna la tabella con le informazioni latitude/longitude da indirizzo con l’ausilio dei potenti mezzi di Google map.
Buon lavoro!
<?php
/*
Aggiunge le informazioni di lat/long/accuratezza su una tabella MySql partendo da un indirizzo tipo via citta' ecc..
Restituisce questo vettore:
Array
(
[Response] => Array
(
[Status] => 200
[Request] => geocode
)
[Placemarks] => Array
(
[0] => Array
(
[Accuracy] => 8
[Country] => US
[AdministrativeArea] => NY
[SubAdministrativeArea] => Monroe
[Locality] => Rochester
[Thoroughfare] => 1 Lomb Memorial Dr
[PostalCode] => 14623
[Latitude] => 43.092108
[Longitude] => -77.675238
)
)
Possibili valori di accuratezza (da: code.google.com/apis/maps/documentation/geocoding/#GeocodingAccuracy):
0 Unknown accuracy.
1 Country level accuracy.
2 Region (state, province, prefecture, etc.) level accuracy.
3 Sub-region (county, municipality, etc.) level accuracy.
4 Town (city, village) level accuracy.
5 Post code (zip code) level accuracy.
6 Street level accuracy.
7 Intersection level accuracy.
8 Address level accuracy.
9 Premise (building name, property name, shopping center, etc.) level accuracy.
)
*/
// ... qui ometto alcuni miei include.... come quelli per aprire il db e parametri vari... poi:
include "includes/GoogleGeocode.php";
$data_ora = strftime("%Y/%m/%d - %H:%M:%S");
$apiKey = $googlemapkey; // da generare su code.google.com/apis/maps/signup.html
// Connect to the MySQL server
if (!($connection = @ mysql_connect($hostname, $username, $password)))
showerror();
if (!(mysql_select_db($databasename, $connection)))
showerror();
print "*********** INIZIO ***************<br>";
$query = "SELECT * FROM is_hotel";
$query .= " and hotel_lat <> ''";
$query .= " order by hotel_id";
print $query ."<br>";
if (!($result = @ mysql_query($query, $connection)))
showerror();
$row = mysql_fetch_array($result);
while ($row)
{
$i++;
$nomestru = $row["hotel_nomestru"];
$id = $row["hotel_ID"];
$indirizzo = $row["hotel_indirizzo"];
$comune = $row["hotel_comune_nome"];
$comune_cap = $row["hotel_comune_cap"];
$comune_prov = $row["hotel_comune_prov"];
$geo = new GoogleGeocode( $apiKey );
$stringa = utf8_encode("$indirizzo, $comune, $comune_cap, Italia");
$coord = $geo->geocode($stringa);
// se lettura googlemap andata bene (200) e l'accuratezza è accettabile procede all'aggiornamento
if (($coord['Response']['Status'] == 200) and ($coord['Placemarks'][0]['Accuracy'] >= 8))
{
$out1 = "UPDATE is_hotel set hotel_accuracy = ".$coord['Placemarks'][0]['Accuracy'].", hotel_lat = ".$coord['Placemarks'][0]['Latitude'].", hotel_long = ".$coord['Placemarks'][0]['Longitude']. " where hotel_ID = $id";
//print $out1."<br>";
// esegue l'update direttamente sul DB
if (!(@ mysql_query ($out1, $connection)))
showerror();
print ">>>>> OK >>>>>> $id -- $nomestru -- " . $stringa . ">>".$coord['Placemarks'][0]['Latitude']."<< >>".$coord['Placemarks'][0]['Longitude']."<< >>".$coord['Placemarks'][0]['Accuracy']."<< <br>";
$a++;
}
else
print "NON AGGIORNATO: $id -- $nomestru -- " . $stringa . " >>" .$coord['Response']['Status']."<< >>".$coord['Placemarks'][0]['Accuracy']."<< <br>";
$row = mysql_fetch_array($result);
}
print "Letti records: ".$i."<br>";
print "Aggiornati : ".$a."<br>";
print "******** FINE *********";
?>
| Stampa l'articolo | Questo articolo è stato pubblicato da alessandro il 8 gennaio 2010 alle 22:25, ed è archiviato come Google, Programmazione. Puoi seguire i commenti a questo post attraverso RSS 2.0. Puoi pubblicare un commento o segnalare un trackback dal tuo sito. |




circa 2 anni fa
Ciao,
grazie per il post.
Vorrei farti una domande se possibile.
Quando ho la latidune di un logo che dista dalla latitudine di un altro luogo di 1, quanto vale in metri o km ?
per esempio: Lat1 – lat 2= x
x in metri o km quanto è?
Grazie
circa 2 anni fa
Ciao Andrea!
Posso dirti che dopo ho usato la query mysql che ottiene la distanza cosi’:
…
TRUNCATE ( 6363 * sqrt( POW( RADIANS($lat) – RADIANS(struttura_lat) , 2 ) + POW( RADIANS($long) – RADIANS(struttura_long) , 2 ) ) , 3 ) AS dist
…
dove “dist” è espressa in metri, puoi quindi applicare il filtro “HAVING”
Spero di esserti stato utile.
Se vuoi ottenere altre informazioni non per mysql, puoi googlare “Ottenere la distanza in metri tra due coordinate”
Ciao e grazie!
circa 1 anno fa
Ciao, scusa ho provato ad usare lo script ma non mi aggiorna i campi sul db
circa 1 anno fa
Ciao Giuse!
Ti consiglio di fare delle “print” prima e dopo l’update (come print $out1.”
“; che adesso nel codice è commentata con “//”). Poi visualizzare tutti gli errori eventuali.
Il risultato della print $out1 se lo replichi sulla tabella (ad esempio con phpmyadmin) vedi subito cosa va storto.
Fammi sapere e buon lavoro!