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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top