13.5. 使用图形建模器自动化工作流

本章将为您提供图形建模器(GM)的概述。首先,我们将介绍建模器并探讨可用于模型的各种输入和算法。然后,我们将通过逐步示例演示如何开发 可以添加到“处理工具箱”。我们还将讨论更高级的主题,包括嵌套模型和迭代执行模型。我们将在本章中讨论的具体主题如下:

  • 图形建模器简介

  • 打开图形建模器

  • 配置建模器并命名模型

  • 添加输入

  • 添加算法

  • 运行模型

  • 编辑模型

  • 记录模型

  • 保存、加载和导出模型

  • 迭代执行模型算法

  • 嵌套模型

  • 对模型使用批处理

  • 将模型转换为Python脚本

13.5.1. 图形建模器简介

典型的空间分析包括一系列GIS操作,其中一个操作的输出作为下一个操作的输入,直到生成最终结果。使用图形建模器, 您可以将这些单独的步骤组合到单个流程中。GM的接口允许您可视化地绘制输入、GIS算法和输出。然后,整个分析就可 以作为“处理工具箱”中自定义工具将类似于“处理工具箱”。在分配输入和命名输出之后,整个分析将在一个步骤中运行。

这种方法的一个主要优点是可以修改和重新运行已完成的分析工作流。这使涉众能够了解更改阈值或输入值如何影响分析 结果。假设你被指派为一家新咖啡店开发选址模型的任务。为了匹配一个场地选择标准,您将铁路缓冲了一公里。然而, 一位利益相关者后来会问你,如果将一公里的距离改为半公里,结果会如何变化。如果您用传统的逐步方法完成了最初的 分析,而不使用模型,那么您必须从头开始来回答这个问题。但是,如果将此问题作为模型开发,则只需更改工具中的 "distance"参数,然后重新运行整个场地选择模型。同样,选址模型也可以在不同的城市或社区运行,只需指向不同 (但等价)的输入层。该模型也可以与其他人共享。

13.5.2. 打开图形建模器

可以使用以下两种方法之一从QGIS桌面打开图形建模器:

  • 点击"Processing"下面的 Graphical Modeler

  • 通过启用"Processing Toolbox"面板,导航到 Models ‣ Tools ,然后单击 Create new model

处理建模器将作为新窗口打开。在窗口的左侧,有两个选项卡:“输入” 和 “算法” 。 它们用于将两种类型的元素添加到占据窗口其余部分的modeler画布中。 在modeler画布上方,有 [Enter model name here] 和 [Enter group name here] 输入框以输入模型名和组名。 可以在“输入和算法”选项卡上方找到用于管理模型的按钮,如下图所示 图 13.31

_images/image385_xuc.jpg

图 13.31 处理建模器

窗口本身被称为“处理建模器”,而不是图形建模器。

13.5.3. 配置建模并命名模型

在启动模型之前,配置建模器是一个很好的实践。模型以扩展名为.model的形式另存为JSON文件。 保存模型时,QGIS将提示您将模型文件保存到“模型”文件夹。您可以设置“模型”通过 导航到文件夹"Processing"选项在QGIS桌面上。在“处理选项”窗口的“模型”部分下,您可以指定“模型”文件夹的位置。 单击默认文件夹路径,将出现浏览(省略号)按钮,允许您选择其他位置,图 13.32

_images/image386_x8w.jpg

图 13.32 设置模型

为了演示使用图形建模器的基础知识,我们将使用一个简单的示例来标识阿拉斯加的河岸树。 它将有三个输入和两个算法。首先,我们将为模型命名和组名。对于本例,如下面的屏幕截图所示 图 13.33 。 我们打开了图形建模器并将模型命名为 "Riparian Trees" 模型组为 "Landcover" 。 这是将在 “处理工具箱” 中显示 模型的组合名称。

_images/image387_xsb.jpg

图 13.33 模型命名

违约模型文件夹。在这里,您需要为*.model文件。我们把它命名为RiparianTreeClipper.model。必须先设置模型名和组名,然后才能保存模型。 下图显示了保存模型对话框,如 图 13.34

_images/image388_xy7.jpg

图 13.34 保存模型

如果将模型保存到模型文件夹中,它们将作为模型工具显示在处理工具箱面板中显示为模型工具。将模型命名并将其保存到模型文件夹, 它将出现在处理工具箱中其所属的组下。同样,该模型将显示为带有在图形建模器中输入的名称,而不是*.model文件的名称。 可以将模型保存在模型文件夹,但它们不会出现在处理工具箱面板中。在模型出现在处理工具箱面板。下图显示“处理工具箱”, 其中模型部分是用Riparian Trees模型进行了扩展, 图 13.35

