【问题标题】:Search bounding rectangles (axis aligned) for a given query point in 2 dimensions在二维中搜索给定查询点的边界矩形(轴对齐)
【发布时间】:2014-12-15 06:50:20
【问题描述】:

我有一组很多轴对齐的矩形,它们可能是嵌套的和相交的。我希望能够找到包围/绑定查询点的所有矩形。什么是一个好的方法? 编辑:附加信息-
1. 我的意思是大约 1 亿或更多。
2.矩形分布在一个巨大的跨度(一个国家的跨度)上。尺寸没有限制。
3. 是的,矩形可以被预处理并存储在树形结构中。
4.不需要实时插入和删除。
5. 我只需要找到所有包围/包围给定查询点的矩形。我不需要最近邻。

您可能已经猜到了,这是针对移动设备上的实时地理围栏应用程序,因此 -
6. 不需要对离点足够远的矩形重复搜索。

我通过将每个矩形逼近一个点来尝试 KD 树和四叉树。根据矩形的大小,他们给了我可变的性能。 有没有更直接的方法? r 树呢?

【问题讨论】:

  • “非常多”是多少?您可以对矩形进行预处理以构建用于查询的数据结构吗?您会针对同一组矩形检查多个点吗?在任何情况下,您都可以从幼稚的方法开始。它很可能对您的目的来说足够快,如果不是,那么至少您有一个已知的工作算法,您可以根据该算法测试您的优化。
  • 嗨,吉姆,您的幼稚方法到底是什么意思?另外,我已经编辑了问题以使其更清楚。
  • 我猜你所拥有的矩形是事先知道的,它们不太可能“移动”、“缩小”或“跨度”。如果我是正确的,那么您应该考虑批量加载的 R-tree(或其变体)。
  • 天真的方法是顺序搜索整个列表,这对于一亿个矩形的列表显然是不切实际的。

标签: algorithm data-structures geospatial spatial-index


【解决方案1】:

我会考虑使用四叉树。 (从手机发帖,所以链接起来太费力了,但维基百科有一个不错的解释。)您可以在任何矩形的左、右、上和下边界处拆分,并将每个矩形存储在代表最小区域的节点中包含矩形。要搜索一个点,您可以沿着四叉树向下移动到该点并检查沿该路径遇到的每个矩形。

这适用于小矩形,但如果许多矩形几乎覆盖了整个区域,您仍然需要检查所有这些。

【讨论】:

  • kd-tree 和 r-trees 怎么样?
  • 这两种方法也可以。 R-trees 可能会付出更多努力以获得更好的性能,这两种效果都是由于分页造成的;这可能取决于实际的工作量,因此您必须同时实现两者才能确定。 Kd-trees(对于 K=2)与我期望的四叉树非常相似。
  • @Erik ,我也有类似的想法。你建议我如何选择分裂平面?另外,如何处理相交和嵌套的矩形?
  • 作为第一次尝试,您可以获取所有顶部和底部边界的集合并在其中位数处拆分。水平分割也一样。这定义了一个矩形树,树的每个节点一个。这些矩形与您存储的矩形不同!如果您将每个矩形存储在对应的树矩形包含它的最底部节点中,则嵌套和重叠会自动起作用。
  • @ Erik - 我决定暂时试用 R* 树。不过,我将在不久的将来尝试使用 KD 树来有效地存储和搜索矩形。当我这样做时,我会发布更新。
【解决方案2】:

您需要查看 R*-tree 数据结构。

与许多其他结构相比,R*-tree 能够很好地存储(重叠)矩形。它限于点数据。在将多边形放入索引之前,您也可以找到许多关于如何最好地近似多边形的出版物。此外,它还可以扩展到非常大的数据,因为它也可以在磁盘上运行。

批量加载时,R*-trees 更快;因为这可用于减少索引页面的重叠并确保近乎完美的平衡树,而动态插入仅保证每个页面至少半满左右。 IE。批量加载的树通常只使用一半的内存/存储空间。

对于二维数据和您的查询类型,四叉树或 网格 可能就足够了。这取决于本地数据密度的变化程度。

【讨论】:

  • 我将尝试使用 BOOST 库来尝试 R* TREES。
  • 我知道在 R 树中搜索必须是一个查询框,但是,我想搜索所有必须包含给定查询点的矩形。这可能吗?使查询矩形成为一个点(通过使其足够小)会产生所需的结果吗?
  • 您可以执行各种搜索,包括最近的邻居、重叠、包含等 - 在您的情况下,我猜您希望与查询点重叠。跨度>
  • 好吧,如果这是可能的,那我就不用再看了。我将深入研究它。感谢您为我指明正确的方向。
  • 我在获取有关 BOOST Rtree 实现的良好文档时遇到了一些麻烦。官方文档特别缺乏空间索引。有什么有用的吗?
猜你喜欢
  • 2010-10-11
  • 2011-08-25
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
相关资源
最近更新 更多