Trình tạo mô hình QGIS nếu / điều kiện khác, tập lệnh tùy chỉnh cho Trình tạo mô hình


10

Tôi muốn thực hiện một chức năng đơn giản nếu / khác trong Mô hình của mình và tôi muốn biết liệu nó có thể hay không.

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

Tôi muốn điều này thực hiện điều đó nếu Đầu vào cho 'Lớp phân đoạn' được chọn mà nó không phải thực hiện 'Phân đoạn (meanshift)' và sử dụng 'Lớp phân đoạn' thay vào đó làm Đầu vào cho Quy trình tiếp theo.

Đầu vào cho 'Phân đoạn (meanshift)' như sau

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

Cập nhật sau khi cố gắng thực hiện câu trả lời của Joseph: Tôi đã sử dụng đoạn mã sau và gặp lỗi này nhập mô tả hình ảnh ở đây

Cập nhật 2, sau khi thay thế các tham số tôi gặp lỗi trong dòng 28, đây là 'other:' stand

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN\
    -0\
    -70\
    -70\
    -0.1\
    -100\
    -100\
    -0\
    -0\
    -0\
    -'True'\
    -'False'\
    -1\
    -0.1\
    -'Layer'\
    -'DN'\
    -1024\
    -1\
    -0\
    -output)
else:
    output=Segment_Layer

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

Cập nhật nó hoạt động :) sau một vài lần thử và với Joseph giúp mã này hiện hoạt động như một bùa mê, mẹo cuối cùng là thay thế hai giá trị tùy chọn bằng 'Không'.

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    None, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    None, \
    output)
else:
    output=Segment_Layer

3
Tôi nghĩ bạn sẽ cần sử dụng một tập lệnh tùy chỉnh bên trong trình tạo mô hình của mình để sử dụng câu lệnh if / other một cách chính xác.
Giuse

1
@Joseph đó là những gì tôi cũng nghĩ, Vấn đề là tôi không giỏi viết kịch bản như tôi muốn, tôi gần như không có kinh nghiệm gì cả ...
Andreas

1
@Andreas Tôi xác nhận những gì Joseph đã viết trong bình luận của mình. Tuy nhiên, tôi nghĩ rằng bạn có thể nhận được nhiều sự giúp đỡ hơn từ cộng đồng nếu bạn chỉnh sửa câu hỏi của mình và đưa ra khả năng nhận được một số gợi ý với Python (cũng thêm một thẻ thích hợp) ...
mgri

1
@Andreas - Đã chỉnh sửa bài viết của tôi. Ngoài ra, bạn nên chấp nhận câu trả lời sau khi họ đã giải quyết vấn đề của bạn;)
Joseph

1
@Joseph Tôi đã chỉnh sửa bài đăng của mình với mã hiện đang hoạt động, sự giúp đỡ của bạn rất cần thiết và tôi thực sự rất vui vì bạn đã dành chút thời gian quý báu của mình để giúp tôi với điều này :) ngay lúc này nó đang thực thi thuật toán và tôi phải chờ cho kết quả nhưng có vẻ rất hứa hẹn, cảm ơn bạn một lần nữa :)
Andreas

Câu trả lời:


8

Như đã đề cập trong bình luận của tôi, một kịch bản tùy chỉnh có thể là cách để đi trong tình huống này. Bạn có thể tạo một từ:

Processing Toolbox > Scripts > Tools > Create new script

Kịch bản sau đây đặt các tham số đầu vào là tùy chọn cùng với câu lệnh if / other tùy thuộc vào tham số nào chứa một lớp. Vì vậy, nếu một lớp được chọn BGREN, nó sẽ thực hiện công cụ phân đoạn và đặt đầu ra; nếu không thì đầu ra sẽ là lớp được chọn từ đó Segment_Layer.

Đây là một kịch bản có thể:

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN, \
    -filter, \
    -filter.meanshift.spatialr, \
    -filter.meanshift.ranger, \
    -filter.meanshift.thres, \
    -filter.meanshift.maxiter, \
    -filter.meanshift.minsize, \
    -mode, \
    -mode.vector.outmode, \
    -mode.vector.inmask, \
    -mode.vector.neighbor, \
    -mode.vector.stitch, \
    -mode.vector.minsize, \
    -mode.vector.simplify, \
    -mode.vector.layername, \
    -mode.vector.fieldname, \
    -mode.vector.tilesize, \
    -mode.vector.startlabel, \
    -mode.vector.ogroptions, \
    -output)
else:
    output=Segment_Layer

Các thông số cho otb:segmentationmeanshiftcái nhìn đáng sợ! Thật không may, tôi chưa cài đặt Orfeo nên không thể kiểm tra công cụ này. Tuy nhiên, các tham số được hiển thị ở đây , bạn chỉ cần nhập chúng vào thay vì sử dụng GUI. Sau khi hoàn thành, hãy thêm tập lệnh vào trình tạo mô hình của bạn bằng cách sử dụng BGRENSegment_Layerlàm lớp đầu vào:

Các tham số script

Ngoài ra, trong trình tạo mô hình của bạn, bạn có thể cần thay đổi định nghĩa tham số bắt buộc của BGRENSegment_Layer:

Định nghĩa tham số

Sau đó kết nối đầu ra của tập lệnh với công cụ NDVI của bạn.


Tôi đã thử nghiệm điều này ở một mức độ nào đó bằng cách sử dụng các công cụ khác hoạt động tùy thuộc vào lớp đầu vào nào được chọn để hy vọng nó sẽ hoạt động cho trình tạo mô hình của bạn!



BIÊN TẬP:

Đây là mã bạn đã sử dụng một chút sửa đổi (bạn cần dấu phẩy để phân tách các tham số Truevà các Falsecâu lệnh không yêu cầu dấu ngoặc kép xung quanh chúng, dấu gạch chéo ngược chỉ để dễ đọc nhưng sẽ bao gồm nó dưới dạng một lớp lót):

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    0, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    0, \
    output)
else:
    output=Segment_Layer

Hoặc như một lớp lót:

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift',BGREN,0,70,70,0.1,100,100,0,0,0,True,False,1,0.1,'Layer','DN',1024,1,0,output)
else:
    output=Segment_Layer

1
Tôi đã thêm một bình luận để khuyến khích @Andreas chỉnh sửa câu hỏi của mình và đưa ra khả năng nhận được một số gợi ý với Python để nhận thêm trợ giúp, nhưng bạn đã nhanh hơn!
mgri

1
@mgri - Tôi khuyến khích bạn đăng bình luận đó vì OP có thể muốn chỉnh sửa một số chi tiết và hy vọng khuyến khích người khác đăng một giải pháp khả thi :)
Joseph

1
@Joseph chết tiệt đó nhiều hơn tôi nghĩ: O dù sao tôi cũng sẽ cố gắng tạo lại điều này và để lại phản hồi nếu tôi làm việc được, cảm ơn trước :)
Andreas

1
Chào mừng bạn nhất! Tôi có lẽ đã lật đổ điều này vì vậy có thể là một ý tưởng tốt để chỉnh sửa câu hỏi của bạn vì @mgri đã đề xuất để có thể đăng một giải pháp trăn phù hợp hơn hoặc như vậy =)
Joseph

1
@Andreas - Không ngu ngốc chút nào, mọi người phải học lại từ đầu =)
Joseph
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.