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)
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]
27 risposte su “JCoord, convertire un indirizzo in coordinate usando Java e JSON”
Ciao ottima libreria e davvero utile man on riesco a scaricarla!!
Come faccio????
Ciao 🙂 Se fai “Like” viene mostrata la URL per il download. Vedi un po’ se funziona, altrimenti posso rimuovere il costraint e fartela scaricare libera.
Si avevo già provato a fare like ma non viene visualizzato nulla 🙂
Ti ho inviato una mail con il link 🙂
Grazie mille!!!
cool!
thx 🙂
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?
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
Gentilissimo, mi hai risolto cmq il problema.
Di nulla 🙂
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
?
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.
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à
non riesco a scaricarla =(
Controlla la mail che hai usato per il commento 🙂
ty man =)
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?
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 🙂
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
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.
Salve non riesco a scaricare la libreria…
ci sono riuscito … cmq avrei una domanda … io dovrei costruirmi un URL come questo
http://maps.google.it/maps?saddr=Via+Roma,+Palermo,+PA&daddr=Via+Aurelia,+Roma,+RM&ll=142.826354,346.289063&spn=0.00382,0.007983&t=m&geocode=FXijRQIdaebLACkf9cXc9OUZEzGjTrrAclVhvQ%3BFeQ4fwIdGWu9ACmVrM2Ta1QvEzEFiOdQuQTk&output=embed
ma come faccio a trovarmi il geocode?
Ciao Luca,
sarebbe davvero utile la tua libreria, ma non riesco a scaricarla, anche dopo aver fatto like!
Suggerimenti?
Ciao Paolo,
dopo aver fatto like dovrebbe apparire il link per scaricare il jar. Se hai problemi manda una mail a info@elbuild.it e te la inviamo direttamente.
Ciao ho provato a scaricare il jar, ma anche mettendo il like non viene visualizzato nulla.
potresti gentilmenti inviarli l’archivio?
grazie mille
Moise
scaricato. 🙂