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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top