这个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
(蓝色):
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)
如何计算它而不需要像上面那样进行昂贵的查找?
鉴于 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]
这也适用于您需要的其他形状。