_images/image389_xan.jpg

图 13.35 模型工具箱

13.5.4. 将数据输入添加到模型

在第一个示例中,您将标识距离溪流(河岸树)100米范围内的森林部分。要开始一个模型,您需要定义输入。图形建模器将接受以下内容:

  • 布尔值

  • 范围

  • File

  • 栅格图层

  • 表字段

  • 矢量层

若要添加输入,请双击 Inputs 选项卡或将输入拖到"modeler"画布上。这个"Parameter definition"对话框将打开。 为参数命名并填写任何其他详细信息,这些信息会根据所选的输入而更改。当输入参数被定义并添加到模型中时,它本质上是一个概念参数。在 您准备好运行模型之前,它实际上不会连接到GIS数据层。对于这个例子,我们将添加一个矢量层。我们将指定矢量数据的几何结构并将其分类 为所需参数,如 图 13.36

_images/image390_x53.jpg

图 13.36 添加参数

单击 OK 后,输入对象将添加到modeler画布中。可以通过单击鼠标并拖动以重新定位modeler画布中的所有对象。点击输入的 铅笔图标将打开 "Parameter definition" 对话框,以便对其进行更改。点击 close 按钮( X )将从模型中删除输入。 对于我们的示例,我们将添加第二个矢量层。将树(森林)被添加为所需的多边形层。最后,我们将添加一个数字输入。这将允许我们将缓冲区距 离值公开为一个输入,在执行模型时可以更改该输入。它将被命名为"Buffer distance"它将被给予"默认值"属于100,因为100米是我们最初 想要使用的距离。在图形建模器中,距离以坐标系单位表示。下面的截图显示"参数定义"对话框,如前所述,如 图 13.37

_images/image391_xyb.jpg

图 13.37 参数定义

以下屏幕截图显示了具有两个矢量层输入和一个数字输入的模型,如 图 13.38

_images/image392_xez.jpg

图 13.38 具有三个输入模型

13.5.5. 向模型中添加算法

算法以与输入相同的方式添加到图形建模器中。从中查找算法 “算法” 选项卡中找到算法,然后双击它或将其拖到modeler画布上。 您可以像在“处理工具箱”中一样搜索工具。在“算法”选项卡顶部的搜索框中输入名称,如 图 13.39

_images/image393_xia.jpg

图 13.39 算法选项卡

在这里我们看到 “算法” 选项卡,其中缓冲区用作搜索项。在“算法”选项卡中,有一个特殊的类别名为 "Modeler-only tools" 计算器, 栅格图层边界和矢量层边界这三种工具未出现“处理工具箱”。它们是仅在图形建模器上下文中使用时才有意义的工具, 如 图 13.40

_images/image394_xu7.jpg

图 13.40 Modeler-only工具

这个“计算器”工具可能是三种工具中最常用的。它允许您对其他算法的数值输出执行算术计算。例如,如果使用统计输出工具之一,如栅格层 统计在您的模型中,或者如果您有数字输入,则关联的数字值将可用于"计算器"算法。计算器列出模型中可用的数值。它们从 a 到 x 标记, 并在右侧进行描述。下面是一个用于输入公式的文本框。例如,下面截图中给出的公式将 冠层密度 价值由猫头鹰栖息地英亩将结果与"栅格层 统计"算法。来自"计算器"算法可以被输入到其他算法中。如 图 13.41

_images/image395_x3a.jpg

图 13.41 计算器工具

“算法”对话框的外观与从“处理工具箱”运行该对话框的外观非常相似。 输入、工具参数和输出。但是,有一些重要的区别,区别如下:

  • 输入层仅限于已添加到模型中的层。

  • 如果输出是将用作另一个算法输入的中间结果,则可以将其留空。如果输出是需要保存的图层,请在文本框中输入该图层的名称。命名输 出层时,实际上不需要提供输出文件名。这将在工具运行时完成。相反,您只需要输入层的名称(例如, 流缓冲区 )

  • 数值或字符串值参数可以作为数字或字符串输入。它们也可以从Number或String 类型的其他输入中选择它们。

  • 属性表(或另一个独立表)的字段可以通过键入字段名或使用 “表字段” 输入。运行模型时将选择这些字段。

  • "Parent algorithms" 是仅在从图形建模器运行的工具中找到的附加参数。它允许您定义算法的执行顺序。将算法设置为父级将强制图形 建模器在运行当前算法之前执行此父级算法。将一个算法的输出设置为下一个算法的输入时,会自动将第一个算法设置为父算法。但是,在复 杂模型中,可能有多个分支,可能需要在模型的单独分支中完成某个操作,然后才能运行另一个操作。

  • 在这个例子中,我们将缓冲流100米,然后通过缓冲层裁剪树。我们要添加的第一个算法是 "Fixed distance buffer" 。 双击工 具 Algorithms 选项卡和工具对话框将打开。工具将像下面的屏幕截图一样填充,如 图 13.42 。 注意,不是设置显式缓冲区距离,而是 缓冲距离 正在使用输入。另外,请注意,由于此输出将被视为中间数据集,因此不命名任何输出。

