Comment créer un Shapely LineString à partir de deux points

11

Si j'ai deux points, à partir desquels je veux créer un LineStringobjet droit :

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

Le manuel Shapely pour lesLineString États:

Une séquence d' Pointinstances n'est pas un paramètre constructeur valide. A LineStringest décrit par des points, mais n'est pas composé d'instances de point.

Donc, si j'ai deux points Aet B, y a-t-il un moyen plus court / meilleur / plus facile de créer une ligne ABque ma "meilleure" supposition actuelle ...

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

... ce qui semble plutôt compliqué. Existe-t-il un moyen plus simple?

Mise à jour

Avec Shapely 1.3.2 publié aujourd'hui, la déclaration ci-dessus du manuel n'est plus correcte. Donc à partir de maintenant,

AB = LineString([A, B])

fonctionne !

ojdo
la source

Réponses:

9

Depuis Shapely 1.3, vous pouvez créer une ligne de chaîne à partir de points:

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

Toutes mes excuses pour la contradiction dans le manuel.

sgillies
la source
Sur deux machines (une Linux, une Windows), après la mise à niveau vers Shapely 1.3.1 (d' shapely.__version__accord) et le collage de votre code textuellement, je reçois une ValueError de linestring.pyc # 228 sur "L'entrée [<...Point object at 0x..>, <...Point object at 0x...>]n'est pas la bonne forme pour une LineString". Ai-je raté quelque chose?
ojdo
Mise à jour: la demande d'extraction correspondante # 102 est uniquement dans le maître, pas encore fusionnée à la branche 1.3 et n'est donc pas présente dans la version 1.3.1 actuelle.
ojdo
Vous avez raison. Je viens de corriger cela dans github.com/Toblerity/Shapely/issues/130 et j'ai téléchargé 1.3.2 sur PyPI.
sgillies
Vérifiez, cela fonctionne maintenant; merci (encore) pour le suivi rapide!
ojdo
3

La méthode de base est:

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

Vous pouvez également utiliser le découpage pour concaténer les listes de coordonnées:

AB = LineString(A.coords[:] + B.coords[:])
gène
la source