通过Python运行处理算法(QGIS3)

QGIS 中的处理工具箱包含不断增长的地理处理工具集合。该工具箱提供了一个简单的批处理界面,可以在大量输入上运行任何算法。参见 使用处理框架进行批次处理 (QGIS3) 。但是在某些情况下,您需要在批处理中合并一些自定义逻辑。由于所有处理算法都可以通过 Python API 以编程方式运行,因此您可以通过 Python 控制台运行它们。本教程展示了如何通过 Python 控制台运行处理算法,以仅几行代码即可执行自定义地理处理任务。请查看 Python 程式设计入门 (QGIS3) 教程,以熟悉 QGIS 中 Python 脚本环境的基础。

任务概述

我们将使用12个栅格化栅格图层来表示一年中每个月的降雨量,并计算西雅图地区所有邮政编码的平均每月降雨量。

您将会学习的其他技能

  • 如何从向量图层中删除列(即字段)。

获取数据

The PRISM Climate Group 收集气候观测资料,并为美国本土提供历史和当前的气候数据。转到 Recent Years 数据页面,并以 BIL 格式下载2017年的月降水量数据。

../../_images/data14.png

City of Seattle Open Data portal 提供了该城市的免费开放数据。搜索并下载 shapefile 格式的 Zip Codes 数据。

为了方便起见,您可以直接从下面的链接下载两个数据集的副本:

PRISM_ppt_stable_4kmM3_2017_all_bil.zip

Zip_Codes.zip

数据源 [PRISM] [CITYOFSEATTLE]

程序

  1. 解压缩 PRISM_ppt_stable_4kmM3_2017_all_bil.zip 文件。在 QGIS 浏览器中找到 PRISM_ppt_stable_4kmM3_2017_all_bil 文件夹并展开它。该文件夹每个月包含12个单独的层。按住 Ctrl 键,然后选择所有12个月的 .bil 文件。选定后,将它们拖到画布上。

../../_images/1105.png

注解

数据在 BIL format 中提供。每层都有一组包含实际数据的文件 .bil 文件,描述数据结构的 .hdr 文件和包含投影信息的 .prj 文件。QGIS可以加载 .bil 文件,并提供其他文件在同一目录中。

  1. 接下来,解压缩 Zip_Codes.zip 文件并将 shapefile 提取到文件夹中。找到 Zip_Codes 文件夹并展开它。将 Zip_Codes.shp 文件拖到画布上。

../../_images/258.png
  1. 右键单击 Zip_Codes 图层,然后选择 Zoom to Layer 。您将看到西雅图市和邻近地区的邮政编码多边形。

../../_images/336.png
  1. 进入 Processing ‣ Toolbox

../../_images/421.png
  1. 使用矢量多边形对栅格图层进行采样的算法称为 Zonal statistics 。在 Processing Toolbox 中搜索算法。选择算法,然后将鼠标悬停在该算法上。您将看到带有文本 Algorithm ID: ‘qgis:zonalstatistics’ 的工具提示请注意,通过 Python API 调用此算法将需要此 ID 。双击 Zonal Statistics 算法以启动它。

../../_images/521.png
  1. 我们将对单层算法进行手动测试。这是检查算法性能是否达到预期效果的有用方法,也是查找通过 Python 使用算法时如何将相关参数传递给算法的简便方法。在 Zonal Statistics 对话框中,选择 PRISM_ppt_stable_4kmM3_201701_bil 作为 Raster Layer ,并选择 Zip_Codes 作为 Vector layer containing zones 。将其他参数保留为默认值。单击 Statistics to calculate 旁边的 按钮进行计算并仅选择 Mean 。点击 Run

../../_images/621.png
  1. 算法完成后,切换到 Log 标签。记下传递给该算法的 Input Parameters 。点击 Close

../../_images/720.png
  1. 让我们检查测试运行的结果。在 QGIS 主窗口中,右键单击 Zip_Codes 层,然后选择 Open Attribute Table 。此特定算法会就地修改输入区域层,并为所选的每个统计信息添加新列。 由于我们仅选择了 平均值 值,因此将一个名为 _mean 的新列添加到表中。 _ 是默认前缀。当我们为每个月的图层运行该算法时,用月号指定自定义前缀会很有用,这样我们就可以轻松确定每个月的平均值(即01_mean,02_mean等)。在 QGIS 的批处理界面中无法指定此自定义前缀,并且如果我们使用该接口运行此命令,则必须手动为每一层输入自定义前缀。如果要处理大量的图层,这可能会很麻烦。因此,我们可以使用 Python API 添加此自定义逻辑,并在每个层的 for-loop 中运行该算法。

../../_images/820.png
  1. 在继续之前,让我们删除在测试运行期间创建的 _mean 列。点击 Toggle Editing mode 按钮,然后点击 Delete field 按钮。选择 _mean 字段并单击 OK

../../_images/920.png
  1. 再次单击 Toggle Editing mode 按钮,然后 Save 更改。

../../_images/1020.png
  1. 回到 QGIS 主窗口中,进入 Plugins ‣ Python Console

../../_images/1123.png
  1. 要通过 Python 运行处理算法,我们需要访问所有层的名称。 在 Python Console 中输入以下代码,然后按 Enter 。 您将看到控制台中打印的所有层的名称。

root = QgsProject.instance().layerTreeRoot()
for layer in root.children():
  print(layer.name())
../../_images/121.gif
  1. 要添加自定义前缀,我们需要查看图层名称并提取代表月份数字的子字符串。输入以下代码以遍历所有栅格图层,提取自定义前缀并使用它运行 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)
../../_images/131.gif
  1. 处理完成后,右键单击 Zip_Codes 层,然后选择 Open Attribute Table

../../_images/1419.png
  1. 您将看到12个新列添加到表中,其中包含自定义前缀和从栅格图层提取的平均降水量值。

../../_images/1518.png