Đơn giản hóa các tác vụ lặp đi lặp lại trong Mô hình đồ họa của QGIS


13

nhập mô tả hình ảnh ở đây

Có các trình vòng lặp có thể được sử dụng trong trình tạo mô hình đồ họa của QGIS để đơn giản hóa mô hình được hiển thị ở trên không. Nếu không, có cách nào tốt hơn để đơn giản hóa mô hình?

Cột đầu tiên đại diện cho các lớp đầu vào của tôi, cột thứ hai là giao điểm, cột thứ ba là đầu ra từ hoạt động "giao cắt", cột thứ tư là hoạt động "thuộc tính tham gia theo vị trí" và cột thứ năm là kết quả của hoạt động nối.

Tôi muốn thực hiện các hoạt động "giao nhau" và "tham gia thuộc tính theo vị trí" để phân tích lưu vực. Mục đích là tính toán các tham số Hình thái tuyến tính, chẳng hạn như tổng chiều dài và trung bình của các luồng của các đơn đặt hàng khác nhau, tỷ lệ luồng và tỷ lệ phân nhánh.

Bước đầu tiên là giao "luồng order1" với lưu vực, và sau đó giao "luồng Order2" với cùng lưu vực. Nếu có một shapefile "order3 stream" được cung cấp thì giao điểm cho lớp mới này sẽ được thực hiện. Do đó, chỉ "luồng order1" và "luồng order2" là bắt buộc, phần còn lại phụ thuộc vào lớp đầu nguồn được cung cấp. Ví dụ: nếu lưu vực là một đơn hàng 4 lưu vực thì các luồng cần thiết lên đến "luồng thứ tự4".

Khi giao lộ được hoàn thành cho tất cả các lớp đầu vào có sẵn, chúng sẽ được nối theo vị trí đến đầu nguồn với các tùy chọn để lấy tổng và giá trị trung bình của các luồng giao nhau.

Hình ảnh cho thấy các thủ tục chính xác. Nếu tôi thực hiện thao tác bên ngoài bộ tạo mô hình thì kết quả là chính xác. Khi tôi chạy mô hình tôi gặp lỗi này.

"Lỗi thực thi thuật toán Order5_plus_wshed Đối tượng 'noneType' không có thuộc tính 'dataProvider'".

Điều này xảy ra nếu tôi chưa cung cấp đầu vào cho một trong các tham số tùy chọn (ví dụ: đầu vào, ví dụ "luồng order4") Tuy nhiên nếu tôi cung cấp tất cả các đầu vào tôi nhận được kết quả tôi cần.

Vì vậy, tôi muốn hỏi liệu có cách nào tốt hơn để thiết lập nhiệm vụ này không.

Câu trả lời:


12

Cách tôi thiết lập nhiệm vụ của bạn sẽ là tạo một tập lệnh tùy chỉnh cung cấp tính linh hoạt cao hơn trình tạo mô hình nhưng vẫn có thể cung cấp giao diện tương tự cho người dùng. Bạn có thể tạo một từ:

Hộp công cụ xử lý> Tập lệnh> Công cụ> Tạo tập lệnh mới

Sau đó sao chép / dán đoạn script bên dưới và lưu nó vào C:/Users/You/.qgis2/processing/scripts.

Kịch bản dưới đây cố gắng mô phỏng những gì mô hình của bạn làm. Kịch bản không phải là giải pháp cuối cùng (đặc biệt là các tham số tôi đã sử dụng cho thuộc tính Giao lộTham gia bởi các công cụ vị trí có thể khác với những gì bạn đã xác định) nhưng hy vọng bạn có thể sử dụng nó làm mẫu để mở rộng và cải thiện tập lệnh phù hợp với nhu cầu của bạn . Để chạy nó, chỉ cần chọn nó từ Hộp công cụ xử lý sau khi nó đã được lưu.

Tôi nghĩ rằng kịch bản làm những gì bạn yêu cầu:

  • Hai đơn hàng đầu tiên là bắt buộc nên sẽ được xử lý.

  • IF các câu lệnh được sử dụng để đảm bảo rằng bất kỳ đơn đặt hàng thành công nào sẽ chỉ được xử lý nếu lệnh chính xác trước nó (ví dụ order4 sẽ chỉ chạy nếu order3 đã được chọn).

  • Ngoài ra, các thông báo được in trong Bảng điều khiển Python cho biết đơn hàng nào đang được xử lý.


