使用R基于另一个栅格的特定值从栅格中提取像素

时间:2016-01-16 11:28:41

标签: r dataframe raster r-raster

我使用A函数在R中导入了两个栅格(栅格B)raster。 我想将AB等于1的像素提取到数据帧中。 我尝试以下操作,但是,我获得的所有像素都具有相同的值,尽管它们在原始数据集中是不同的。

两个栅格具有相同的尺寸(ncols,nrows,ncell,分辨率,范围,投影)。

library(raster)
library(rgdal)

# import inputs
A <- raster('/pat/to/rasterA.tif')
B <- raster('/pat/to/rasterB.tif')

# extract raster values from A over raster B where B == 1
mydata <- data.frame(A[B[B == 1]])

编辑1

当我A[B[B == 1]]时,来自RasterLayer的对象A和B的类可能变为numeric,这会产生问题吗?我通过class(A[B[B == 1]])发现了这一点,它提供了numeric

编辑2

好的,这很奇怪。我尝试mydata <- data.frame(A[B]),现在输出只有A位置的原始B == 1。在尝试从A中提取所有像素之前尝试这一点(正如我所料)。我可以通过计算B中的数量和mydata中的元素数量来确定它是正确的,这是相同的。就像索引已跳过B中的所有零一样。谁能解释一下呢?

2 个答案:

答案 0 :(得分:3)

请在以下问题中包含一些示例数据:

library(raster)
r <- raster(nrow=5, ncol=5, xmn=0, xmx=1, ymn=0, ymx=1)
set.seed(1010)
A <- setValues(r, sample(0:5, ncell(r), replace=TRUE))
B <- setValues(r, sample(0:2, ncell(r), replace=TRUE))

现在你可以做到:

s <- stack(A,B)
v <- as.data.frame(s)
v[v[,2] == 1, 1]

或者

A[B==1]

或者

D <- overlay(A, B, fun=function(x,y){ x[y!=0] <- NA; x})
na.omit(values(D))

xy <- rasterToPoints(B, function(x) x == 1)
extract(A, xy[,1:2])

或者

A[B!=1] <- NA
rasterToPoints(A)[, 3]

等...

现在为什么这样:A[B[B == 1]]不起作用?打开包装:

B[B == 1]
# [1] 1 1 1 1 1 1 1 1 1 1

B的单元格值B==1当然是1A[B[B == 1]]因此变为A[c(1,1,1,..)],并多次返回第一个单元格的值。

A[B]相当于A[B!=0],因为B在这种情况下被视为逻辑陈述,而0 == FALSE和所有其他值都是TRUE

答案 1 :(得分:2)

这适用于1个值:

A[B == 1]

以及此值,对于0值

A[B == 0]