Fare Reverse Geocoding con Google Maps

Giorgio Borelli

Nell'articolo precedente abbiamo parlato di come fare Geocoding con Google Maps, ovvero ottenere da un dato indirizzo le coordinate geografiche di latitudine e longitudine. un'altra tecnica molto interessante, implementabile con le Google Maps è il Reverse Geocoding, l'esatto contrario del Geocoding, ovvero la possibilità di ricavare l'indirizzo dalle coordinate geografiche. Mettere appunto il reverse geocoding non è difficile, ed una volta capito come funziona il geocoding basta apportare delle semplice modifiche al codice per fare l'esatto contrario.

Ancora una volta per l'implementazione del Reverse Geocoding sfruttiamo le google geocoding API, andiamo a vedere come fare.

Come per il geocoding, per prima cosa dobbiamo instanziare la classe geocoder che google maps ci mette a disposizione, con questo codice:

var geocoder = new google.maps.Geocoder();

una volta ottenuto l'oggetto ne invochiamo il metodo geocode(), il quale, come spiegato accetta due parametri, il primo l'indirizzo di cui si desidera calcolare le coordinate, ed il secondo una funzione, detta di callback, il cui codice verrà eseguito non appena termina l'invocazione di geocode(). Il metodo geocode è "polimorfo" può accettare infatti un parametro diverso da un indirizzo, ovvero un oggetto punto (Point delle API V3 di Google Maps) che indica le coordinate di latitudine e longitudine, in questo al metodo geocode anzichè la chiave 'address' è necessario specificare che stiamo passando delle coordinate indicando la chiave 'LatLng', guardiamo il codice per capire meglio:

var point = marker.getPosition(); //marker già esistente
geocoder.geocode({'latLng': point}, function (results, status) { ... } );

come potete notare il punto geografico "point" viene creato dal metodo getPosition() di un marker già presente sulla mappa, eventualmento possiamo instanziarne uno ex novo tramite l'operatore new, passando al metodo costruttore i valori di latitudine e longitudine.

Dopodichè invochiamo il metodo geocode, specificando come detto la chiave 'latLng' anzichè 'address' ed il punto creato. La funzione di callback invece sarà responsabile del codice implementativo del reverse geocode, eseguito al termine della chiamata di geocode, ricordiamo che la funzione di callback accetta due parametri, results e status, il primo un array con le informazioni relative alla richiesta, questa volta delle coordinate e non dell'indirizzo passato, e status indica sempre lo stato della richiesta.

il Google.maps.GeocoderStatus non è altro che un tipo enumerato che può assumere i seguenti valori:

    • OK: la richieta è andata a buon fine
    • REQUEST_DENIED: la pagina non possiede gli appropriati permessi per invocare il geocode()
    • ZERO_RESULTS: non ci sono risultati per la ricerca effettuata, l'indirizzo non è stato trovato
    • INVALID_REQUEST: richiesta non valida

Come col geocode effettuiamo per prima cosa un controllo sullo status, per capire se la richiesta ha avuto esito positivo o meno, guardiamo l'intero codice (interno alla funzione di callback):

geocoder.geocode({'latLng': point}, function (results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        if (results[1]) {
            var route = '';
            var number = '';
            for (i = 0; i < results[0].address_components.length; i++) {
                for (j = 0; j < results[0].address_components[i].types.length; j++) {
                    if (results[0].address_components[i].types[j] == "route")
                        route = results[0].address_components[i].long_name;
                    if (results[0].address_components[i].types[j] == "street_number")
                        number = results[0].address_components[i].long_name; }
 
        if (number != '')
            document.getElementById('indirizzo').value = route + ', ' + number;
        else
            document.getElementById('indirizzo').value = route;
        }
    }
    else {
        alert("No results found"); }
    }
else {
    alert("Geocoder fallito"); }
 });

il parametro status di tipo GeocoderStatus, contiene l'esito della nostra richiesta, se è OK, vuol dire che tutto è andato a buon fine e possiamo entrare nel corpo vero e proprio della funzione di callback per eseguire il codice necessario a creare il nostro indirizzo, diversamente mostriamo un messaggio inerente il cattivo esito della richiesta.

Una volta effettuato il controllo, l'array results contiene tutte le informazioni della nostra richiesta, facciamo un controllo all'indice 1 per vedere se results contiene elementi, poi creiamo due variiabili stringhe vuote, route e number, che conterranno l'indirizzo ed il numero civico della nostra posizione. Dopodichè è necessario mettere appunto un doppio ciclo for per scorrere results[0] e prelevare le info necessarie per costruire la stringa del nostro indirizzo che concateneremo in route. Come potete notare all'interno dei cicli è necessario verificare che tipo d'informazione results[0].address_components ci presenta, effettuando dei controlli su "route" e "street_number". Desidero infine farvi notare che ho differenziato le variabili route da number, poichè può capitare che il numero civico non sia presente o non ci interessa specififcarlo. 

Alla fine, possiamo usare la variabile route contenente l'indirizzo coome meglio crediamo, ad es. tramite la classica funzione Javascript document.getElementbyId(), possiamo assegnarlo ad un qualsiasi elemento html della nostra pagina.

Per chii volesse dare un'occhiata agli articoli precedenti inerenti Google Maps, ed in particolar modo al geocoding (il primo della lista), può visionare i seguenti link:

Infine, ancora una volta, vi indico il link delle API Versione 3 di Google Maps; per chi volesse imparare gli oggetti ed i metodi messi a disposizione da Google Maps per le implementazioni in Javscript delle mappe, è da qui che bisogna partire:

Google Maps Javascript API V3 Reference

Chiunque voglia aggiungere qualcosa, chiedere chiarimenti, su "Come effettuare il Reverse Geocoding con Google Maps" può farlo tramite i commenti.

Categorie: Google | Javascript

Tags: , ,

Pingbacks and trackbacks (1)+

Aggiungi Commento

biuquote
Loading