应用shapely.simplify后如何获得多边形的原始索引?

问题描述 投票:0回答:1

这个Python脚本:

from shapely import simplify, points, contains, Point

circle = Point(0, 0).buffer(1.0, quad_segs=8).exterior
simple = simplify(circle, 0.1)

简化多边形

circle
(红色)并生成具有
simple
顶点子集的多边形
circle
(蓝色):

enter image description here

iCircle
包含
simple
顶点的原始索引:
[0, 4, 8, 12, 16, 20, 24, 28, 32]
:

iCircle = []

for i, p in enumerate(points(circle.coords)):
  if contains(simple, p):
    iCircle.append(i) 

如何计算它而不需要像上面那样进行昂贵的查找?

python shapely simplify
1个回答
0
投票

鉴于 Shapely 使用 Douglas-Peucker 算法进行几何平滑,您本质上是在问如何确定它将针对特定距离参数(epsilon)保留哪些顶点,或 Shapely 所说的“容差”。

如果您只看一个圆,则由于圆是完全规则的,因此每个下一个顶点将与前一个顶点保持恒定的索引距离。这里有一个不错的算法解释,但是对于一个圆来说,事情被大大简化了。

因此,您可以只找到前两个的索引,其余的将随之而来。

但考虑到这些数字很少会非常大,并且 Shapely 使用 numpy

ndarray
作为
points()
的数据类型,您可以:

indices = np.where(np.in1d(points(circle.coords), points(simple.coords)))[0]
print(indices)

输出:

[ 0  4  8 12 16 20 24 28 32]

这也适用于您需要的其他形状。

© www.soinside.com 2019 - 2024. All rights reserved.