Polygon berührt in mehr als einen Punkt mit Shapely
Frage
ich eine Liste von Shapely Polygone in Python haben. Um herauszufinden, welcher Polygon Touch ist einfach, mit der .touches()
Methode. Aber ich brauche etwas, dass die Renditen True
nur, wenn die Polygone Aktie mehr als einen Punkt (mit anderen Worten teilt sich eine Grenze). Lassen Sie mich erläutern:
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 diesem Fall Polygon 0 und 1 Aktie zwei Punkte (eine ganze Grenze). Polygon 1 und 2 teilen nur einen Punkt. Was ich suche ist eine Funktion, die ich geben würde True
, False
, False
im obigen Beispiel oder einfach nur etwas, dass die Zahl des Berührungspunktes zurückkehrt, dann kann ich den Rest der Logik selbst tun.
Und natürlich jede Lösung, die nicht manuell beinhalten alle Punkte Iterieren durch optimal ist - wenn ich das tun müssen, es ist eine Art von Niederlagen der Zweck Shapely der Verwendung: -)
Lösung
Ich habe nicht wohlgeformt, verwendet aber haben Sie versucht, zu sehen, ob der Schnittpunkt der beiden Polygone ist eine Linie?
Andere Tipps
Wenn Sie wirklich überprüfen möchten, ob zwei Polygone mehr teilen als x Anzahl der Punkte, die Sie dies einfach tun können:
p0,p1,p2 = polygons
x = 2
len(set(p1.boundary.coords).intersection(p2.boundary.coords))>=x
Aber ich denke, was Sie möchten, um zu bestimmen, ob zwei Kanten kollinear sind (und überlappend).
Diese Implementierung von Vorschlägen Andrews ist wahrscheinlich das, was Sie suchen:
>>> type(p0.intersection(p1)) is geometry.LineString
True
>>> type(p1.intersection(p2)) is geometry.LineString
False