web-dev-qa-db-ja.com

Shapelyで2本の線でポリゴンをカットします

shapely.geometry.Polygonインスタンスを2行で2つの部分に分割しようとしています。たとえば、以下のコードでは、polygonはリングであり、line1line2でカットすると、2つの部分的なリングが得られます。1つは270度、もう1つは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)])
14
Yuxiang Wang

バージョン1.6.0(2017年8月)以降、Shapelyには、あるジオメトリを別のジオメトリに分割する機能があるため、独自のジオメトリをロールする必要はありません。以下のドキュメントを参照してください: shapely.ops.split(geom、splitter)

このスレッドで受け入れられた回答はbeforeに書かれていたことに注意してください。分割関数はShapelyにありましたが、現在は事実上廃止されています。

2
Keith Ma

Ken Watfordは、 ここ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)

今のところうまくいきます、そして私は別の(潜在的に失われた領域がない)方法があるかどうかを見たいと思います!

7
Yuxiang Wang
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)

enter image description here

2
Martin Thoma