QGIS Modeler if / else条件,用于Modeler的自定义脚本


10

我想在模型中创建一个简单的if / else函数,我想知道是否可行。

在此处输入图片说明

我希望这件事做到这一点,如果选择了“细分层”的输入,则它不必执行“细分(均移)”,而将“细分层”用作下一个流程的输入。

“细分(平均转换)”的输入如下

在此处输入图片说明

尝试实现约瑟夫的答案后进行更新:我使用以下代码,并收到此错误 在此处输入图片说明

更新2,替换参数后,在第28行出现错误,这是“ 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

在此处输入图片说明

更新它的工作原理:)经过几次尝试,并在Joseph的帮助下,此代码现在像个魅力一样工作了,最后的技巧是用'None'替换两个可选值。

##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
我认为您将需要在建模器内部使用自定义脚本,以便正确使用if / else语句。
约瑟夫

1
@Joseph这也是我的想法,问题是我的脚本编写不如我想要的好,我几乎一点经验都没有……
Andreas

1
@安德烈亚斯,我确认约瑟夫在评论中写了什么。但是,我认为如果您编辑问题并提供使用Python提示的可能性(还添加适当的标签),您可能会从社区获得更多帮助...
mgri

1
@Andreas-编辑了我的帖子。同样,他们解决了您的问题之后,您还应该接受答案;)
Joseph

1
@Joseph我用现在可以运行的代码编辑了帖子,非常需要您的帮助,非常高兴您花了一些宝贵的时间来帮助我:)到目前为止,它正在执行算法,我必须等待的结果,但它看起来确实很有希望,再次感谢您:)
Andreas

Answers:


8

如我的评论中所述,在这种情况下,自定义脚本可能是可行的方法。您可以通过以下方式创建一个:

Processing Toolbox > Scripts > Tools > Create new script

下面的脚本根据包含哪个图层的参数将输入参数设置为可选参数以及if / else语句。因此,如果为选择了一个图层BGREN,它将执行分割工具并设置输出。否则输出将是从中选择的图层Segment_Layer

这是一个可能的脚本:

##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:segmentationmeanshift看上去吓人!不幸的是,我没有安装Orfeo,因此无法测试此工具。但是,此处显示参数,您只需要键入它们即可,而不使用GUI。完成后,使用BGRENSegment_Layer作为输入层将脚本添加到建模器中:

脚本参数

此外,在您的建模者,您可能需要更改所需的参数定义BGRENSegment_Layer

参数定义

然后将脚本的输出连接到NDVI工具。


我在某种程度上使用了其他工具进行了测试,这些工具根据选择的输入层而工作,因此希望它对您的建模者有效!



编辑:

这是您稍加修改后使用的代码(您需要使用逗号分隔参数,True并且False语句中不需要引号,反斜杠仅出于可读性考虑,但会将其作为单行代码包含在内):

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

还是单线:

##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编辑其问题,并提供使用Python以获得更多帮助的提示的可能性,但您的速度更快!
mgri

1
@mgri-我鼓励您发表评论,因为OP可能希望在其中编辑一些细节,并希望鼓励其他人发表可能的解决方案:)
Joseph

1
@Joseph该死的比我想象的要多得多:O无论如何,我会尝试重新创建它,并在我让它起作用的情况下留下反馈,在此先感谢:)
Andreas

1
最受欢迎的!我可能确实考虑得太深,所以按@mgri的建议编辑您的问题可能是一个好主意,以便可以发布更合适的python解决方案或类似的方法=)
Joseph

1
@Andreas-一点都不傻,每个人都必须从一开始就学习=)
Joseph
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.