QGIS Modeler jika / selain syarat, script khusus untuk Modeler


10

Saya ingin membuat fungsi if / else sederhana di dalam Model saya dan saya ingin tahu apakah itu mungkin atau tidak.

masukkan deskripsi gambar di sini

Saya ingin hal ini dilakukan jika Input untuk 'Segmen Lapisan' dipilih yang tidak harus menjalankan 'Segmentasi (berarti pergeseran)' dan menggunakan 'Segmen Lapisan' sebagai input untuk Proses selanjutnya.

Input untuk 'Segmentasi (berarti pergeseran)' adalah sebagai berikut

masukkan deskripsi gambar di sini

Pembaruan setelah mencoba menerapkan jawaban Joseph: Saya menggunakan kode berikut dan mendapatkan kesalahan ini masukkan deskripsi gambar di sini

Pembaruan 2, setelah mengganti parameter saya mendapatkan kesalahan di baris 28 ini adalah berdiri 'else:'

##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

masukkan deskripsi gambar di sini

Perbarui itu berfungsi :) setelah beberapa kali mencoba dan dengan bantuan Joseph kode ini sekarang berfungsi seperti pesona, trik terakhirnya adalah mengganti dua nilai opsional dengan 'Tidak Ada'.

##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
Saya pikir Anda harus menggunakan skrip khusus di dalam pemodel Anda untuk menggunakan pernyataan if / else dengan benar.
Joseph

1
@ Joseph, itulah yang saya pikir juga, Masalahnya adalah saya tidak begitu baik dalam scripting seperti yang saya inginkan, saya cukup banyak tidak memiliki expirience sama sekali ...
Andreas

1
@Andreas saya mengkonfirmasi apa yang ditulis Joseph dalam komentarnya. Namun, saya pikir Anda mungkin mendapatkan lebih banyak bantuan dari komunitas jika Anda mengedit pertanyaan Anda dan memberikan kemungkinan untuk mendapatkan beberapa petunjuk dengan Python (menambahkan juga tag yang tepat) ...
mgri

1
@Andreas - Diedit pos saya. Selain itu, Anda harus menerima jawaban setelah mereka menyelesaikan masalah Anda;)
Joseph

1
@ Joseph Saya telah mengedit posting saya dengan kode yang sekarang berfungsi, bantuan Anda sangat dibutuhkan dan saya benar-benar senang Anda meluangkan waktu berharga Anda untuk membantu saya dengan ini :) pada saat ini sedang menjalankan algoritma dan saya harus menunggu untuk hasil tetapi terlihat sangat menjanjikan, terima kasih lagi :)
Andreas

Jawaban:


8

Seperti yang disebutkan dalam komentar saya, skrip khusus mungkin menjadi cara untuk masuk dalam situasi ini. Anda dapat membuatnya dari:

Processing Toolbox > Scripts > Tools > Create new script

Script berikut menetapkan parameter input sebagai opsional bersama dengan pernyataan if / else tergantung pada parameter mana yang berisi layer. Jadi jika sebuah layer dipilih BGREN, ia akan melakukan alat segmentasi dan mengatur output; jika tidak, output akan menjadi lapisan yang dipilih Segment_Layer.

Berikut ini skrip yang mungkin:

##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

Parameter untuk otb:segmentationmeanshifttampilan menakutkan! Sayangnya, saya tidak menginstal Orfeo sehingga tidak dapat menguji alat ini. Namun, parameternya ditampilkan di sini , Anda hanya perlu mengetikkannya daripada menggunakan GUI. Setelah selesai, tambahkan skrip ke pemodel Anda menggunakan BGRENdan Segment_Layersebagai lapisan input:

Parameter skrip

Selain itu, dalam pemodel Anda, Anda mungkin perlu mengubah definisi parameter yang Diperlukan dari BGRENdan Segment_Layer:

Definisi parameter

Kemudian hubungkan output skrip ke alat NDVI Anda.


Saya menguji ini sampai batas tertentu menggunakan alat-alat lain yang bekerja tergantung pada lapisan input mana yang dipilih jadi semoga akan bekerja untuk pemodel Anda!



EDIT:

Berikut adalah kode yang Anda gunakan sedikit dimodifikasi (Anda perlu koma untuk memisahkan parameter, Truedan Falsepernyataan tidak memerlukan tanda kutip di sekitar mereka, garis miring hanya untuk keterbacaan tetapi akan memasukkannya sebagai satu-baris):

##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

Atau sebagai one-liner:

##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
Saya menambahkan komentar untuk mendorong @Andreas untuk mengedit pertanyaannya dan memberikan kemungkinan untuk mendapatkan beberapa petunjuk dengan Python untuk menerima lebih banyak bantuan, tetapi Anda lebih cepat!
mgri

1
@mgri - Saya mendorong Anda untuk mengirim komentar itu karena OP mungkin ingin mengedit beberapa detail dan semoga mendorong orang lain untuk memposting solusi yang mungkin :)
Joseph

1
@ Joseph sialan, itu jauh lebih banyak daripada yang saya kira: O lagi pula saya akan mencoba untuk membuat ulang ini dan meninggalkan umpan balik jika saya berhasil, terima kasih sebelumnya :)
Andreas

1
Selamat datang! Saya mungkin melakukan overthink ini jadi mungkin ide yang baik untuk mengedit pertanyaan Anda seperti @mgri menyarankan sehingga solusi python yang lebih cocok atau semacamnya dapat diposting =)
Joseph

1
@Andreas - Tidak bodoh sama sekali, semua orang harus belajar dari awal =)
Joseph
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.