繁体   English   中英

我可以在一个匀称的多边形中设置点的顺序吗?

[英]Can I set the order of points in a shapely Polygon?

我有一组Polygon对象,需要以可重复的方式遍历它们的每个边缘。 我的首选方法是逆时针从最近点到边界框的左下角。

我可以通过以下方式确保多边形点是逆时针的:

polygon = shapely.geometry.polygon.orient(polygon)

我可以使用以下方法找到我想要的起点:

polygon = shapely.geometry.Polygon(...)
lower_left = shapely.geometry.Point(bbox[:2])
nearest_pt = min(self.polygon.exterior.coords, 
                  key=lambda x: shapely.geometry.Point(x).distance(lower_left))

我的问题是如何使Polygon对象的LinearRing从那个角开始?

这有效,但可能效率不高。

perimeter = polygon.exterior.coords
new_coords = []
first_vertex = nearest_pt  # as found in the question above
two_tours = itertools.chain(perimeter, perimeter)
for v in two_tours:
    if shapely.geometry.Point(v) == first_vertex:
        new_coords.append(v)
        while len(new_coords) < len(perimeter):
            new_coords.append(two_tours.next())
        break
polygon = shapely.geometry.Polygon(new_coords)

Jamie Bull 的答案有效,但有一点缺陷。 因为 itertools.chain 需要两倍的坐标序列,因此多边形的重复点最终会出现在“two_tours”中四次。

示例:周长 = polygon.exterior.coords.xy print(perimeter)

[[0, 1], [0, 0], [1, 0], [0, 1]]

two_tours = itertools.chain(周长,周长)打印(two_tours)

[[0, 1], [0, 0], [1, 0], [0, 1], [0, 1], [0, 0], [1, 0], [0, 1]]

如您所见, [0, 1] 现在在列表中间重复了两次。 这弄乱了顺序。

为了解决这个问题,将这一行替换为 two_tours = itertools.chain(perimeter[:-1], perimeter)

这将删除第一个周长的最后一个坐标,使其变为: print(two_tours)

[[0, 1], [0, 0], [1, 0], [0, 1], [0, 0], [1, 0], [0, 1]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM