我需要在Java中实现商业友好(Apache许可证,LGPL,Mozilla公共许可证等)R-tree实现,以便将geonames Web服务替换为时区,如问题所示“ Determine timezone from latitude/longitude without using web services like Geonames.org”。我有found some around,但我想知道是否有人在实践中评估或使用过它们。
答案 0 :(得分:13)
https://github.com/rweeks/util/blob/master/src/com/newbrightidea/util/RTree.java - 由Russ Weeks实施的R-Tree的LGPL。它看起来非常简单明了,不依赖于外部库。
http://www.mischiefblog.com/?p=171 http://www.mischiefbox.com/blog/uploads/rtree.jar 由Chris Jones执行的R-Tree的LGPL。另一个简单明了的解决方案。
http://www.khelekore.org/prtree/ CPL 1.0实施优先级 R-Tree由Robert Olofsson
http://jsi.sourceforge.net/ LGPL - 项目旨在维护一个高性能Java版本的RTree空间索引算法。
答案 1 :(得分:2)
首先让我指出,如果您从给定坐标查找最近的城市,它可能不在同一时区!在我看来,你真正需要的是一个关于它的行政隶属关系的信息 - 最小的是一个国家,但在某些情况下它应该更多,即国家。可以使用Google Maps API检索该信息,然后将其与一些更详细的TZ信息相关联。
有一个免费的替代GeoNames - EarthTools。服务本身有一些限制(请求数量等),但它仍然很好,经过测试并且对我来说也很合适。
其次 - GeoNames有一个免费的替代品 - EarthTools。服务本身有一些限制(请求数量等),但它仍然很好,经过测试并且对我来说也很合适。
第三,如果您愿意将数据导入数据库,那么大多数当前的数据库实现都会提供您可以使用的地理空间索引。如果您需要嵌入在您的应用程序中的信息,您可以使用H2Database(嵌入式Java DB)并添加H2Spatial - 虽然我已经尝试过但我不能完全推荐它。 Neo4j具有很好的空间索引实现
此外,您可以Solr使用GeoSpatial searches。这很好,它很快,而且很容易实现。我实际上正处于将数据库搜索迁移到Solr ...
的过程中最后,但并非最不重要的是,在下面你会找到一些我曾经测试过的那些:
可能还有一些,但到目前为止我测试的那些......
答案 2 :(得分:0)
由我创建的RTree简单Java类: https://github.com/hadmir/rtree/blob/master/RTree.java
所有对象都存储在两个int []数组中,因此很容易持久化(到文件)。此外,添加新rects并不会创建任何对象这一事实意味着您可以将数百万个矩形插入到RTree中,而JVM不会在火焰中燃烧。这对于地理项目非常有用,因为对象计数通常很大。
仅存储2D矩形(因此,对于复杂对象,您需要找到边界矩形)。查询返回与"查询矩形"相交或重叠的所有rects(rects的ID)。