当前位置: 首页 > 知识库问答 >
问题:

将single raster设置为NA,其中光栅堆栈的值为NA

微生德运
2023-03-14

我有两个30m x 30m光栅文件,我想从中采样点。在采样之前,我想从图像中去除云层。我转向R和Hijman的光栅包来完成这项任务。

我使用绘图Poly(sp=TRUE)命令,绘制了18个不同的多边形。该函数似乎不允许18个多边形作为一个sp对象,所以我将它们全部分开绘制。然后,我给多边形一个与光栅匹配的投影4string,并将它们设置为列表。我通过lApplication函数运行列表以将它们转换为光栅(Hijman软件包中的光栅化函数),多边形区域设置为NA,图像的其余部分设置为1。

我的最终目标是一个光栅层,18个区域设置为NA。我尝试堆叠光栅化多边形列表,并将其子集设置为在相同区域中设置一个新的光栅到NA。我的可重复代码在下面。

library(raster)
r1 <- raster(nrow=50, ncol = 50)
r1[] <- 1
r1[4:10,] <- NA
r2 <- raster(nrow=50, ncol = 50)
r2[] <- 1
r2[9:15,] <- NA
r3 <- raster(nrow=50, ncol = 50)
r3[] <- 1
r3[24:39,] <- NA

r4 <- raster(nrow=50, ncol = 50)
r4[] <- 1

s <- stack(r1, r2, r3)

test.a.cool <- calc(s, function(x){r4[is.na(x)==1] <- NA})

无论出于什么原因,该死的测试池是一个空白图,我的目标是将其作为一个光栅,除了堆栈中的NAs,s等于1之外的所有值。

有什么提示吗?

谢谢。

共有3个答案

杜弘伟
2023-03-14

我不熟悉您使用的软件包,但是看看代码中的最后一行,我认为问题可能在这里:

 function(x){r4[is.na(x)==1] <- NA})

看起来calc对此没有太大帮助。它正在设置由xNAs索引的r4的值并将其设置为NA

然后呢?如果有的话,也许:

 function(x){r4[is.na(x)==1] <- NA; return(r4) })

虽然,还不清楚这是否是你想要的。

解晟
2023-03-14

我也在R-Sig-Geo论坛上发布了这个问题,并收到了软件包作者的回复。两种最简单的解决方案:

使用sp包将我的多边形绑定为一个,然后光栅化多边形。

p <- rbind(p1, p2, p3...etc., makeUniqueIDs = TRUE)

r4 <- raster(nrow=50, ncol = 50)
r4[] <- 1
mask <- rasterize(p, r4)
mask[mask %in% 1:18] <- 1
#The above code produces a single raster file with 
#my polygons as unique values, ready for masking.

第二个简单的解决方案,正如Josh O'Brien所指出的:

m <- sum(s)
test <- mask(r4, m)

R社区触礁。问题在一小时内解决了(两次)。谢谢

滑景胜
2023-03-14

执行求和将起作用,因为对于堆栈中有一个值为NA的任何网格单元,求和将返回NA。

要查看其是否有效,请比较以下数据:

plot(s)
plot(sum(s))
 类似资料:
  • 我必须将一些投影光栅(具有ndvi值)转换为csv或excel文件。我想保持网格形式,第一行作为公制lon值,第一列作为公制lat值。在交叉点应该有ndvi值。 我通常用“as”。数据frame(光栅,xy=T)将值导出为数据帧,但在这种情况下,我将获得一种值矩阵。 我想要的 安然后,write.csv....

  • 我有一个带有空间坐标和一个变量的矩阵数据。空间分辨率为1000米。 我想将其转换为光栅格式。 我使用下面的代码来完成它。但我得到的决心与我得到的不一样。有没有更好的方法可以用我的真实数据获得相同的分辨率?

  • 问题内容: 我有一个如下所示的数据帧 As shown in my screenshot above, my source datframe () contains few NA’s 当我执行“df2.stack()对于H7和H8,我得到了它对应的日期。 我只想在两个值(,)都为空时删除记录 不。 请注意,我这里只有几列,我的真实数据超过了 150列和列名事先未知。 我希望我的输出如下图所示这是不

  • 我目前正在将原始矩阵转换为光栅以使用焦距函数,然后我想将光栅转换回矩阵。但是,当我尝试将光栅函数用作时,出现了一条错误消息。矩阵()。即使有这个非常简单的例子: 以下是我得到的: 如果(!is.null(names(x)))列表(names(x),,则数组(x,c(length(x),1L)中出错: “dimnames”[1]的长度不等于数组范围 我正在使用RstuIO、R版本3.4.0和、和库。

  • 我有一个包含n个元素的队列,前面是。我需要创建一个堆栈,上面有。 它只能通过排队、退队、推送和弹出以及持续存储来完成。与其说我需要一个答案,不如说我需要一个如何解决这个问题的想法。 请不要为我回答这个问题,但是请试着理解我是编程新手,我可以用一个想法来解决这个问题。 这是一种类似河内塔楼的方式吗 这只需要一个恒定的存储空间吗 这不是家庭作业,我只是需要一些关于如何进行的建议。我的第一个想法是,倒转

  • 我正试图从mysql查询中重构数据,我花了几天时间想要弄清楚如何做到这一点。mysql数据: 转换为datatables的可读对象 我的当前函数是 返回 我不知道如何做到这一点,我正在尝试自学js