_images/image396_xm9.jpg

图 13.42 Fixed distance buffer算法

接下来,我们将添加 "Clip" 使用以下参数创建模型的工具:

  • 设置 "Input layer" 字段到 "Trees"。

  • 设置 "Clip layer" 字段到 "Fixed distance buffer" 算法中的 "Buffer" 。

  • 在Clipped <OutputVector>下键入河岸树。

  • 最后,OK

完成的工具对话框如下所示,如 图 13.43

_images/image397_xzv.jpg

图 13.43 Clip工具

最终的模型看起来如下面的截图,如 图 13.44 。连接线显示了工作流中元素的连接方式。输入、输出和算法元素有 不同的颜色框,以便可以区分它们。算法框还将包含表示源库的图标。例如 "Fixed distance buffer" 和 "Clip tools" QGIS算法和Q 元素框中的图标。

_images/image398_x74.jpg

图 13.44 模型

13.5.6. 运行模型

模型可以从 "Processing modeler" 窗口或从 "Processing Toolbox" 面板。从 "Processing modeler" 窗口,单击 Run model 按钮。从 "Processing Toolbox" 面板运行模型,首先保存并关闭模型。然后,通过导航到 Processing Toolbox ‣ Models , 右键单击它,然后从上下文菜单中选择 :guilabel:`Execute 。在我们的示例中,该模型将在Landcover组中找到,如 图 13.45

_images/image399_xqe.jpg

图 13.45 模型工具

将打开“模型”对话框,其中包含列出的输入。对于数据层输入,可以使用下拉箭头选择加载到QGIS中的数据,也可以使用浏览按钮找到磁盘上的数据。在本例中, 我们使用 "AKrivers.shp" 以及 "trees.shp" 样本数据。这个 "Buffer distance" 字段设置为 100 因为这是数字输入的默认值。对于输出,可以 选择将图层作为临时图层,也可以为其选择位置和文件名。在这里,数据被保存为 "shapefile" 。点击 Run 以执行模型, 如 图 13.46

_images/image400_xyp.jpg

图 13.46 运行模型

当模型运行时,对话框将切换到 Log 选项卡,在运行时提供输出,如 图 13.47

_images/image401_xst.jpg

图 13.47 Log选项卡

13.5.7. 编辑模型

现有的QGIS模型可以根据需要进行修改。在“处理工具箱”面板中右键单击模型会打开一个上下文菜单。选择 Edit model 将 在 "Processing modeler" 窗户中打开模型。也可以通过单击 Delete model 在此处删除模型,如 图 13.48

_images/image402_xjm.jpg

图 13.48 编辑删除模型

如果模型在 "Processing modeler" 窗口中打开了模型,可以修改各个模型的输入和算法。正如我们在本章的“将输入添加到模型”部分中提到的那样, 单击模型输入的铅笔图标将打开 "Parameter definition" 对话框以便进行更改。点击 close 按钮( X )将从模型中删除输入, 如 图 13.49

_images/image403_xpr.jpg

图 13.49 更改模型

在modeler画布中,可以通过单击 + 在算法的上方和下方来显示有关算法参数的信息。这是一种查看算法参数的便捷方法,无需打开每个算法。 右键单击一个算法会打开一个上下文菜单,如下图所示 图 13.50 。点击 Remove 从模型中删除算法, 只要不存在依赖于其输出的其他算法。

_images/image404_x9v.jpg

图 13.50 编辑模型

如果尝试在工作流的中间删除算法,将看到以下消息。在删除算法之前,必须删除从属下游元素,如 图 13.51

_images/image405_x9j.jpg

图 13.51 删除模型

从算法上下文菜单中单击 Edit ,将打开“算法”对话框,以便可以对模型进行更改。编辑算法后, 将更新到画布中其他模型元素的连接。点击 + 算法上方和下方的标志也将更新,如 图 13.52

_images/image406_xi2.jpg

图 13.52 编辑算法

从算法上下文菜单中单击 Deactivate 将停用该算法以及所有依赖于该算法的下游算法。 通过右击并选择 Activate 。执行此操作时,必须单独重新激活先前停用的任何其他下游算法。

13.5.8. 记录模型

可以通过单击 Edit 模型帮助按钮( image388 )在 处理建模器 窗户。这将打开 帮助编辑器 有三个嵌板的窗户。 顶部是一个HTML页面,其中有 算法描述 ,“输入参数” 和 “输出” 部分。在左下角,有一个元素选择框,在右下角有一个文本输入框。 若要编辑元素,请在 选择要编辑的元素 盒子。选择后,使用 元素描述 键入说明或必要文档的框。点击 OK 完成时, 如 图 13.53

_images/image407_x8b.jpg

图 13.53 帮助编辑器

此帮助信息将在 "Help" 选项卡当工具处于执行模式时,如 图 13.54

_images/image408_xyr.jpg

图 13.54 帮助

13.5.9. 保存、加载和导出模型

单击处理建模器窗口中的 Save 按钮,可以随时保存模型,在做模型的时候,最好尽早并且经常地储蓄。正如我们在配置modeler并命名模型 第一次保存模型时,系统将提示您命名模型文件。后续保存更新现有*.model文件。还有一个 Save as 按钮可用于保存模型的新版本的。 未保存到Modeler文件夹可以使用以下两种方法之一打开:

  • 通过启用 “处理工具箱” 面板,导航到 Models ‣ Tools , 然后双击 Add model from file

  • 通过使用 “处理建模器” 窗口,然后单击 Open model

在任何情况下,导航到*.model文件。模型也可以导出为图像文件。如果需要在报表中显示或包含工作流,则此功能非常有用。 要导出模型,请在处理建模器窗户单击 Export as image 。模型将保存为PNG文件。QGIS现在有一个可以加载的模型和脚本的在线集合。 从处理工具箱面板,导航到 Models ‣ Tools 然后双击 Processing Toolbox 从联机脚本集合。 这个 "Get scripts" 和 "models" 窗户会打开的。选择要加载的模型并单击 OK 。 新模型将加载到 模型 剖面图 处理工具箱 下面的面板 "Example models" 小组。 QGIS用户将不断扩展这些在线模型,如 图 13.55

_images/image409_xzn.jpg

图 13.55 Example models小组

13.5.10. 迭代执行模型算法

像所有的QGIS算法一样,模型可以迭代执行。在这里,我们将用一个QGIS示例模型演示此功能 " DEM s_Clipped_to_Watersheds.model" 。 我们将使用两个输入,一个覆盖新墨西哥州陶斯的 DEM 和一个该地区的流域多边形层。 将使用 "elevation.tif" 和 "watersheds.shp" 样本数据,如 图 13.56

_images/image410_xam.jpg

图 13.56 watersheds和 DEM 数据

这个模型只有一个算法。它使用 用多边形剪裁网格工具将将 DEM 剪裁到流域。这一地区有21个流域,如 图 13.57

_images/image411_xfu.jpg

图 13.57 多边形剪裁网格工具

如果模型正常运行,它会将 DEM 剪裁到所有21个流域的范围内,并生成一个输出高程栅格。 但是,如果单击 Iterate over this layer 按钮,请参见以下屏幕截图,如 图 13.58 。 模型将循环浏览流域图层中的每个要素,并输出覆盖每个单独流域的 DEM 。这将导致21个单独的高程栅格。 这种自动化非常容易生成,可以节省大量时间:

_images/image412_xts.jpg

图 13.58 Iterate over this layer按钮

下图显示了生成的21个 DEM ,这些 DEM 被剪裁到各个流域,如 图 13.59

_images/image413_xn2.jpg

图 13.59 21个裁剪的 DEM

13.5.11. 嵌套模型

如前所述,当模型保存到 “模型” 文件夹,它将出现在 “处理工具箱” 面板的 “模型” 类别中 。 我们之前没有提到的是它还将显示在“处理建模器”窗口的“算法”选项卡中。 这意味着先前编写的模型可以用作另一个模型中的算法。

如果模型的某些组件算法不可用,则模型不会显示为算法。如果算法提供程序在 提供者 , 您可以通过导航到:menuselection:Processing --> Options 。例如,如果您在模型中使用了 SAGA 工具, 但随后停用了 SAGA 工具,则该模型将不可用。只要模型中的所有算法在 “处理工具箱” 面板,一个模型将作为一个算法可用。

为了演示这个功能,我们将在上一节中使用的模型的基础上进行构建。模型按流域边界剪裁高程数据。 使用 DEM ,可以生成名为 “地形湿度指数 ( TWI )”。 以下屏幕快照中显示的QGIS示例模型(TWI_from_DEM.model)接受一个输入, 即 DEM 。如 图 13.60 。根据这个输入,它生成斜坡和集水区。然后这些进入地形湿度指数算法:

_images/image414_x9n.jpg

图 13.60 TWI_from_DEM.model

首先,我们将创建 DEM 夹在分水岭上 Save as 按钮。 我们将命名这个新的模型文件 "TWI_for_watersheds.model" 。 我们将这个新模型文件命名为 "TWI_for_watersheds.model" 。 TWI From DEM 模型位于“算法”选项卡中,并作为算法添加到我们的新模型中。 (请记住,模型需要保存到“模型”文件夹中才能显示为算法。) 您将注意到,TWI From DEM 算法的建模器画布中的模型图标将算法标识为模型,如 图 13.61

_images/image415_xya.jpg

图 13.61 TWI From DEM 算法

DEM 将被剪裁到分水岭层,剪裁后的 DEM 将被输入到 "TWI From DEM " 算法。 这将创建一个输出,一个覆盖流域的TWI栅格。但是,如果 "Iterate over this layer" 使用设置时, 则 DEM 将剪裁到21个流域中的每个流域,并计算每个流域的TWI。这将在同一模型中同时使用嵌套模型和迭代功能,如 图 13.62

_images/image416_xir.jpg

图 13.62 TWI From DEM 运行

下图显示了使用迭代器功能的“单个流域”嵌套模型的TWI的输出,如 图 13.63

_images/image417_x9w.jpg

图 13.63 单个流域

从版本QGIS 2.6开始,您可以拥有任意多个层次的嵌套模型。没有限制!

13.5.12. 对模型使用批处理

与其他处理算法一样,模型也可以在批处理模式下使用。为此,只需在 处理工具箱 面板,右键单击它, 然后选择 "Execute as batch process" ,如下图所示,如 图 13.64

_images/image418_xbt.jpg

图 13.64 Execute as batch process

该工具的操作将与QGIS中的任何其他地理算法一样。你可以点击 Add rows ,:guilabel:` Delete rowsDelete rowsRun 。利用该方法,该模型可用于不同地理位置的数据集。在必须对文件集合重复几个地理处理步骤的情况下, 如 图 13.65 。此技术也很有用:

