簡體   English   中英

在 Shapely 中用兩條線切割一個多邊形

[英]Cut a polygon with two lines in Shapely

我試圖用兩條線將shapely.geometry.Polygon實例分成兩部分。 例如,在下面的代碼中, polygon是一個環,如果我們用line1line2切割它,我們應該得到兩個部分環,一個是 270 度,一個是 90 度。 有沒有一種干凈的方法來做到這一點?

from shapely.geometry import Point, LineString, Polygon

polygon = Point(0, 0).buffer(2).difference(Point(0, 0).buffer(1))
line1 = LineString([(0, 0), (3, 3)])
line2 = LineString([(0, 0), (3, -3)])

從 1.6.0 版(2017 年 8 月)開始,Shapely 中有一個功能可以將一個幾何體拆分為另一個幾何體,因此不再需要滾動您自己的幾何體。 請參閱文檔: shapely.ops.split(geom, splitter)

請注意,此線程上的較舊答案是拆分函數處於 Shapely之前編寫的 - 它們現在實際上已過時。

肯沃特福德在這里回答關於使用bufferdifference來解決問題的問題,但缺點是會損失一點區域。 下面的示例代碼:

from shapely.geometry import Point, LineString, Polygon

polygon = Point(0, 0).buffer(2).difference(Point(0, 0).buffer(1))
line1 = LineString([(0, 0), (3, 3)])
line2 = LineString([(0, 0), (3, -3)])

line1_pol = line1.buffer(1e-3)
line2_pol = line2.buffer(1e-3)

new_polygon = polygon.difference(line1_pol).difference(line2_pol)

現在有效,我很想看看是否有另一種(可能沒有丟失區域)方法!

from shapely.ops import linemerge, unary_union, polygonize
from shapely.geometry import LineString, Polygon

# Define the Polygon and the cutting line
line = LineString([(-5, -5), (5, 5)])
polygon = Polygon([(-1, -1), (1, -1), (1, 1), (-1, 1)])


def cut_polygon_by_line(polygon, line):
    merged = linemerge([polygon.boundary, line])
    borders = unary_union(merged)
    polygons = polygonize(borders)
    return list(polygons)

def plot(shapely_objects, figure_path='fig.png'):
    from matplotlib import pyplot as plt
    import geopandas as gpd
    boundary = gpd.GeoSeries(shapely_objects)
    boundary.plot(color=['red', 'green', 'blue', 'yellow', 'yellow'])
    plt.savefig(figure_path)

result = cut_polygon_by_line(polygon, line)
print(result)
plot(result)
print(result[0].intersection(result[1]))

結果是

[<shapely.geometry.polygon.Polygon object at 0x7f50dcf46d68>, 
 <shapely.geometry.polygon.Polygon object at 0x7f50dcf46da0>]
LINESTRING (-1 -1, 1 1)

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM