Sobreposição de polígono com Shapely

15

Estou tentando capturar todos os polígonos não sobrepostos indicados abaixo usando Shapely (dados polígonos A, B e C). Além disso, espero fazê-lo sem iteração, teste de interseção etc. A resposta aceita a essa pergunta expressa o método PostGIS, mas parece que 'união' significa coisas diferentes para pessoas diferentes.

sobreposição de polígono

valveLondon
fonte

Respostas:

21

Você precisa iterar em algum nível. ( Atualização : editei para remover todos os loops "for", exceto o entendimento de uma lista )

# 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]

Primeiro, você precisa da união de todas as interseções (use uma união em cascata ), usando o par de combinação de cada forma. Em seguida, você remove (via difference) as interseções da união de todas as formas.

# 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)

Aqui está o que nonoverlapparece (via JTS Test Builder): não sobrepor

Mike T
fonte
1

Depois de alguns anos, parece haver uma solução melhor por meio de 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))))

Ele suporta qualquer comprimento de geometria, o único problema é o tempo de cálculo e não suporta polígonos com furos.

Deo Leung
fonte
Por curiosidade, por que você acha que sua solução é melhor que a do @MikeT? Só posso ler sobre um problema em termos de tempo de cálculo.
MGRI