6

Ho visto molte cosiddette librerie "reverse geocoding" in varie lingue; tutto dipende dalla chiamata di un fornitore esterno tramite REST o un metodo simile. Tuttavia, non è possibile chiamare un provider REST se è necessario gestire migliaia di richieste al secondo.Esiste una libreria Java esistente che consente di eseguire ricerche veloci in memoria di codici di avviamento postale (bonus, stato e città) da latitudine/longitudine?

D'altra parte, il problema dovrebbe essere semplice da risolvere - basi di dati CSV-based sono disponibili gratuitamente con queste informazioni. Il problema è il tempo e il costo di scrivere un'implementazione di ricerca in-memory efficiente e ben collaudata, rispetto al download o all'acquisto di uno esistente.

Non riesco a trovarlo dopo un sacco di sguardi, ma non posso credere che non ce ne possa essere uno. C'è qualche biblioteca pre-scritta che fa questo?

Questa domanda:

Fastest way to find the location(zip, city, state) given latitude/longitude

è venuto il più vicino, ma indica essenzialmente come scrivere la soluzione, non che ci sia qualcosa a disposizione dallo scaffale. Ma ci deve essere una libreria che tutti usano per questo. Una dozzina di persone al giorno deve avere questo problema.

+0

@birryree, i commenti sono per i commenti. Se si desidera contrassegnare la domanda, utilizzare la funzione di domanda preferita (fare clic sulla stella). –

risposta

3

database spaziali (ad esempio PostgreSQL PostGIS) utilizzano algoritmi che sono veloci nel cercare i dati per data di latitudine/longitudine. Poiché si desidera utilizzare una libreria Java e averla in memoria, è possibile consultare H2 Spatial database. Non l'ho mai usato, quindi non posso commentare le sue prestazioni.

Edit: Hm, guardando più da vicino il link che ho fornito dimostra che questa è una caratteristica pianificato ... Personalmente mi piacerebbe semplicemente usare PostgreSQL/PostGIS (con o senza Java come frontend server) e da fare con esso . Se il tuo server ha abbastanza memoria, si adatterà comunque al requisito "in memoria". Naturalmente non si adatta ai requisiti della libreria Java. C'è comunque JSI, che potrebbe essere usato in memoria e con Java.

+0

L'impostazione e il mantenimento di postgres solo per risolvere questo problema sarebbe impossibile nella mia situazione. :( JSI sembra molto promettente! Che tutti hanno sono elenchi liberamente disponibili su CAP/città/stato/etc. Con le loro lunghe coordinate lat /, invece di rettangoli, così point-to-point, piuttosto che point-to-rettangolo di ricerca non è proprio appropriato, potrebbe essere adattabile ... ma ancora ... dovendo adattare una cosa del genere, facendo migliaia di piccoli rettangoli? Non c'è davvero nessuna soluzione preconfezionata disponibile sul mercato? Sono sbalordito che né io (né apparentemente chiunque altro) può trovarne uno –

+1

Bene, la libreria JSI funziona perfettamente con i punti, basta usare un rettangolo di dimensione zero (cioè impostato minY = maxY e minX = maxX). In realtà era originariamente previsto per aggiungere il supporto 'nativo' per i punti, ma le prestazioni sono state abbastanza buone usando rettangoli che non sono mai stati necessari – Aled

+0

grazie per avermi indirizzato a JSI. Puoi anche cercare quadtree o rtree e java. + Ho lavorato un po 'ma ora so che avrebbe potuto fare meglio e non aveva ancora il tempo di implementare questi trucchi: https://karussell.wordpress.com/2012/05/29/tricks-to-speed-up-neighbor-searches-of-quadtrees-geo-spatial -Giava/ – Karussell