Jak utworzyć Shapely LineString z dwóch punktów

11

Jeśli mają dwa punkty, z których chcę utworzyć prosty LineStringobiekt:

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

Podręcznik Shapely dlaLineString stanów:

Sekwencja Pointinstancji nie jest poprawnym parametrem konstruktora. A LineStringjest opisany punktami, ale nie składa się z instancji Point.

Więc jeśli mam dwa punkty Ai Bczy istnieje krótszy / lepszy / łatwiejszy sposób tworzenia linii ABniż moje obecne „najlepsze” przypuszczenie ...

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

... co wydaje się dość skomplikowane. Czy istnieje prostszy sposób?

Aktualizacja

W dzisiejszym wydanym Shapely 1.3.2 powyższe stwierdzenie z instrukcji nie jest już poprawne. Więc od teraz

AB = LineString([A, B])

działa !

ojdo
źródło

Odpowiedzi:

9

Od Shapely 1.3 możesz tworzyć LineString z punktów:

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

Przepraszamy za sprzeczność w instrukcji.

sgillies
źródło
Na dwóch komputerach (jeden Linux, jeden Windows), po aktualizacji do Shapely 1.3.1 ( shapely.__version__zgadza się) i wklejeniu twojego kodu dosłownie, otrzymuję ValueError z linestring.pyc # 228 na temat „Dane wejściowe [<...Point object at 0x..>, <...Point object at 0x...>]mają niewłaściwy kształt dla LineString”. Czy coś przeoczyłem?
ojdo
Aktualizacja: odpowiednie żądanie ściągnięcia # 102 jest tylko w trybie głównym, nie zostało jeszcze scalone z gałęzią 1.3, a zatem nie występuje w bieżącej wersji 1.3.1.
ojdo
Masz rację. Właśnie to naprawiłem w github.com/Toblerity/Shapely/issues/130 i przesłałem 1.3.2 do PyPI.
sgillies
Sprawdź, teraz działa; dzięki (jeszcze raz) za szybkie kontynuowanie!
ojdo
3

Podstawową metodą jest:

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

Możesz także użyć wycinania, aby połączyć listy współrzędnych:

AB = LineString(A.coords[:] + B.coords[:])
gen
źródło