Proseguiamo con la serie di tutorials sulle Google Map API e vediamo come si fa ad ottenere le coordinate di un posto, dato il suo indirizzo testuale.
In questo caso, l'oggetto che ci serve utilizzare è il Geocoder, pertanto dovremo inserire nel codice della nostra pagina una riga:
var geo = new GClientGeocoder();
GClientGeocoder è l'oggetto che gestisce le comunicazioni tra la pagina Web e Google Maps.
Il metodo da utilizzare per effettuare le interrogazioni è il seguente:
geo.getLocations(search, function (result))
dove search è la stringa che contiene la funzione è function è la funzione di callback che deve essere richiamata quando Google restituisce il risultato.
Gli oggetti restituiti sono di tipo Placemark, quindi per estrarre i dati di interesse, si deve effettuare un ciclo sui risultati. Ad esempio:
for (var i=0; i<result.Placemark.length; i++) {
var p = result.Placemark[i].Point.coordinates;
var marker = new GMarker(new GLatLng(p[1],p[0]));
}
mentre lo stato della richiesta è contenuto nella proprietà:
result.Status.code
e può variare da G_GEO_SUCCESS in caso di successo a vari messaggi che indicano qual'è il tipo di errore incontrato.
Ad esempio, nell'esempio sotto riportato, il codice di errore viene gestito con un array associativo:
reasons[G_GEO_SUCCESS] = "Successo";
reasons[G_GEO_MISSING_ADDRESS] = "Indirizzo mancante: Indirizzo nullo o inesistente.";
reasons[G_GEO_UNKNOWN_ADDRESS] = "Indirizzo sconosciuto: L'indirizzo inserito non è stato trovato, prova a controllare che sia stato scritto correttamente.";
reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Indirizzo non disponibile: L'indirizzo non può essere riportato per limitazioni contrattuali di Google Maps";
reasons[G_GEO_BAD_KEY] = "Bad Key: Sbagliato! Rivolgiti a mader@tesene.it per sapere come far funzionare questa pagina";
reasons[G_GEO_TOO_MANY_QUERIES] = "Troppe Queries: Sono state effettuate troppe queries da questo sito.";
reasons[G_GEO_SERVER_ERROR] = "Errore lato server.";
In caso di fallimento, poi viene riportato un messaggio con:
var reason="Code "+result.Status.code;
if (reasons[result.Status.code]) {
reason = reasons[result.Status.code]
}
alert('Non trovato: "'+search+ '" ' + reason);
Se invece si ottengono dei risultati validi, vengono elencati e messi sulla cartina i relativi segnaposto.
if (result.Placemark.length >= 1) {
document.getElementById("message").innerHTML = "Volevi dire:";
// Loop nei risultati
for (var i=0; i<result.Placemark.length; i++) { var p = result.Placemark[i].Point.coordinates; var marker = new GMarker(new GLatLng(p[1],p[0]));
document.getElementById("message").innerHTML += "<br/>"+(i+1)+": <a xhref='javascript:place(" +p[1]+","+p[0]+")'>"+ result.Placemark[i].address+"</a>";
map.addOverlay(marker);
}
document.getElementById("message").innerHTML += "<br/>Se il risultato non è quello che desideravi, prova ad aggiungere informazioni";
}
Da osservare che le alternative che Google fornisce, sono solitamente sullo stesso livello, per cui un C.so Roma non sarà mai messo come alternativa alla città di Roma, e simili.
Per vedere come si applicano in pratica i concetti appena illustrati, è utile guardare la seguente demo:
Geocoder Demo
Aumenta la diffusione di questo articolo