JCoord, convertire un indirizzo in coordinate usando Java e JSON

JCoord - Java wrapper Google GeoCode v3 API

Sviluppando web application torna spesso ricorrente la necessità di collocare su una mappa Google Maps alcuni punti di interesse, permettendo l’interazione dell’utente con essi. Di solito i punti sono immagazzinati nel database, o letti da servizi di terze parti, non come coordinate, ma come indirizzi in formato human readable, a volte magari affetti da typo.

Per questo motivo ho deciso di sfruttare le API di Google Geocoding v3 in versione JSON e la libreria Gson per crearmi velocemente una libreria Java costituita da un singolo jar da poter sfruttare per tradurre indirizzi in coordinate. Prima di fornire il link per il download due parole sul principio di funzionamento.

Sono partito dal lavoro di panchmb (a cui va il 100% del credito per l’implementazione delle classi base per le operazioni di composizione della request HTTP e del parsing della risposta JSON) ed ho esteso la libreria creando una classe wrapper con metodi statici da poter chiamare direttamente, da qualsiasi punto del codice.

Inoltre, ho implementato un layer logico che consente di raffinare la ricerca delle coordinate, a partire dal set di N risultati ritornato dalle API Google Geocoding, sfruttando il fatto che l’indirizzo è composto da almeno 3 elementi che possono essere geolocalizzati in modo distinto.

In particolare supponiamo che l’indirizzo sia formato da:

  • provincia (eg. Pistoia)
  • comune (eg. Agliana)
  • indirizzo (eg. Via Roma)
Questi tre elementi possono venir localizzati in maniera indipendente, e possono rappresentare elementi a precisione decrescente di quello che dovrebbe essere il punto esatto sulla mappa. L’algoritmo opera a partire dai punti a precisione minore, e li utilizza per scegliere quale degli N risultati (in caso siano più di uno) ritornati per la query completa ovvero quella formata da indirizzo+comune+provincia. Questo approccio è utile anche per correggere i typo potenzialmente presenti nell’indirizzo e che potrebbero portare ad un risultato nullo se facessimo semplicemente la query completa.
Google Geocode API JSON Java Approssimazione Indirizzo
Approssimazione indirizzo Google Geocode API

L’algoritmo opera secondo un principio banale:

  • utilizzando la provincia si effettua una query e si estrae il primo marker M1 con coordinate (Lat1,Lng1)
  • utilizzando la stringa ottenuta dalla concatenazione di provincia e comune si effettua una query e si estrae dalla lista di marker potenzialmente ritornati, quello più vicino a M1, detto marker M2
  • utilizzando la stringa ottenuta dalla concatenazione di provincia e comune ed indirizzo si effettua una query e si estrae dalla lista di marker potenzialmente ritornati, quello più vicino a M2, detto marker M3
  • se M3 è diverso da null il codice ritorna M3, altrimenti, se M2 è diverso da null il codice ritorna M2. Nel caso che sia M3 che M2 siano nulli il codice ritorna M1 (che auspicabilmente è non nullo).

In questo modo specificando separatamente provincia, comune ed indirizzo abbiamo più possibilità di avere un risultato (anche in caso di typo nell’input utente) ed una maggiore accuratezza. Ad esempio la libreria ritorna un risultato valido per la query “via+akjsnckxjnjncnds+pistoia+quarrata“, ritornando le coordinate di un punto non ben precisato di Quarrata (comunque meglio di null).

Come usare la libreria JCoord

Per utilizzare JCoord è necessario scaricare il binario JCoord.jar ed includerlo nel proprio progetto Java. La libreria dipende da diversi  altri jar, ma per comodità ho combinato tutto in un unico archivio ready-to-use. 

Una volta inclusa la libreria nel progetto vediamo nello snippet sotto come utilizzarla per risolvere una coppia di coordinate a partire da un indirizzo:

// init variables
String provincia = "Pistoia";
String comune = "Agliana";
String address = "Viale Roma 34";

// call the static method of JCooord
LatLng coord = GeoCodeResolver.findExactCoordForAddress(provincia, comune, address);

// get coordinate as double values
double latidude = coord.getLat();
double longitude = coord.getLng();

A parte le linee di inizializzazione e get delle cooordinate quindi la risoluzione dell’indirizzo si limita ad una sola linea di codice, che può essere tranquillamente chiamata sia da un applicazione desktop che da un bean di un’applicazione web.

Alternativamente è possibile chiamare la libreria in modo tradizionale, passando un’unica stringa, senza utilizzare l’algoritmo di ottimizzazione. In questo caso la chiamata è ancora più semplice:

