快速检查多边形是否在数据框之间包含点

时间:2019-08-21 10:55:59

标签: pandas performance dataframe polygon contains

我有两个数据框。其中包含一列多边形,取自多边形形状的图像。每个多边形都有一组坐标。该数据框还具有“段ID”列。我有另一个数据框,其中包含一列“点”,也带有坐标。这些点表示来自多边形形状相同图像的像素,因此具有相同的坐标系。我想给每个点一个包含它的多边形的“ segment-id”。每个多边形至少包含一个点。

当前,我通过使用嵌套的for循环来实现:

<fx:factory>

这非常慢。每100点,大约需要10秒钟。我需要一种更快的方法。我尝试使用Apply,但是它仍然超级慢。

希望有人能帮助我,非常感谢。

1 个答案:

答案 0 :(得分:0)

对于快速的“在多边形内部是点”:

准备工作:在获取描述多边形数据的代码中;使用所有顶点,找到最小和最大y坐标,以及最小和最大x坐标;并将其与多边形的数据一起存储。

1)使用点的坐标和多边形的“最小和最大x和y”(在准备过程中预先确定);做一个“边界框”测试。这只是一种确定该点是否绝对不在多边形内的快速方法(因此您通常可以跳过更昂贵的步骤)。

2)将“是/否”标志设置为“否”

3)对于多边形中的每个边;确定通过该点的水平线是否与边相交,以及是否确定相交的x坐标。如果相交的x坐标小于点的x坐标,请切换(带有NOT)“ yes / no”标志。在此步骤中,请忽略“水平线穿过顶点”。

4)对于每个顶点,将其y坐标与点的y坐标进行比较。如果它们相同,则需要查看来自该顶点的两条边,以确定该边的顶点是否在相同的y方向上。如果边缘的顶点在相同的y方向上(如果边缘形成“ V”形或上下颠倒的“ V”形),则忽略该顶点。否则(如果边缘形成'<'或'>'形状),如果顶点的x坐标小于点的x坐标,请切换“是/否”标志。

所有这些都完成之后; “是/否”标志会告诉您该点是否在多边形中。