1

我正在尝试加入两个空间数据集。第一个包含点和第二个多边形。

但是,有些点在多边形之外。

有没有一种简单的方法可以将这些点连接/捕捉到最近的多边形边界,而不是最近的多边形质心?

目前我正在加入最近的多边形质心,但这不会产生我正在寻找的结果。

4

2 回答 2

1

您需要使用 sklearn 包之类的东西将所有点(不是多边形点放入 KD-Tree)。这个包包含一个有效的最近邻计算。在 Python 中,可以使用以下命令导入:

 import sklearn.neighbors as neighbors

如果您有大约 1000 万个多边形,则只需要 12 的树深度即可使其高效。你可以试验一下。如果少于 100,000,则 leaf_size=9 可能就足够了。将所有点(在一个数组中)放入树中的代码使用以下代码完成:

 tree = neighbors.KDTree( arrayOfPoints, leaf_size=12 )

然后遍历每个多边形和每个多边形中的各个点以找到最近的 5 个点(例如)。由于 KDTree 的性质,该算法可以非常快速地找到这些。蛮力比较可以慢 1000 倍(正如我发现的大量数据集)。

 shortestDistances, closestIndices = tree.query( pointInPolygon, k=5 )

您可能只需要最近的点,因此您可以设置 k=1 然后最接近的Indices[0] 是您想要的点列表中的实际数组索引。

于 2020-11-18T16:18:24.887 回答
0

这不是完整的答案,但您可以使用 shapely 检查点和多边形边界之间的距离:

from shapely.geometry import Point, Polygon
p = Point(0,0)
poly = Polygon([[1,0], [1,10], [10, 0]])
print(p.distance(poly))

编辑: 因此,如果您不使用大型数据集,则可以执行以下操作:

my_points = [...]
my_polys = [...]

dict_point_poly = {}
for point in my_points:
  try:
    intersecting_poly = [poly for poly in my_polys if 
point.intersects(poly)][0]
    this_poly = intersecting_poly
  except IndexError:
    distances = [(poly, point.distance(poly)) for poly in my_polys]
    distances.sort(key=lambda x:x[1])
    this_poly = distances[0][0]
  finally:
    dict_point_poly[point] = this_poly

(不是最有效的方法,但我认为是一种容易理解的方法)

于 2020-11-18T16:36:11.557 回答