快点指数 - (> 100.000.000)-in-polygon - (> 10.000) - 测试

时间:2014-09-02 14:31:19

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

问题

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

我可以使用R-Tree索引所有多边形,这样我就只能检查其边界框被击中的多边形。

可能的新问题

当多边形相互接触时(想想行政边界),在多个多边形的边界框中有许多点,因此迫使许多点多边形测试。

问题

你有没有比使用R-Tree更好的建议?

2 个答案:

答案 0 :(得分:1)

Quad-Trees可能比光栅化工作更糟糕 - 它们本质上是对2x2图像的重复光栅化......但绝对利用所有简单情况的光栅化,因为测试栅格应该一样快因为它得到了。如果你能轻松解决90%的积分,那么剩下的就有更多的时间了。

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

R * -trees可能是一件好事,但你需要真正仔细地实现它们。

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

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

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

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

有关更多详细信息,请搜索 r-tree空间连接

答案 1 :(得分:0)

尝试使用四叉树。

基本上你可以将分段空间递归到4个部分,然后对于你应该知道的每个部分: a)多边形是给定部分的超集 b)与给定部分相交的多边形

这给出了一些你可能不满意的O(log n)开销因子。

另一种选择是使用网格来分配空间。您应该保留与上述情况相同的信息或网格的每个部分。这只会有一些不断的开销。

这两个选项都假定多边形的分布在某种程度上是一致的。

如果您可以离线处理点(换句话说,您可以选择点的处理顺序),还有另一个选项。然后,您可以使用一些扫描线技术,您可以按一个坐标对点进行排序,在此排序顺序中迭代点,并在迭代期间仅维护一组有趣的多边形。