簡體   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