Java商业友好的R-tree实现?

我需要Java中的商业友好(Apache许可证,LGPL,Mozilla公共许可证等) R-tree实现,以便将地理名称 Web Service替换为时区,如问题“在不使用Web的情况下从纬度/经度确定时区 ”中所建议的那样像Geonames.org这样的服务 “。 我找到了 一些 ,但我想知道是否有人在实践中评估或使用它们。

首先让我指出,如果您从给定坐标查找最近的城市,它可能不在同一时区! 在我看来,你真正需要的是关于它的行政隶属关系的信息 – 最小的是一个国家,但在某些情况下它应该更多,即国家。 可以使用Google Maps API检索该信息,然后将其与一些更详细的TZ信息相关联。

有一个免费的替代GeoNames – EarthTools 。 服务本身有一些限制(请求数量等),但它仍然很好,经过测试并且对我来说工作得很好。

其次 – GeoNames有一个免费的替代品 – EarthTools 。 服务本身有一些限制(请求数量等),但它仍然很好,经过测试并且对我来说工作得很好。

第三,如果您愿意将数据导入数据库,那么大多数当前的数据库实现都会提供您可以使用的地理空间索引。 如果您需要嵌入在您的应用程序中的信息,您可以使用H2Database(嵌入式Java DB)和H2Spatial添加 – 虽然我已经尝试过但我不能完全推荐它。 Neo4j具有很好的空间索引实现

此外,您可以使用Solr进行地理空间搜索 。 这很好,它很快,而且很容易实现。 我实际上正处于将数据库搜索迁移到Solr的过程中……

最后,但并非最不重要的是,下面你会发现我曾经测试过的一些:

  • JSI – LGPL
  • GeoTools – 一个矫枉过正的LGPL,会给你的远远超过你所需要的……但它太棒了!

可能还有一些,但到目前为止我测试过的……

我创建的RTree简单Java类: https : //github.com/hadmir/rtree/blob/master/RTree.java

所有对象都存储在两个int []数组中,因此很容易持久化(到文件)。 此外,添加新rects不会创建任何对象这一事实意味着您可以将数百万个矩形插入到RTree中,而JVM不会在火焰中燃烧。 这对于地理项目非常有用,因为对象计数通常很大。

仅存储2D矩形(因此,对于复杂对象,您需要找到边界矩形)。 查询返回与“查询矩形”相交或重叠的所有rects(rects的ID)。