So erstellen Sie einen Shapely LineString aus zwei Punkten

11

Wenn Sie zwei Punkte haben, aus denen ich ein gerades LineStringObjekt erstellen möchte :

from shapely.geometry import Point, LineString
A = Point(0,0)
B = Point(1,1)

Das Shapely-Handbuch fürLineString Staaten:

Eine Folge von PointInstanzen ist kein gültiger Konstruktorparameter. A LineStringwird durch Punkte beschrieben, besteht jedoch nicht aus Punktinstanzen.

Wenn ich also zwei Punkte habe Aund B, gibt es eine kürzere / bessere / einfachere Möglichkeit, eine Linie zu erstellen ABals meine derzeitige "beste" Vermutung ...

AB = LineString(tuple(A.coords) + tuple(B.coords))

... was ziemlich kompliziert aussieht. Gibt es einen einfacheren Weg?

Aktualisieren

Mit dem heute veröffentlichten Shapely 1.3.2 ist die obige Aussage aus dem Handbuch nicht mehr korrekt. Also von nun an,

AB = LineString([A, B])

funktioniert !

ojdo
quelle

Antworten:

9

Seit Shapely 1.3 können Sie einen LineString aus Punkten erstellen:

>>> from shapely.geometry import Point, LineString
>>> LineString([Point(0, 0), Point(1, 1)]).wkt
'LINESTRING (0 0, 1 1)'

Entschuldigung für den Widerspruch im Handbuch.

sgillies
quelle
Auf zwei Computern (einem Linux- und einem Windows- shapely.__version__Computer) erhalte ich nach dem Upgrade auf Shapely 1.3.1 ( zustimmend) und dem wörtlichen Einfügen Ihres Codes von linestring.pyc # 228 einen ValueError über "Eingabe [<...Point object at 0x..>, <...Point object at 0x...>]ist die falsche Form für einen LineString". Habe ich etwas verpasst
Ojdo
Update: Die entsprechende Pull-Anfrage # 102 befindet sich nur im Master, ist noch nicht mit Zweig 1.3 zusammengeführt und daher in der aktuellen Version 1.3.1 nicht vorhanden.
Ojdo
Du hast recht. Ich habe dies gerade in github.com/Toblerity/Shapely/issues/130 behoben und 1.3.2 auf PyPI hochgeladen.
Sgillies
Überprüfen Sie, es funktioniert jetzt; danke (nochmal) für das schnelle Follow-up!
Ojdo
3

Die Basismethode ist:

AB = LineString([(A.x,A.y), (B.x,B.y)])

Sie können die Koordinatenlisten auch mit Slicing verketten:

AB = LineString(A.coords[:] + B.coords[:])
Gen
quelle