_images/image419_x6s.jpg

图 13.65 Add rows算法

13.5.13. 将模型转换为Python脚本

还可以自动创建与模型本身执行相同任务的Python代码。 然后可以使用该代码创建控制台脚本。 可以修改该脚本以合并图形建模器中不可用的操作和方法,例如循环或条件语句。 这个特性也是一个非常实用的方法:A、开始学习Python,B、从控制台使用处理算法,C、使用Python代码创建新算法。 当你开始创建自己的脚本时,你可以把它作为一个学习工具。 要将模型保存为Python,请单击 Export as Python script 工具。 对话框将提示您选择要保存脚本的位置。 注意:本主题在后面会用PyQGIS创建QGIS插件及问题解决。

13.5.14. 总结

在本章中,我们介绍了使用QGIS图形建模器自动化工作流。我们向您展示了如何设置、编辑、记录和运行模型。 您学习了如何将输入和算法添加到模型中。我们还介绍了如何迭代执行模型、 在模型中嵌套模型以及在批处理模式下运行模型。到目前为止,您应该了解如何处理各种矢量、 栅格和表格数据。您还应该精通QGIS的地理处理和分析功能。

在下一章中,我们将从使用图形建模器和处理工具箱进行分析切换到使用Python扩展QGIS的功能。 在第十章,用PyQGIS创建QGIS插件及问题解决,您将学习如何从头开始创建QGIS插件。 本章将从PyQGIS入门开始。您将了解在哪里可以获得API信息和其他PyQGIS帮助。 然后我们将探索插件文件结构和可用的功能。本章将以编写QGIS插件的一个简单的逐步示例结束。 这还将包括有关调试代码的信息。