매끈한 다각형 오버레이


15

Shapely (주어진 다각형 A, B & C)를 사용하여 아래에 표시된 겹치지 않는 모든 다각형을 캡처하려고합니다. 또한 반복, 교차 테스트 등을 반복하지 않기를 바라고 있습니다. 질문에 대한 대답 은 PostGIS 방법을 나타내지 만 '연합'은 사람들마다 다른 것을 의미하는 것 같습니다.

다각형 오버레이

답변:


21

어떤 수준에서 반복해야합니다. ( 업데이트 : 하나의 목록 이해를 제외하고 모든 "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)

다음은 nonoverlapJTS Test Builder를 통한 모습입니다. 겹치지 않는


1

몇 년 후 다음을 통해 더 나은 해결책이있는 것 같습니다 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))))

모든 형상을 지원하며 계산 시간에 관한 유일한 문제이며 구멍이있는 다각형을 지원하지 않습니다.


호기심 때문에 왜 @MikeT의 솔루션보다 솔루션이 더 낫다고 생각하십니까? 계산 시간 측면에서 문제에 대해서만 읽을 수 있습니다.
mgri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.