2009-12-25 10 views
5

Tengo una lista de polígonos bien formados en Python. Para saber qué polígono táctil es fácil, utilice el método .touches(). Sin embargo, necesito algo que devuelva verdadero solo cuando los polígonos compartan más que un punto (en otras palabras, comparte un borde). Permítanme ilustrar:Polígono toca en más de un punto con shapely

IPython 0.10 -- An enhanced Interactive Python. 

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). Los polígonos 1 y 2 solo comparten 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 puntos de contacto, luego puedo hacer el resto de la lógica yo mismo.

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 usar :-) bien formada

Gracias de antemano!

+1

compartir dos puntos no es equivalente a que comparten una frontera - es sólo cierto si los puntos son adyacentes en ambos polígonos. –

+0

@andrew cooke: Buen punto. Tendré que considerar eso. – XerXes

Respuesta

4

no he usado bien, pero ¿ha intentado ver si la intersección de los dos polígonos es una línea?

+0

una línea, o un polígono. –

+0

Eso es exactamente lo que necesitaba. Tonta, no pensé en eso :-) – XerXes

3

Si realmente se 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 

Pero creo que lo que es posible que desee es 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 
+0

Gracias :-) Lo deduje de la publicación de Andrew, pero no he podido responder. Pero gracias un montón de todos modos :-) – XerXes

+2

Sólo para el registro (podría ayudar a alguien más): Debe comprobar la geometría.MultiLineString, no geometry.LineString – XerXes

Cuestiones relacionadas