// init variables
String address = "Pistoia Agliana Viale Roma 34";

// call the static method of JCooord
LatLng coord = GeoCodeResolver.findCoordForAddress(address);

// get coordinate as double values
double latidude = coord.getLat();
double longitude = coord.getLng();

Download

Potete scaricare la libreria alla URL sotto (eh su un Like non costa nulla :-p):

[wp-like-locker]

Scarica JCoord.jar: http://elbuild.com/jcoord/JCoord.jar

[/wp-like-locker]

Autore: Luca Adamo

Luca Adamo si è laureato con lode in Ingegneria delle Telecomunicazioni all'Università degli studi di Firenze ed è dottorando in Ingegneria Informatica, Multimedialità e Telecomunicazioni, sempre nella stessa facoltà. Le sue competenze tecniche includono lo sviluppo software, sia orientato al web che desktop, in C/C++ e Java (J2EE, J2SE, J2ME), l'amministrazione di macchine Unix-based, la gestione di reti di telecomunicazioni, ed il design di database relazionali.

27 pensieri riguardo “JCoord, convertire un indirizzo in coordinate usando Java e JSON”

  1. Davvero ottima libreria. Solo che ho un problema Sto sviluppando un progetto per un esame
    e sto utilizzando la tua libreria. Nella mia università c’è il proxy e questo mi impedisce di ottenere le coordinate.Per caso potresti darmi un consiglio?

    1. Ciao Antonella,
      purtroppo la libreria interroga le API di Google direttamente via HTTP, per cui se la tua universitá impone un prox l’unica soluzione è impostarlo a livello di sistema operativo invece che, come avviene spesso, nel browser. Questo fa si che tutto il tuo traffico di rete passi dal proxy (anche quello originato dalla libreria). Come fare dipende dal SO che usi.
      Ciao, Lu

  2. Ciao Luca
    da questa libreria è anche possibile ottenere questi dati:
    – altitudine
    – precisione di rilevamento
    (dati ottenuti normalmente da un gps)
    – distanza tra due punti in metri o kilometri
    ?

    1. Ciao Antonio,
      i dati ritornati sono quelle delle API Google, per cui solo LAT e LNG, con una precisione derivante dal grado di approssimazione che Maps ha nel luogo specifico dell’indirizzo dato in ingresso. Non è uno strumento che userei per rilievi ecco.. Però puoi usare le coordinate estratte dalla libreria per passarle ad un servizio di terze parti (dovrebbero esistere) che ti ritorna l’altezza ed eventualmente la distanza fra X e Y.

      1. Ti ringrazio, sulla base di quello che mi hai detto ti faccio un’ultima domanda. Supponiamo che la latidudine e la longitudine, siano rispettivamente le coordinate x ed y di un punto. E che i punti che devo trovare sono talmente vicini tra loro che posso considerare la terra un piano a due dimensioni. Posso quindi utilizzare la distanza euclidea per trovare l’effettiva distanza tra i due punti?
        Grazie per la tua disponibilità

  3. Ciao Luca,

    assieme a alcuni ragazzi stiamo sviluppando un sito in cui daremo la possibilità agli utenti di specificare la loro località (che può essere sia frazione, comune o provincia). Interrogando Google avremo le coordinate. È possibile con il tuo script (o con delle modifiche allo stesso) passare dalle coordinate alla provincia di appartenza?

    1. In linea di massima si, anche se oggi JCoord implementa l’operazione inversa quella che interessa a voi. Ho creato qualcosa del genere, se vi serve ancora fatemi sapere inviandomi una mail ai contatti del sito. Scusate l’immenso ritardo nella risposta ma il commento era finito nello spam 🙂

      1. Ho letto con molto interesse questo articolo, e mi servirebbe esattamente quanto richiesto da Alessandro, cioè tradurre una coordinata in un indirizzo anche approssimativo.
        Puoi darmi un consiglio o indicarmi qualche libreria.

        Grazie
        Ciao
        Paolo

        1. Ciao Paolo, di default JCoord implementa l’operazione inversa ma quello che chiedi è sicuramente possibile. Come ho detto ad Alessandro se ti serve qualche spunto scrivimi in privato (trovi l’indirizzo sul sito di ELbuild) e ti aiuto volentieri.

  4. Ciao ho provato a scaricare il jar, ma anche mettendo il like non viene visualizzato nulla.
    potresti gentilmenti inviarli l’archivio?

    grazie mille
    Moise

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *