Як створити Shapely LineString з двох точок


11

Якщо є два моменти, з яких я хочу створити прямий LineStringоб’єкт:

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

Посібник Shapely дляLineString держав:

Послідовність Pointекземплярів не є дійсним параметром конструктора. A LineStringописується пунктами, але не складається з екземплярів Point.

Отже, якщо у мене є два моменти, Aі Bчи є коротший / кращий / простіший спосіб створення лінії, ABніж мої поточні "найкращі" здогадки ...

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

... що виглядає досить складно. Чи є простіший спосіб?

Оновлення

З випущеним сьогодні Shapely 1.3.2, наведене вище твердження з посібника вже не є правильним. Тож відтепер

AB = LineString([A, B])

працює !

Відповіді:


9

З Shapely 1.3 ви можете створити LineString з пунктів:

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

Вибачення за протиріччя в посібнику.


На двох машинах (один Linux, одна Windows) після оновлення до Shapely 1.3.1 ( shapely.__version__погоджується) та вставлення коду дослівно, я отримую ValueError від linestring.pyc # 228 про тему "Введення [<...Point object at 0x..>, <...Point object at 0x...>]неправильної форми для LineString". Я щось пропустив?
ojdo

Оновлення: відповідний запит на витяг №102 є лише у головній, ще не об'єднаній у гілку 1.3 і, таким чином, не присутній у поточному випуску 1.3.1.
ojdo

Ти маєш рацію. Я щойно виправив це в github.com/Toblerity/Shapely/isissue/130 та завантажив 1.3.2 в PyPI.
sgillies

Перевірте, це працює зараз; дякую (знову) за швидке спостереження!
ojdo

3

Базовим методом є:

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

Ви також можете використовувати нарізки для об'єднання списків координат:

AB = LineString(A.coords[:] + B.coords[:])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.