QGIS Modeler if / else koşulu, Modeler için özel komut dosyası


10

Modelimin içinde basit bir if / else işlevi yapmak istiyorum ve bunun mümkün olup olmadığını bilmek istedim.

resim açıklamasını buraya girin

'Segment Katmanı' için bir Giriş seçildiğinde, 'Segmentasyon (araç kaydırma)' yürütmek zorunda olmadığı ve bir sonraki İşlem için Giriş olarak 'Segment Katmanı' kullandığını bunu yapmak istiyorum.

'Segmentasyon (ortalama kaydırma)' girişleri aşağıdaki gibidir

resim açıklamasını buraya girin

Joseph'in cevabını uygulamaya çalıştıktan sonra güncelleme: Aşağıdaki kodu kullandım ve bu hatayı aldım resim açıklamasını buraya girin

Güncelleme 2, parametreleri değiştirdikten sonra 28 satırında bir hata alıyorum, bu 'else:' duruyor

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

resim açıklamasını buraya girin

Güncelleme çalışır :) birkaç denemeden sonra ve Joseph bu kod artık bir cazibe gibi çalışır yardım ile, son hile iki isteğe bağlı değerleri 'Yok' ile değiştirmek oldu.

##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
Eğer if / else ifadelerini doğru kullanmak için modelcinizin içinde özel bir komut dosyası kullanmanız gerektiğini düşünüyorum .
Joseph

1
@Joseph ben de öyle düşünmüştüm, Sorun şu ki senaryo yazımda olmak istediğim kadar iyi değilim, neredeyse hiç sürekliliğim yok ...
Andreas

1
@Andreas, Joseph'in yorumunda yazdıklarını onaylıyorum. Ancak, sorunuzu düzenlerseniz ve Python ile bazı ipuçları alma imkanı verirseniz topluluktan daha fazla yardım alabileceğinizi düşünüyorum (ayrıca uygun bir etiket ekleyerek) ...
mgri

1
@Andreas - Yazımı düzenledi. Ayrıca, sorununuzu çözdükten sonra cevapları kabul etmelisiniz ;)
Joseph

1
@Joseph Mesajımı şimdi çalışan kodla düzenledim, yardımınız çok gerekliydi ve bana bu konuda yardımcı olmak için değerli zamanınızı aldığınız için gerçekten memnunum :) şu anda algoritmayı yürütüyor ve beklemek zorundayım sonuçlar için ama gerçekten umut verici görünüyor, tekrar teşekkür ederim :)
Andreas

Yanıtlar:


8

Yorumumda belirtildiği gibi, özel bir komut dosyası bu durumda gitmenin yolu olabilir. Şunlardan bir tane oluşturabilirsiniz:

Processing Toolbox > Scripts > Tools > Create new script

Aşağıdaki komut dosyası , hangi parametrenin katman içerdiğine bağlı olarak, giriş parametrelerini isteğe bağlı olarak bir if / else ifadesiyle birlikte ayarlar . Bu nedenle, bir katman seçildiyse BGREN, segmentasyon aracını gerçekleştirir ve çıktıyı ayarlar; aksi takdirde çıktı, seçilen katman olacaktır Segment_Layer.

İşte olası bir komut dosyası:

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

otb:segmentationmeanshiftKorkunç bir görünüm için parametreler ! Ne yazık ki, Orfeo yüklü değil bu yüzden bu aracı test edemez. Ancak, parametreler burada gösterilir , GUI kullanmak yerine bunları yazmanız yeterlidir. Bittiğinde, komut dosyasını giriş katmanları olarak BGRENve modelleyicinize ekleyin Segment_Layer:

Komut dosyası parametreleri

Ayrıca, modelleyicisinde içinde, değiştirmek gerekebilir Gerekli parametre tanımı BGRENve Segment_Layer:

Parametre tanımı

Ardından komut dosyasının çıktısını NDVI aracınıza bağlayın.


Hangi girdi katmanının seçildiğine bağlı olarak çalışan diğer araçları kullanarak bir dereceye kadar test ettim, umarım modelleyiciniz için çalışacaktır!



DÜZENLE:

İşte biraz değiştirilmiş kullandığınız kod (parametreleri ayırmak için virgül kullanmanız gerekir Trueve Falseifadeler etraflarında tırnak işareti gerektirmez, ters eğik çizgi sadece okunabilirlik içindir, ancak tek astar olarak içerir):

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

Veya tek astar olarak:

##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
@Andreas'ı sorusunu düzenlemeye teşvik etmek için bir yorum ekliyordum ve daha fazla yardım almak için Python ile bazı ipuçları alma olanağı verdim, ancak daha hızlıydınız!
mgri

1
@mgri - OP'nin bazı ayrıntıları düzenlemek isteyebileceği ve umarım diğerlerini olası bir çözüm göndermesi için teşvik edebileceği için bu yorumu göndermenizi tavsiye ederim :)
Joseph

1
@Joseph lanet olası olduğunu düşündüğümden çok daha fazla: O yine de bunu yeniden yaratmaya çalışacağım ve işe alırsam bir geri bildirim bırakacağım, şimdiden teşekkürler :)
Andreas

1
En hoş geldiniz! Muhtemelen bunu düşünmüştüm, bu yüzden sorunuzu @mgri'nin önerdiği gibi düzenlemek daha iyi bir fikir olabilir, böylece daha uygun bir python çözümü veya benzeri gönderilebilir =)
Joseph

1
@Andreas - Hiç aptal değil, herkes baştan öğrenmeli =)
Joseph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.