Como criar um LineString bem torneado a partir de dois pontos

11

Se tiver dois pontos, dos quais quero criar um LineStringobjeto direto :

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

O manual Shapely paraLineString estados:

Uma sequência de Pointinstâncias não é um parâmetro de construtor válido. A LineStringé descrito por pontos, mas não é composto de instâncias de ponto.

Portanto, se eu tenho dois pontos Ae B, existe uma maneira mais curta / melhor / mais fácil de criar uma linha do ABque o meu "melhor" palpite atual ...

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

... o que parece bastante complicado. Existe uma maneira mais fácil?

Atualizar

Com o Shapely 1.3.2 lançado hoje, a declaração acima do manual não está mais correta. Então, de agora em diante,

AB = LineString([A, B])

funciona !

ojdo
fonte

Respostas:

9

Desde Shapely 1.3, você pode criar um LineString a partir de pontos:

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

Desculpas pela contradição no manual.

sgillies
fonte
Em duas máquinas (um Linux, um Windows), após atualizar para o Shapely 1.3.1 ( shapely.__version__concordar) e colar o código literalmente, recebo um ValueError de linestring.pyc # 228 sobre "Entrada [<...Point object at 0x..>, <...Point object at 0x...>]é a forma errada para um LineString". Perdi alguma coisa?
ojdo
Atualização: a solicitação de recebimento correspondente nº 102 está apenas no mestre, ainda não foi mesclada à ramificação 1.3 e, portanto, não está presente na versão 1.3.1 atual.
ojdo
Você está certo. Corrigi isso agora no github.com/Toblerity/Shapely/issues/130 e carreguei a 1.3.2 no PyPI.
Sgillies
Verifique, ele funciona agora; obrigado (de novo) pelo rápido acompanhamento!
ojdo
3

O método base é:

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

Você também pode usar o fatiamento para concatenar as listas de coordenadas:

AB = LineString(A.coords[:] + B.coords[:])
gene
fonte