17.28. 执行前和执行后脚本挂钩

备注

本课介绍如何使用执行前和执行后挂钩,这些挂钩允许在实际处理之前和之后执行其他操作。

执行前和执行后挂钩是在执行实际数据处理之前和之后运行的处理脚本。这可用于自动执行在执行算法时应执行的任务。

钩子的语法与处理脚本的语法相同,请参阅相应的 chapter 有关更多详细信息,请参阅QGIS用户指南。

除了所有脚本功能之外,在钩子中还可以使用一个名为 alg ,它表示刚刚执行(或即将执行)的算法。

以下是一个执行后脚本示例。默认情况下,处理将分析结果存储在临时文件中。此脚本会将输出复制到特定目录,因此在关闭QGIS后不会删除它们。

import os
import shutil
from processing.core.outputs import OutputVector, OutputRaster, OutputFile

MY_DIRECTORY = '/home/alex/outputs'

for output in alg.outputs:
    if isinstance(output, (OutputVector, OutputRaster, OutputFile)):
        dirname = os.path.split(output.value)[0]
        shutil.copytree(dirname, MY_DIRECTORY)

在前两行中,我们导入所需的Python包: os -用于路径操作,例如提取文件名,以及 shutil -用于各种文件系统操作,如复制文件。在第三行中,我们导入处理输出。这一点将在本课后面更详细地解释。

然后,我们定义一个 MY_DIRECTORY 常量,它是我们要复制分析结果的目录的路径。

在脚本的末尾,我们有主钩子代码。在循环中,我们迭代所有算法输出,并检查该输出是否是基于文件的输出并且可以复制。如果是,我们确定输出文件所在的顶级目录,然后将所有文件复制到我们的目录中。

要激活这个钩子,我们需要打开处理选项,找到名为 Post-execution script fileGeneral 组,并在其中指定挂钩脚本的文件名。指定的钩子将在每个处理算法之后执行。

以类似的方式,我们可以实现执行前挂钩。例如,让我们创建一个挂钩来检查输入向量的几何错误。

from qgis.core import QgsGeometry, QgsFeatureRequest
from processing.core.parameters import ParameterVector

for param in alg.parameters:
    if isinstance(param, ParameterVector):
        layer = processing.getObject(param.value)
        for f in layer.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([])):
            errors = f.geometry().validateGeometry()
            if len(errors) > 0:
                progress.setInfo('One of the input vectors contains invalid geometries!')

与前面的示例一样,首先我们导入所需的QGIS和处理包。

然后,我们迭代所有算法参数,如果找到参数矢量参数,则从中获得相应的矢量层对象。我们循环遍历该层的所有要素,并检查它们的几何错误。如果至少有一个特征包含无效的几何图形,我们将打印一条警告消息。

要激活此钩子,我们需要在 Pre-execution script file “处理配置”对话框中的选项。钩子将在运行任何处理算法之前执行。