algorithm - 快速点索引-(> 100.000.000)-in-polygon-(> 10.000)-test

标签 algorithm indexing spatial-index r-tree point-in-polygon

问题

我正在使用 openstreetmap-data 并想测试它们所在的多边形的点特征。总共有 10.000 个多边形和 100.000.000 个点。我可以将所有这些数据保存在内存中。多边形通常有 1000 个点,因此进行多边形中的点测试非常昂贵。

想法

我可以用 R 树索引所有多边形,这样我就可以只检查边界框被命中的多边形。

可能的新问题

由于多边形相互接触(想想​​行政边界),不止一个多边形的边界框内有很多点,因此需要进行很多点多边形测试。

问题

你有什么比使用 R-Tree 更好的建议吗?

最佳答案

四叉树的效果可能比光栅化差 - 它们本质上是对 2x2 图像的重复光栅化...但肯定会利用光栅化处理所有简单的情况,因为测试光栅应该一样快因为它得到。如果您可以轻松解决 90% 的问题,您就有更多时间处理剩余的问题。

还要确保首先删除重复项。索引经常出现重复,而且它们显然对测试来说是多余的。

R*-trees 可能是一个值得尝试的好东西,但你需要非常小心地实现它们。

您要查找的操作是包含空间连接。我不认为你可以使用任何实现 - 但对于你的性能问题,无论如何我都会自己仔细实现它。还要确保调整参数并分析您的代码!

连接的基本思想是构建两棵树——一棵用于点,一棵用于多边形。 然后从每棵树的根节点开始,递归地重复以下操作直到叶级:

  • 如果一个是非目录节点:
    • 如果两个节点不重叠:返回
    • 通过启发式方法(您需要弄清楚这部分,“更大的扩展”可能会作为开始)决定扩展哪个目录节点。
    • 递归到每个新节点,加上另一个未打开的节点作为新对。
  • 叶节点:
    • 快速测试点与多边形边界框
    • 多边形中的慢速测试点

如果您对多边形进行快速内部测试,尤其是多边形中的矩形,则可以进一步加速此过程。如果它是近似的,它可能就足够了,只要它很快。

有关更多详细信息,请搜索 r-tree spatial join

关于algorithm - 快速点索引-(> 100.000.000)-in-polygon-(> 10.000)-test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25625904/

相关文章:

C++优化函数调用批处理模式

python - 通过列表索引嵌套列表

c++ - 来自 vector C++ 中字节表示的 Int

SQL Server 索引/SQL 性能增强

python - 空间索引/查询(寻找k个最近点)

python - 在rtree中,如何指定 float 相等性测试的阈值?

c# - 如何对多个不同大小的矩形进行分类

android - 如何编写算法来查看目录是否包含 jpg 文件(子文件夹)

java - Tarjan 的循环检测 : missing cycles

python-2.7 - python 上的 libspatialindex 和 Rtree