##Example model=name
##Order1=vector
##Order2=vector
##Order3=optional vector
##Order4=optional vector
##Order5=optional vector
##Watershed=vector
##Order2_Wshed=output vector
##Order3_Wshed=output vector
##Order4_Wshed=output vector
##Order5_Wshed=output vector

order1 = processing.getObject(Order1)
order2 = processing.getObject(Order2)
order3 = processing.getObject(Order3)
order4 = processing.getObject(Order4)
order5 = processing.getObject(Order5)
watershed = processing.getObject(Watershed)

if Order3 is None:
    print 'Processing Order1 and Order2'
else:
    print 'Processing Order1, Order2 and Order3'
    if Order4 is not None:
        print 'Processing Order1, Order2, Order3 and Order4'
        if Order5 is not None:
            print 'Processing Order1, Order2, Order3, Order4 and Order5'

output_1a = processing.runalg("qgis:intersection", order1, watershed, None)
output_1b = processing.runalg("qgis:joinattributesbylocation", output_1a['OUTPUT'], watershed, u'intersects', 0, 0, '', 0, None)
output_2a = processing.runalg("qgis:intersection", order2, watershed, None)
output_2b = processing.runalg("qgis:joinattributesbylocation", output_2a['OUTPUT'], output_1b['OUTPUT'], u'intersects', 0, 0, '', 0, Order2_Wshed)

if Order3 is None:
    pass
else:
    output_3a = processing.runalg("qgis:intersection", order3, watershed, None)
    output_3b = processing.runalg("qgis:joinattributesbylocation", output_3a['OUTPUT'], output_2b['OUTPUT'], u'intersects', 0, 0, '', 0, Order3_Wshed)
    if Order4 is None:
        pass
    else:
        output_4a = processing.runalg("qgis:intersection", order4, watershed, None)
        output_4b = processing.runalg("qgis:joinattributesbylocation", output_4a['OUTPUT'], output_3b['OUTPUT'], u'intersects', 0, 0, '', 0, Order4_Wshed)
        if Order5 is None:
            pass
        else:
            output_5a = processing.runalg("qgis:intersection", order5, watershed, None)
            output_5b = processing.runalg("qgis:joinattributesbylocation", output_5a['OUTPUT'], output_4b['OUTPUT'], u'intersects', 0, 1, 'sum, mean', 0, Order5_Wshed)

Dưới đây là ảnh chụp màn hình của giao diện khi chạy tập lệnh (trông giống như khi bạn chạy mô hình của mình):

Chạy tập lệnh

Vài điều cần lưu ý:

  • Hộp màu đỏ chứa các tham số bắt buộc

  • Hộp màu xanh lá cây chứa các tham số tùy chọn

  • Hộp màu xanh chứa tham số bắt buộc

  • Hộp đen chứa các tham số tùy chọn cho kết quả đầu ra. Kịch bản sẽ chỉ xuất các lớp đầu ra nếu thứ tự liên quan được chọn (ví dụ: nếu đầu vào cho order5 không được chọn nhưng đầu ra cho nó thì sẽ xảy ra lỗi). Do đó, người dùng phải chọn đầu vào và đầu ra có liên quan. Đây không phải là cố ý nhưng cá nhân tôi nghĩ rằng đó là một cách tốt để buộc người dùng kiểm tra các thông số một cách cẩn thận.


Tôi đã sử dụng QGIS 2.12.3 (với Xử lý plugin phiên bản 2.12.2).


2
Trên một podcast QGIS gần đây, họ có người tạo xử lý và anh ấy nói rằng vì cách nó được xây dựng nên bạn không thể thêm một trình lặp trực tiếp trong trình tạo mô hình. Nó sẽ yêu cầu viết lại rộng rãi để thêm. Vì vậy, một kịch bản tùy chỉnh chắc chắn là cách để làm điều đó ngay bây giờ.
HeikkiVesanto

@Vesanto - Điều đó rất thú vị, cảm ơn bạn đã bao gồm điều đó. Bạn có một liên kết đến podcast đặc biệt này?
Joseph


1
@DennisTG - Xin lỗi bạn thân, đáng lẽ tôi nên đề cập trong bài đăng của mình rằng tôi đã sử dụng QGIS 2.12.3 (với Xử lý plugin phiên bản 2.12.2).
Giuse

1
@Joseph, nó làm việc cho tôi. Khá sâu sắc, tôi đánh giá cao sự giúp đỡ.
DennisTG
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.