17.10. 栅格式计算器。无数据值

备注

在这一课中,我们将学习如何使用栅格计算器对栅格层执行一些操作。我们还将解释什么是无数据值,以及计算器和其他算法如何处理它们

栅格计算器是你能找到的最强大的算法之一。这是一种非常灵活和通用的算法,可以用于许多不同的计算,而且很快就会成为您工具箱的重要组成部分。

在这一课中,我们将使用栅格计算器执行一些计算,其中大多数计算都相当简单。这将让我们看到它是如何使用的,以及它如何处理它可能发现的一些特殊情况。了解这一点对于以后使用计算器时获得预期结果以及了解常用的某些技术非常重要。

打开与本课对应的QGIS项目,您将看到它包含多个栅格层。

现在打开工具箱,打开与栅格计算器对应的对话框。

../../../_images/calculator_dialog.png

备注

在最近的版本中,界面有所不同。

该对话框包含两个参数。

  • 要用于分析的层。这是一个多个输入,这意味着您可以选择任意多个层。单击右侧的按钮,然后选择要在将出现的对话框中使用的层。

  • 要应用的公式。该公式使用在上面的参数中选择的层,这些层使用字母命名 (a, b, c...) or g1, g2, g3... 作为变量名。也就是说,这个公式 a + 2 * b 与之相同 g1 + 2 * g2 并将计算第一层中的值加上第二层中的值的两倍之和。层的顺序与您在选择对话框中看到的顺序相同。

警告

该计算器区分大小写。

首先,我们将DEM的单位从米改为英尺。我们需要的公式如下:

h' = h * 3.28084

在Layers字段中选择DEM,然后输入 a * 3.28084 在公式字段中。

警告

对于非英语用户:始终使用“.”,而不是“,”。

单击 Run 来运行算法。您将获得一个与输入层具有相同外观但值不同的层。我们使用的输入层在其所有单元格中都有有效值,因此最后一个参数根本不起作用。

现在让我们执行另一个计算,这一次是在 accflow 一层。这一层包含累积流量的值,这是一个水文参数。它只包含给定分水岭区域内的那些值,而不包含该分水岭以外的数据值。正如您所看到的,由于值的分布方式,呈现信息不是很丰富。使用该流量累积的对数将产生更具信息量的表示。我们可以使用栅格计算器进行计算。

再次打开算法对话框,选择 accflow Layer作为唯一的输入层,然后输入以下公式: log(a)

这是您将获得的层。

../../../_images/log.png

如果您选择 Identify 工具要知道某个层在给定点的值,请选择我们刚刚创建的层,然后单击流域外的一个点,您将看到它包含一个无数据值。

../../../_images/identify.png

在下一个练习中,我们将使用两个层而不是一个层,并且我们将获得仅在第二个层中定义的流域内具有有效高程值的DEM。打开计算器对话框并在输入层字段中选择项目的两个层。在相应的字段中输入以下公式:

a/a * b

a 指的是累积流层(因为它是列表中第一个出现的层)和 b 指的是DEM。我们在公式的第一部分中所做的是将累积流动层除以其本身,这将导致盆地内部的值为1,而外部的值为无数据值。然后乘以DEM,得到盆地内部像元中的高程值 (DEM * 1 = DEM )和外部的no--data值 (DEM * no_data = no_data )

这是生成的层。

../../../_images/masked.png

这种技术经常被用来 mask 值,并且在要对栅格图层使用的任意矩形区域以外的区域执行计算时非常有用。例如,栅格图层的高程直方图没有多大意义。如果只使用与盆地对应的值来计算它(如上面的情况),我们获得的结果是一个有意义的结果,它实际上给出了关于盆地配置的信息。

除了无数据值和如何处理它们之外,我们刚刚运行的这个算法还有其他有趣的事情。如果你看一看我们相乘的层的范围(你可以这样做--在内容列表中双击它们的名称并查看它们的属性),你会发现它们是不同的,因为流量累积层覆盖的范围比整个DEM的范围小。

这意味着这些层不匹配,如果不通过对一个或两个层进行重新采样来使这些大小和范围均匀,则无法直接相乘。然而,我们没有做任何事情。QGIS会处理这种情况,并在需要时自动对输入图层进行重新采样。输出范围是根据输入层计算的最小覆盖范围,以及其像元大小的最小像元大小。

在这种情况下(以及在大多数情况下),这会产生所需的结果,但您应该始终注意正在进行的其他操作,因为它们可能会影响结果。如果此行为可能不是所需的,则应提前应用手动重采样。在后面的章节中,我们将看到更多关于使用多个栅格层时算法行为的内容。

让我们用另一个掩饰练习来结束本课。我们要计算海拔在1000米到1500米之间的所有地区的坡度。

在本例中,我们没有要用作遮罩的层,但可以使用计算器创建它。

使用DEM作为唯一输入图层并使用以下公式运行计算器

ifelse(abs(a-1250) < 250, 1, 0/0)

正如您所看到的,我们不仅可以使用计算器进行简单的代数运算,还可以运行涉及条件语句的更复杂的计算,就像上面的那个。

结果在我们要处理的范围内的值为1,而在该范围外的单元格中没有数据。

../../../_images/elevation_mask.png

无数据值来自0/0表达式。由于这是一个未确定的值,因此saga将添加一个NaN(而不是数字)值,该值实际上被作为无数据值处理。使用这个小技巧,您可以设置一个无数据值,而不需要知道单元格的无数据值是什么。

现在,您只需将其乘以项目中包含的坡度层,就会得到所需的结果。

所有这些都可以用计算器在一次操作中完成。我们将其作为练习留给读者。