简化QGIS Graphical Modeler中的重复性任务


13

在此处输入图片说明

是否存在可以在QGIS图形建模器中使用的迭代器来简化上面显示的模型。如果没有,是否有更好的方法来简化模型?

第一列代表我的输入图层,第二列是相交,第三列是“交集”操作的输出,第四列是“按位置连接属性”操作,第五列是连接操作的结果。

我想执行“交集”和“按位置连接属性”操作以进行分水岭分析。目的是计算线性形态计量学参数,例如不同阶数的流的总长度和平均长度,流比率和分叉比率。

第一步是将“ order1流”与分水岭相交,然后将“ Order2流”与相同的分水岭相交。如果提供了“ order3流” shapefile,则应执行此新层的相交。因此,只有“ order1流”和“ order2流”是必需的,其余取决于提供的分水岭层。例如,如果分水岭是4级分水岭,则所需的流最多为“ 4级流”。

一旦所有可用输入层的交点完成后,便可以按位置将它们连接到分水岭,并带有选项以获取相交流的总和和均值。

该图显示了正确的过程。如果我在建模器之外进行操作,则结果是正确的。当我运行模型时,出现此错误。

“执行算法Order5_plus_wshed'NoneType'对象时出错,没有属性'dataProvider'”。

如果我没有为可选参数之一提供输入(例如,输入“ order4流”),则会发生这种情况。但是,如果我提供所有输入,则会得到所需的结果。

因此,我想问一下是否有更好的方法来设置此任务。

Answers:


12

我设置任务的方式是创建一个自定义脚本,该脚本比建模器具有更大的灵活性,但仍然可以为其用户提供类似的界面。您可以通过以下方式创建一个:

处理工具箱>脚本>工具>创建新脚本

然后复制/粘贴以下脚本并将其保存到中C:/Users/You/.qgis2/processing/scripts

下面的脚本试图模拟您的模型的作用。该脚本不是最终的解决方案(特别是因为我用于定位工具的“ 相交”和“ 连接”属性的参数可能与您定义的参数不同),但希望您可以将其用作模板来扩展和改进脚本以适应您的需求。要运行它,只需在保存后从“ 处理工具箱”中选择它即可。

我认为脚本可以满足您的要求:

  • 前两个订单是强制性的,因此将被处理。

  • IF 语句用于确保任何后续的订单只有在其前面有正确的订单时才会被处理(例如,order4仅在选择了order3的情况下才会运行)。

  • 此外,消息还会在Python控制台中打印,显示正在处理哪些订单。


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

以下是运行脚本时界面的屏幕截图(外观应类似于运行模型时的界面):

运行脚本

几件事要注意:

  • 红色框包含必填参数

  • 绿框包含可选参数

  • 蓝色框包含必填参数

  • 黑框包含用于输出结果的可选参数。如果选择了关联的订单,脚本将仅输出图层(例如,如果未选择order5的输入,但选择了它的输出,则会发生错误)。因此,用户必须选择输入和相关的输出。这不是故意的,但我个人认为这是强迫用户仔细检查参数的好方法。


我使用了QGIS 2.12.3(带有处理插件版本2.12.2)。


2
在最近的QGIS播客上,他们有处理的创建者,他说,由于其构建方式,您现在不能直接在模型构建器中添加迭代器。这将需要进行大量的重写才能添加。因此,自定义脚本绝对是目前实现此目的的方法。
HeikkiVesanto

@Vesanto-非常有趣,谢谢您的加入。您是否有指向此特定播客的链接?
约瑟夫


1
@DennisTG-抱歉,我应该在我的帖子中提到我使用QGIS 2.12.3(带有处理插件版本2.12.2)。
约瑟夫

1
@Joseph,对我有用。非常有见地,我感谢您的帮助。
DennisTG'2
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.