Polígono toque em mais de um ponto com bem torneado
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 :-)
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