微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当多边形小于栅格单元时,terra::extract 给出 NaN

如何解决当多边形小于栅格单元时,terra::extract 给出 NaN

在下面的例子中,extract 函数正确地告诉我们多边形 x2 中 r 的平均值是 5.14。但是,对于像 x1 这样小于栅格的多边形,extract 返回值“NaN”

r <- rast(nrows = 10,ncol = 10,nlyrs = 1,vals = sample(1:10,100,replace = TRUE),names = "temp")

x1 <- rbind(c(-145,-10),c(-145,-5),c(-140,-10))
x2 <- rbind(c(-10,0),c(140,60),c(160,-55))
z <- rbind(cbind(object=1,part=1,x1,hole=0),cbind(object=3,x2,hole=0))
colnames(z)[3:4] <- c('x','y')
p <- vect(z,"polygons")

plot(r)
plot(p,add = T)

test <- terra::extract(r,p,fun = mean,cell = TRUE)

test
  ID     temp
1  1      NaN
2  2 5.142857

如何获得 x1

enter image description here

处的 r 值?

解决方法

您可以使用exact=TRUE

示例数据

library(terra)
r <- rast(nrows = 10,ncols = 10,nlyrs = 1,vals =1:100,names = "temp")
x1 <- rbind(c(-145,-10),c(-145,-5),c(-140,-10))
x2 <- rbind(c(-10,0),c(140,60),c(160,-55))
z <- rbind(cbind(object=1,part=1,x1),cbind(object=2,x2))
colnames(z)[3:4] <- c('x','y')
p <- vect(z,"polygons")

默认

extract(r,p,fun = mean)
#  ID temp
#1  1  NaN
#2  2   53

使用 exact=TRUE开发版 1.3-10

extract(r,fun=mean,exact=TRUE)
#     ID     temp
#[1,]  1 51.80006
#[2,]  2 52.21312

和 CRAN 版本

e <- extract(r,exact=TRUE)
head(e)
#  ID temp    fraction
#1  1   51 0.007539715
#2  1   52 0.030169815
#3  2   19 0.104219078
#4  2   28 0.282198174
#5  2   29 0.883159178
#6  2   30 0.043386000

x <- by(e[,2:3],e[,1],function(x) weighted.mean(x[,x[,2]))
as.vector(x)
# [1] 51.80006 52.21312

(如果您熟悉该语法,则使用 dplyr 或 data.table)

开发版本可从

获得

install.packages('terra',repos='https://rspatial.r-universe.dev')

或者,您可以采用非常小的多边形的质心(如栅格中的 small=TRUE

v <- extract(r,fun = mean)
i <- which(is.na(v[,2]))
ve <- extract(r,centroids(p[i,]))
v[i,2] <- ve[,2] 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?