Polígono toca en más de un punto con bien proporcionado
Pregunta
Tengo una lista de polígonos bien proporcionadas en Python. Para averiguar qué contacto polígono es fácil, utilizando el método .touches()
. Sin embargo, necesito algo que devuelve True
sólo cuando los polígonos comparten más de un punto (en otras palabras, comparte una frontera). Permítanme 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
En este caso, polígono 0 y 1 comparte dos puntos (una frontera entera). Polígono 1 y 2 sólo comparte un punto. Lo que estoy buscando es una función que me daría True
, False
, False
en el ejemplo anterior o simplemente algo que devuelve el número de punto de tocar, entonces puedo hacer el resto de la lógica misma.
Y, por supuesto, cualquier solución que no implique manualmente iteración a través de todos los puntos es óptima - si necesito hacer eso, que tipo de derrota el propósito de utilizar bien proporcionada: -)
Solución
No he utilizado bien formada, pero ¿ha tratado de ver si la intersección de los dos polígonos es una línea?
Otros consejos
Si realmente quiere comprobar si dos polígonos comparten más de x número de puntos que puede simplemente hacer esto:
p0,p1,p2 = polygons
x = 2
len(set(p1.boundary.coords).intersection(p2.boundary.coords))>=x
Sin embargo, creo que lo que es posible que desee es para determinar si dos bordes son colineales (y superposición).
Esta aplicación de las sugerencias de Andrew es probablemente lo que busca:
>>> type(p0.intersection(p1)) is geometry.LineString
True
>>> type(p1.intersection(p2)) is geometry.LineString
False