四叉树的工作可能比光栅化更糟糕——它们本质上是对 2x2 图像的重复光栅化......但绝对可以在所有简单的情况下利用光栅化,因为测试光栅应该尽可能快。如果你能轻松解决 90% 的问题,你就有更多的时间来解决剩下的问题。
还要确保首先删除重复项。索引经常出现重复,它们显然是多余的测试。
R*-trees 可能是一个很好的尝试,但你需要非常小心地实现它们。
您正在寻找的操作是包含空间连接。我不认为您可以使用任何实现 - 但是对于您的性能问题,无论如何我都会自己仔细实现它。还要确保调整参数并分析您的代码!
连接的基本思想是构建两棵树——一棵用于点,一棵用于多边形。然后从每棵树的根节点开始,递归地重复以下操作,直到叶级别:
- 如果一个是非目录节点:
- 如果两个节点不重叠:返回
- 通过启发式决定(您需要弄清楚这部分,“更大的扩展”可能会作为开始)要扩展哪个目录节点。
- 递归到每个新节点,加上另一个未打开的节点作为新对。
- 叶节点:
如果您对多边形进行快速内部测试,尤其是多边形中的矩形,您可以进一步加快这一速度。如果它是近似的,只要它是快的,它可能就足够了。
有关更多详细信息,请搜索r-tree spatial join。