Dựa trên câu trả lời của @ kazuhito, tôi đã kết hợp một biểu thức hacky duy nhất trong Máy tính Trường QGIS sẽ làm điều tương tự trong một bước.
Tuy nhiên tôi có thể tưởng tượng điều này sẽ rất tốn tài nguyên trên các bộ dữ liệu lớn hơn. Tôi nghĩ rằng vấn đề này phù hợp nhất với việc triển khai Python, rõ ràng xử lý tham chiếu và lặp lại tốt hơn nhiều so với Máy tính Trường.
array_last(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1))
- array_first(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1))
Điều này trước tiên tạo ra một 'mảng' số nút bằng cách sử dụng generate_series()
, chỉ định mức tối đa là số nút trong mỗi đa giác - đây là num_points($geometry)
, trừ đi 1 để bỏ qua nút đầu tiên / nút cuối được lặp lại.
Sau đó, bạn có thể chuyển các giá trị của mảng này thông qua một hàm để tạo ra một mảng khác bằng cách sử dụng array_foreach()
. Ở đây, chúng ta chuyển số nút đa giác (được biểu thị là @element
) point_n()
, trả về hình dạng thực của nút đó, sau đó chúng ta đưa nó vào line_locate_point()
để xác định độ dài của nó dọc theo dòng được chỉ định (xem Lưu ý quan trọng bên dưới).
Mảng kết quả sau đó được sắp xếp theo thứ tự tăng dần bằng cách sử dụng array_sort()
, sau đó cho phép chúng ta có được khoảng cách "ngoài cùng bên trái" và "ngoài cùng bên phải" dọc theo dòng sử dụng array_last()
và array_first()
. Trừ hai và kết quả là "chiều dài" của đa giác dọc theo đường thẳng.
Xem bên dưới để biết ví dụ về biểu thức trên được hiển thị dưới dạng nhãn trong đa giác (cộng với khoảng cách dòng "ngoài cùng bên trái" và "ngoài cùng bên phải" tách ra khỏi biểu thức trên). Để so sánh tôi cũng đã bao gồm các đỉnh được trích xuất và các giá trị khoảng cách dòng có liên quan. Các đỉnh màu xanh lá cây là các đỉnh "ngoài cùng bên trái" và "ngoài cùng bên phải" dọc theo đường thẳng. Lưu ý đa giác trên cùng bên trái nơi điểm màu xanh lá cây thực sự nằm dọc theo đường thẳng hơn điểm bên phải bên dưới nó, do góc của đường ...
Lưu ý quan trọng :
Hình dạng lớp đường được tham chiếu ở đây bằng cách sử dụng aggregate()
. Bạn sẽ cần thay đổi tên lớp ( 'lines'
) theo yêu cầu và nếu bạn có nhiều dòng, bạn nên thêm bộ lọc để chỉ định dòng nào bạn muốn so sánh với nó, ví dụ : aggregate('lines','collect',$geometry,"name"='TrainLine1')
. Để làm cho điều này tự động hoạt động trên dòng gần nhất, tôi thực sự khuyên dùng SQL hoặc Python trên Field Calc.
Ngoài ra, điều này sẽ tính toán "chiều dài" của Đa giác ALONG dòng, bao gồm cả nếu dòng bị xoắn theo ví dụ của tôi. Nếu bạn muốn khoảng cách đường thẳng ... có thể tính toán distance()
giữa các nút có liên quan?