Cách tạo LineString Shapely từ hai điểm


11

Nếu có hai điểm, từ đó tôi muốn tạo một LineStringđối tượng thẳng :

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

Các nhãn hiệu kiểu dáng cân đối choLineString tiểu bang:

Một chuỗi các Pointtrường hợp không phải là một tham số xây dựng hợp lệ. A LineStringđược mô tả bởi các điểm, nhưng không bao gồm các trường hợp Điểm.

Vì vậy, nếu tôi có hai điểm AB, có cách nào tạo ra một dòng ngắn hơn / tốt hơn / dễ dàng ABhơn so với dự đoán "tốt nhất" hiện tại của tôi không ...

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

... có vẻ khá phức tạp. Có cách nào dễ hơn không?

Cập nhật

Với Shapely 1.3.2 được phát hành ngày hôm nay, tuyên bố trên từ hướng dẫn sử dụng không còn đúng nữa. Vì vậy, từ bây giờ,

AB = LineString([A, B])

làm việc !

Câu trả lời:


9

Kể từ Shapely 1.3, bạn có thể tạo LineString từ Points:

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

Xin lỗi vì sự mâu thuẫn trong hướng dẫn.


Trên hai máy (một Linux, một Windows), sau khi nâng cấp lên Shapely 1.3.1 ( shapely.__version__đồng ý) và dán nguyên văn mã của bạn, tôi nhận được ValueError từ linestring.pyc # 228 về "Đầu vào [<...Point object at 0x..>, <...Point object at 0x...>]là hình dạng sai cho LineString". Tôi đã bỏ lỡ một cái gì đó?
ojdo

Cập nhật: yêu cầu kéo tương ứng # 102 chỉ có trong bản gốc, chưa được hợp nhất với nhánh 1.3 và do đó không có trong bản phát hành 1.3.1 hiện tại.
ojdo

Bạn đúng. Tôi vừa sửa lỗi này trong github.com/Toblerity/Shapely/issues/130 và đã tải 1.3.2 lên PyPI.
sgillies

Kiểm tra, nó hoạt động bây giờ; cảm ơn (một lần nữa) cho việc theo dõi nhanh chóng!
ojdo

3

Phương pháp cơ bản là:

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

Bạn cũng có thể sử dụng cắt lát để nối các danh sách tọa độ:

AB = LineString(A.coords[:] + B.coords[:])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.