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



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

目前,我通过使用嵌套的 for 循环来实现这一点:

for i, row in enumerate(point_df.itertuples(), 0):
point = pixel_df.at[i, 'geometry']
for j in range(len(polygon_df)):
polygon = polygon_df.iat[j, 0]
if polygon.contains(point):
pixel_df.at[i, 'segment_id'] = polygon_df.at[j, 'segment_id']
else:
pass

这是非常慢的。对于 100 点,大约需要 10 秒。我需要一种更快的方法来做到这一点。我试过使用应用程序,但它仍然非常慢。

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

对于快速"是多边形内的点":

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

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

2( 将"是/否"标志设置为"否">

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

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

完成所有这些操作后,"是/否"标志将告诉您该点是否在多边形中。

最新更新