Come creare uno Shapely LineString da due punti


11

Se hanno due punti, da cui voglio creare un LineStringoggetto dritto :

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

Il manuale di Shapely per gliLineString stati:

Una sequenza di Pointistanze non è un parametro costruttore valido. A LineStringè descritto da punti, ma non è composto da istanze Point.

Quindi se ho due punti Ae Bc'è un modo più breve / migliore / più semplice per creare una linea ABrispetto alla mia ipotesi "migliore" attuale ...

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

... che sembra piuttosto complicato. C'è un modo più semplice?

Aggiornare

Con Shapely 1.3.2 rilasciato oggi, l'affermazione di cui sopra dal manuale non è più corretta. Quindi d'ora in poi,

AB = LineString([A, B])

funziona !

Risposte:


9

Da Shapely 1.3, puoi creare un LineString dai punti:

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

Ci scusiamo per la contraddizione nel manuale.


Su due macchine (una Linux, una Windows), dopo l'aggiornamento a Shapely 1.3.1 ( shapely.__version__concorda) e incollando il tuo codice alla lettera, ricevo un ValueError da linestring.pyc # 228 su "L'input [<...Point object at 0x..>, <...Point object at 0x...>]è la forma sbagliata per un LineString". Ho perso qualcosa?
ojdo,

Aggiornamento: la corrispondente richiesta pull # 102 è solo nel master, non ancora unita al ramo 1.3 e quindi non presente nell'attuale versione 1.3.1.
ojdo,

Hai ragione. Ho appena risolto questo problema in github.com/Toblerity/Shapely/issues/130 e caricato 1.3.2 su PyPI.
sgillies,

Controlla, funziona ora; grazie (di nuovo) per il rapido seguito!
ojdo,

3

Il metodo di base è:

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

Puoi anche utilizzare lo slicing per concatenare gli elenchi di coordinate:

AB = LineString(A.coords[:] + B.coords[:])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.