我正在使用openstreetmap-data,并希望测试它们所在多边形的点要素。总共有10.000多个多边形和100.000.000个点。我可以将所有这些数据保存在内存中。多边形通常有1000个点,因此进行多边形点测试非常昂贵。
我可以使用R-Tree索引所有多边形,这样我就只能检查其边界框被击中的多边形。
当多边形相互接触时(想想行政边界),在多个多边形的边界框中有许多点,因此迫使许多点多边形测试。
你有没有比使用R-Tree更好的建议?
答案 0 :(得分:1)
Quad-Trees可能比光栅化工作更糟糕 - 它们本质上是对2x2图像的重复光栅化......但绝对利用所有简单情况的光栅化,因为测试栅格应该一样快因为它得到了。如果你能轻松解决90%的积分,那么剩下的就有更多的时间了。
还要确保首先删除重复项。索引经常会出现重复,而且它们显然是多余的。
R * -trees可能是一件好事,但你需要真正仔细地实现它们。
您要查找的操作是包含空间连接。我不认为你可以使用任何实现 - 但是对于你的性能问题,无论如何我都会自己仔细地实现它。还要确保调整参数和配置文件您的代码!
连接的基本思想是构建两个树 - 一个用于点,一个用于多边形。 然后从每个树的根节点开始,并以递归方式重复以下操作,直到叶级:
如果您对多边形进行快速内部测试,尤其是矩形多边形,则可以进一步加快此速度。只要速度很快,它就足够好了。
有关更多详细信息,请搜索 r-tree空间连接。
答案 1 :(得分:0)
尝试使用四叉树。
基本上你可以将分段空间递归到4个部分,然后对于你应该知道的每个部分: a)多边形是给定部分的超集 b)与给定部分相交的多边形
这给出了一些你可能不满意的O(log n)开销因子。
另一种选择是使用网格来分配空间。您应该保留与上述情况相同的信息或网格的每个部分。这只会有一些不断的开销。
这两个选项都假定多边形的分布在某种程度上是一致的。
如果您可以离线处理点(换句话说,您可以选择点的处理顺序),还有另一个选项。然后,您可以使用一些扫描线技术,您可以按一个坐标对点进行排序,在此排序顺序中迭代点,并在迭代期间仅维护一组有趣的多边形。