Poligono tocca in più di un punto con Shapely
Domanda
Ho una lista di poligoni tornite in Python. Per scoprire quale tocco poligono è semplice, utilizzando il metodo .touches()
. Tuttavia, ho bisogno di qualcosa che ritorna True
solo quando i poligoni hanno più di un punto (in altre parole confina). Lasciatemi illustrare:
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
In questo caso, poligono 0 e 1 azioni due punti (un intero confine). Poligono 1 e 2 condivide un solo punto. Quello che sto cercando è una funzione che mi avrebbe dato True
, False
, False
nell'esempio di cui sopra o solo qualcosa che restituisce il numero di punto di contatto, quindi posso fare il resto della logica me stesso.
E, naturalmente, qualsiasi soluzione che non comporta manualmente scorrendo tutti i punti è ottimale - se ho bisogno di fare questo, tipo di sconfitte lo scopo di utilizzare Shapely: -)
Soluzione
Non ho usato formosa, ma hai provato a vedere se l'intersezione dei due poligoni è una linea?
Altri suggerimenti
Se veramente si vuole verificare se due poligoni hanno più di x numero di punti si può semplicemente fare questo:
p0,p1,p2 = polygons
x = 2
len(set(p1.boundary.coords).intersection(p2.boundary.coords))>=x
Ma penso che ciò che si può desiderare è quello di determinare se due bordi sono collineari (e sovrapposizione).
Questa implementazione di suggerimenti di Andrew è probabilmente quello che stai cercando:
>>> type(p0.intersection(p1)) is geometry.LineString
True
>>> type(p1.intersection(p2)) is geometry.LineString
False