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 !

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.


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[:])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.