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