답변:
어떤 수준에서 반복해야합니다. ( 업데이트 : 하나의 목록 이해를 제외하고 모든 "for"루프를 제거하도록 편집했습니다. )
# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import cascaded_union
from itertools import combinations
# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)
# list the shapes so they are iterable
shapes = [A, B, C]
먼저 각 모양 의 조합 쌍을 사용하여 모든 교차점의 결합이 필요합니다 ( 연쇄 결합 사용 ) . 그런 다음 모든 모양의 합집합에서 교차점 을 제거합니다 ( ).difference
# All intersections
inter = cascaded_union([pair[0].intersection(pair[1]) for pair in combinations(shapes, 2)])
# Remove from union of all shapes
nonoverlap = cascaded_union(shapes).difference(inter)
다음은 nonoverlap
JTS Test Builder를 통한 모습입니다.
몇 년 후 다음을 통해 더 나은 해결책이있는 것 같습니다 shapely
.
# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import polygonize, unary_union
# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)
...
# list the shapes so they are iterable
shapes = [A, B, C, ...]
# generate the overlay
list(polygonize(unary_union(list(x.exterior for x in shapes))))
모든 형상을 지원하며 계산 시간에 관한 유일한 문제이며 구멍이있는 다각형을 지원하지 않습니다.