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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top