【问题标题】:Extracting pixels from a raster based on specific value of another raster using R使用R根据另一个栅格的特定值从栅格中提取像素
【发布时间】:2016-01-16 11:28:40
【问题描述】:

我使用raster 函数在R 中导入了两个栅格(栅格AB)。 我想将A 的像素提取到数据框中,其中B 等于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 &lt;- data.frame(A[B]),现在输出只有B == 1 位置的原始A。在从A 提取所有像素之前尝试此操作(正如我所料)。我可以通过计算B 中的个数和mydata 中的元素数来确定它是正确的,这是相同的。就像索引跳过了B 中的所有零一样。谁能解释一下?

【问题讨论】:

  • 通常在 r 中,TRUE 被转换为 1,FALSE 被转换为 0。因此,栅格可能将 0 和 1 的向量解释为 FALSE 和 TRUE。

标签: r dataframe raster r-raster


【解决方案1】:

示例数据:

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

【讨论】:

    【解决方案2】:

    这应该适用于 1 值:

    A[B == 1]
    

    还有这个,对于 0 值

    A[B == 0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多