用两条线切割一个多边形的多边形

Yux*_*ang 14 python shapely

我试图shapely.geometry.Polygon用两条线将一个实例分成两部分.例如,在下面的代码,polygon是一个环,如果我们用削减它line1line2我们应该得到两个局部环,一个W/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)])
Run Code Online (Sandbox Code Playgroud)

小智 9

从 1.6.0 版(2017 年 8 月)开始,Shapely 中有一个功能可以将一个几何体拆分为另一个几何体,因此不再需要滚动您自己的几何体。请参阅以下文档:shapely.ops.split(geom, splitter)

请注意,此线程上的较旧答案是拆分函数处于 Shapely之前编写的 - 它们现在实际上已过时。


Yux*_*ang 6

肯·沃特福德在这里回答关于使用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)
Run Code Online (Sandbox Code Playgroud)

现在工作,我有兴趣看看是否还有另一个(可能是失败的区域)方法!

  • 我认为任何确切的解决方案都需要从头开始实现数学问题,并使用大量代码.特别是在一般术语中,您正在设置问题. (2认同)

Mar*_*oma 5

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]))
Run Code Online (Sandbox Code Playgroud)

结果是

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

在此输入图像描述