2011-09-15 11 views
13

Ho bisogno di un'implementazione commerciale (licenza Apache, LGPL, Mozilla Public License ecc.) R-tree in Java, al fine di sostituire il servizio Web geonames per i fusi orari, come suggerito nella domanda "Determine timezone from latitude/longitude without using web services like Geonames.org". Ho foundsomearound, ma mi chiedevo se qualcuno li ha valutati o usati nella pratica.Implementazione Java R-tree commerciale-friendly?

+1

Puoi approfondire ciò che è accettabile come "commerciale-friendly"? – trashgod

+2

Java Topology Suite (JTS) di Vivid Solutions con licenza LGPL contiene un'implementazione R-Tree. Ho usato con successo JTS nelle mie applicazioni ma non l'implementazione R-Tree di JTS. Vedere http://www.vividsolutions.com/jts/javadoc/com/vividsolutions/jts/index/strtree/STRtree.html –

+2

Non direttamente un'implementazione R-tree, ma le versioni recenti di Apache Lucene supportano ricerche geospaziali efficienti. Vedi per esempio http://www.ibm.com/developerworks/opensource/library/j-spatial/ per maggiori dettagli. –

risposta

2

Prima di tutto vorrei far notare che se si cercherà la città più vicina dalle coordinate date, potrebbe non essere nello stesso fuso orario! Ciò di cui hai veramente bisogno, secondo me, è un'informazione relativa all'affiliazione amministrativa - il minimo sarebbe un paese, ma in alcuni casi dovrebbe essere anche più di questo, cioè lo stato. Queste informazioni possono essere recuperate con l'API di Google Maps e quindi correlate ad alcune informazioni TZ più dettagliate.

c'è un'alternativa gratuita a GeoNames - EarthTools. Ci sono alcune limitazioni al servizio stesso (numero di richieste, ecc.), Ma comunque è buono, testato e funziona bene per me.

In secondo luogo, esiste un'alternativa gratuita a GeoNames - EarthTools. Ci sono alcune limitazioni al servizio stesso (numero di richieste, ecc.), Ma comunque è buono, testato e funziona bene per me.

In terzo luogo, se si desidera importare i dati in DB, la maggior parte delle attuali implementazioni DB fornisce indici geo spaziali che è possibile utilizzare. Se hai bisogno di tali informazioni incorporate nella tua applicazione, puoi utilizzare H2Database (embeded Java DB) con l'aggiunta H2Spatial - sebbene l'abbia provato e non posso raccomandarlo completamente. Neo4j ha una grande implementazione dell'indice spaziale

Inoltre è possibile utilizzare Solr per GeoSpatial searches. È bello, è veloce ed è facile da implementare. In realtà sono nel bel mezzo del processo di migrazione ricerche DB per Solr ...

Ultimo, ma non meno importante, qui di seguito troverete alcuni di quelli che ho provato un po 'indietro:

  • JSI - LGPL
  • GeoTools - LGPL, un peso inutile, vi darà molto più di quello che ti serve ... ma è grande!

Forse qualcuno in più lì, ma quelli che ho provato fino ad ora ...

+0

Grazie per la risposta. Ho trovato EarthTools mentre stavo ricercando, ma ciò che mi ha scoraggiato è stato che "L'utilizzo di questi servizi è * attualmente * gratuito". Questo è stato un ostacolo per me, poiché avevo bisogno di sapere che la soluzione resterà libera a tempo indeterminato. –

+0

Vorrei andare con Solr o GeoTools quindi - entrambi sono semplicemente fantastici. –

13
0

R-tree semplice classe Java creato da me: https://github.com/hadmir/rtree/blob/master/RTree.java

tutti gli oggetti vengono memorizzati all'interno di due [] array di int, quindi è veramente facile da persistere (file). Inoltre, il fatto che aggiungere nuovi rects non crei alcun oggetto significa che è possibile inserire milioni di rettangoli in RTree e JVM non brucerà in fiamme. Questo è utile per i progetti geografici, dove i conteggi degli oggetti sono solitamente enormi.

Vengono memorizzati solo rettangoli 2D (quindi, per oggetti complessi è necessario trovare il rettangolo di delimitazione). Query restituisce tutti i rects (ID di rects) che si intersecano o si sovrappongono a "query rectangle".