通过Python运行处理算法(QGIS3)¶
QGIS 中的处理工具箱包含不断增长的地理处理工具集合。该工具箱提供了一个简单的批处理界面,可以在大量输入上运行任何算法。参见 使用处理框架进行批次处理 (QGIS3) 。但是在某些情况下,您需要在批处理中合并一些自定义逻辑。由于所有处理算法都可以通过 Python API 以编程方式运行,因此您可以通过 Python 控制台运行它们。本教程展示了如何通过 Python 控制台运行处理算法,以仅几行代码即可执行自定义地理处理任务。请查看 Python 程式设计入门 (QGIS3) 教程,以熟悉 QGIS 中 Python 脚本环境的基础。
获取数据¶
The PRISM Climate Group 收集气候观测资料,并为美国本土提供历史和当前的气候数据。转到 Recent Years 数据页面,并以 BIL 格式下载2017年的月降水量数据。
City of Seattle Open Data portal 提供了该城市的免费开放数据。搜索并下载 shapefile 格式的 Zip Codes 数据。
为了方便起见,您可以直接从下面的链接下载两个数据集的副本:
程序¶
解压缩
PRISM_ppt_stable_4kmM3_2017_all_bil.zip
文件。在 QGIS 浏览器中找到PRISM_ppt_stable_4kmM3_2017_all_bil
文件夹并展开它。该文件夹每个月包含12个单独的层。按住 Ctrl 键,然后选择所有12个月的.bil
文件。选定后,将它们拖到画布上。
注解
数据在 BIL format 中提供。每层都有一组包含实际数据的文件 .bil
文件,描述数据结构的 .hdr
文件和包含投影信息的 .prj
文件。QGIS可以加载 .bil
文件,并提供其他文件在同一目录中。
接下来,解压缩
Zip_Codes.zip
文件并将 shapefile 提取到文件夹中。找到Zip_Codes
文件夹并展开它。将Zip_Codes.shp
文件拖到画布上。
右键单击
Zip_Codes
图层,然后选择 Zoom to Layer 。您将看到西雅图市和邻近地区的邮政编码多边形。
进入
。
使用矢量多边形对栅格图层进行采样的算法称为
Zonal statistics
。在 Processing Toolbox 中搜索算法。选择算法,然后将鼠标悬停在该算法上。您将看到带有文本 Algorithm ID: ‘qgis:zonalstatistics’ 的工具提示请注意,通过 Python API 调用此算法将需要此 ID 。双击Zonal Statistics
算法以启动它。
我们将对单层算法进行手动测试。这是检查算法性能是否达到预期效果的有用方法,也是查找通过 Python 使用算法时如何将相关参数传递给算法的简便方法。在 Zonal Statistics 对话框中,选择
PRISM_ppt_stable_4kmM3_201701_bil
作为 Raster Layer ,并选择Zip_Codes
作为 Vector layer containing zones 。将其他参数保留为默认值。单击 Statistics to calculate 旁边的 … 按钮进行计算并仅选择Mean
。点击 Run 。
算法完成后,切换到 Log 标签。记下传递给该算法的 Input Parameters 。点击 Close 。
让我们检查测试运行的结果。在 QGIS 主窗口中,右键单击
Zip_Codes
层,然后选择 Open Attribute Table 。此特定算法会就地修改输入区域层,并为所选的每个统计信息添加新列。 由于我们仅选择了平均值
值,因此将一个名为_mean
的新列添加到表中。_
是默认前缀。当我们为每个月的图层运行该算法时,用月号指定自定义前缀会很有用,这样我们就可以轻松确定每个月的平均值(即01_mean,02_mean等)。在 QGIS 的批处理界面中无法指定此自定义前缀,并且如果我们使用该接口运行此命令,则必须手动为每一层输入自定义前缀。如果要处理大量的图层,这可能会很麻烦。因此,我们可以使用 Python API 添加此自定义逻辑,并在每个层的 for-loop 中运行该算法。
在继续之前,让我们删除在测试运行期间创建的
_mean
列。点击 Toggle Editing mode 按钮,然后点击 Delete field 按钮。选择_mean
字段并单击 OK 。
再次单击 Toggle Editing mode 按钮,然后 Save 更改。
回到 QGIS 主窗口中,进入
。
要通过 Python 运行处理算法,我们需要访问所有层的名称。 在 Python Console 中输入以下代码,然后按 Enter 。 您将看到控制台中打印的所有层的名称。
root = QgsProject.instance().layerTreeRoot() for layer in root.children(): print(layer.name())
要添加自定义前缀,我们需要查看图层名称并提取代表月份数字的子字符串。输入以下代码以遍历所有栅格图层,提取自定义前缀并使用它运行
qgis:zonalstatistics
算法。
root = QgsProject.instance().layerTreeRoot() for layer in root.children(): if layer.name().startswith('PRISM'): prefix = layer.name()[-6:-4] params = {'INPUT_RASTER': layer.name(), 'RASTER_BAND': 1, 'INPUT_VECTOR': 'Zip_Codes', 'COLUMN_PREFIX': prefix+'_', 'STATS': 2} processing.run("qgis:zonalstatistics", params)
处理完成后,右键单击
Zip_Codes
层,然后选择 Open Attribute Table 。
您将看到12个新列添加到表中,其中包含自定义前缀和从栅格图层提取的平均降水量值。