[英]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.