Pergunta

Eu tenho uma lista de polígonos bem torneados em Python. Para descobrir qual toque de polígono é fácil, usando o .touches() método. No entanto, eu preciso de algo que retorne True Somente quando os polígonos compartilham mais do que um ponto (em outras palavras compartilha uma fronteira). Deixe -me ilustrar:

In [1]: from shapely.geometry import Polygon
In [2]: polygons = [Polygon([(0,0),(0,1),(1,1),(1,0)]), Polygon([(1,0),(1,1),(2,1),(2,0)]), Polygon([(2,1),(2,2),(3,2),(3,1)])]

In [3]: polygons[0].touches(polygons[1])
Out[3]: True

In [4]: polygons[0].touches(polygons[2])
Out[4]: False

In [5]: polygons[1].touches(polygons[2])
Out[5]: True

Nesse caso, o Polygon 0 e 1 compartilha dois pontos (uma fronteira inteira). O polígono 1 e 2 compartilha apenas um ponto. O que estou procurando é uma função que me daria True, False, False No exemplo acima ou apenas algo que retorna o número de pontos de toque, então eu posso fazer o resto da lógica.

E, é claro, qualquer solução que não envolva manualmente itera em todos os pontos é ideal - se eu precisar fazer isso, isso meio que derrota o objetivo de usar bem torneadamente :-)

Foi útil?

Solução

Eu não usei bem torneadamente, mas você tentou ver se a interseção dos dois polígonos é uma linha?

Outras dicas

Se você realmente deseja verificar se dois polígonos compartilham mais de x número de pontos, você pode simplesmente fazer isso:

p0,p1,p2 = polygons
x = 2
len(set(p1.boundary.coords).intersection(p2.boundary.coords))>=x

Mas acho que o que você deseja é determinar se duas arestas são colineares (e sobrepostas).

Esta implementação das sugestões de Andrew é provavelmente o que você está procurando:

>>> type(p0.intersection(p1)) is geometry.LineString
True
>>> type(p1.intersection(p2)) is geometry.LineString
False
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top