(17)栅格数据处理技巧

本文由SCY原创,转载注明出处。

本文主要讲解Rterra包的使用技巧,包括数据导入,批量处理,绘图,导出等内容

数据导入

1
library(terra)

对SpatRaster的每个单元格应用函数

描述:对SpatRaster的每个单元格的值应用函数。类似于apply函数,可以将SpatRaster中的每个图层看作是矩阵中的列(或行)。

通常用于将多个图层的值汇总到一个图层中,但也不必。

app调用函数fun,并将栅格数据作为第一个参数。根据提供的函数,栅格数据表示为矩阵,其中每个图层都是一列,或表示单元格的向量。函数应返回可被ncell(x)整除的向量或矩阵。因此,可以使用sumrowSums,但不能使用colSums

还可以通过SpatRasterDataset的图层应用函数fun跨数据集。在这种情况下,汇按图层汇总SpatRasters

用法:

1
2
3
4
5
## 'SpatRaster'
app(x, fun, ..., cores=1, filename="", overwrite=FALSE, wopt=list())

## 'SpatRasterDataset'
app(x, fun, ..., cores=1, filename="", overwrite=FALSE, wopt=list())

参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
x       # SpatRaster或SpatRasterDataset

fun # 对向量或矩阵操作的函数。这可以是在基本R或包中定义的函数,也可以是您自己编写的函数(请参阅示例)。返回复杂输出(例如列表)的函数可能需要包装在自己的函数中,以将输出简化为向量或矩阵。以下函数已经以C++重新实现以提高速度:`sum`、`mean`、`median`、`modal`、`which`、`which.min`、`which.max`、`min`、`max`、`prod`、`any`、`all`、`sd`、`std`、`first`。要使用基本R函数,例如“min”,您可以使用类似于fun=function(i) min(i)的方式,或等价的fun = \(i) min(i)

... # fun的其他参数。通常是数值常数。绝对不应该是另一个SpatRaster。

cores # 正整数。如果cores > 1,则创建并使用具有指定核心数的'parallel'包集群。您还可以提供集群对象。对于由terra在C++中实现的函数(请参见fun下面的部分),此参数将被忽略。

filename # 字符。输出文件名

overwrite # 逻辑值。如果为TRUE,则覆盖filename

wopt # 具有命名选项的列表,用于写文件,就像在writeRaster中一样

详情:
为了加快速度,支持并行运算,但这没什么帮助,实际上可能会更慢。只有当您拥有许多核心(> 8)或非常复杂(慢)的fun函数时,才会有速度增益。如果您自己编写fun,请考虑提供一个使用Rcpp包制作的cppFunction,而不是手动编写fun

值:
SpatRaster

另请参阅:
lapp、tapp、Math-methods、roll

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
r <- rast(ncols=10, nrows=10)
values(r) <- 1:ncell(r)
x <- c(r, sqrt(r), r+50)
s <- app(x, fun=sum)
s
# 对于一些通用函数,如
# "sum"、"mean"和"max",您还可以这样做
sum(x)

## SpatRasterDataset
sd <- sds(x, x*2, x/3)
a <- app(sd, max)
a
# 与下面一样
max(x, x*2, x/3)
# 也与下面一样(但较慢)
b <- app(sd, function(i) max(i))

## 还适用于单个图层
f <- function(i) (i+1) * 2 * i + sqrt(i)
s <- app(r, f)
# 与上面相同,但内存不安全
# 并且没有filename参数
s <- f(r)

## Not run:
#### 多核心
test0 <- app(x, sqrt)
test1 <- app(x, sqrt, cores=2)

testfun <- function(i) { 2 * sqrt(i) }
test2 <- app(x, fun=testfun, cores =2)

## 这会失败,因为testfun未导出到节点
# test3 <- app(x, fun=function(i) testfun(i), cores=2)
## 要导出它,请将其作为参数添加到fun中
test3 <- app(x, fun=function(i, ff) ff(i), cores =3, ff=testfun)

## End(Not run)
-------------已经到底啦-------------