R光栅包中的提取和重采样函数:面积加权值

R光栅包中的提取和重采样函数:面积加权值,r,extract,r-raster,R,Extract,R Raster,我也发了这篇文章,但因为我真的需要回复,我再次在这里发布 我在R中工作,希望计算从光栅相交单元导出的多边形的值。该值应该考虑每个相交单元上的权重。当我尝试使用示例光栅和多边形运行“提取”函数时,我会得到不同的权重,这些权重与我手动计算的权重不同,从而产生不同的最终值 以下是我的示例代码: require(raster) r <- raster(nrow=2, ncol=2, xmn=-180, xmx=60, ymn=-30, ymx=90) r[] <- c(1,2,4,5)

我也发了这篇文章,但因为我真的需要回复,我再次在这里发布

我在R中工作,希望计算从光栅相交单元导出的多边形的值。该值应该考虑每个相交单元上的权重。当我尝试使用示例光栅和多边形运行“提取”函数时,我会得到不同的权重,这些权重与我手动计算的权重不同,从而产生不同的最终值

以下是我的示例代码:

require(raster)
r <- raster(nrow=2, ncol=2, xmn=-180, xmx=60, ymn=-30, ymx=90)   
r[] <- c(1,2,4,5)    
s <- raster(xmn=-120, xmx=-40, ymn=20, ymx=60, nrow=1, ncol=1)    
s.pl <- as(s, 'SpatialPolygons')    
w <- raster::extract(r, s.pl, method="simple",weights=T, normalizeWeights=F)    
mean.value <- raster::extract(r, s.pl, method="simple",weights=T, fun=mean) 
因此,基于上面的多边形的最终值应该是2

这可能是因为在lat/lon中的投影吗?但即使我以米为单位指定投影,我也会得到相同的结果。如何获得我感兴趣的2的值?我也尝试了“重采样”功能,但我也得到了不同的结果


我的最终目标是创建一个分辨率和范围与原始光栅不同的新光栅,并根据与新光栅单元相交的原始光栅单元的权重指定值。但似乎无论是重采样还是提取函数都不能给出预期的结果

以下是我根据帖子回复所做的事情

require(光栅)
需要(rgeos)

r假设我们有一个光栅
a
和两个空间多边形对象
[B,C]
,它们不是矩形(在本例中为六边形)。 为便于演示,六边形
B
的中心被定义为光栅
A
的中心(参见下面的左图)。六边形
C
沿水平轴向右移动

require(raster)
require(scales)

A    <- raster(nrow=2, ncol=2, xmn=-180, xmx=180, ymn=-180, ymx=180)
A[]  <- c(1,2,4,5)    
A.pl <- as(A, 'SpatialPolygons')
B    <- SpatialPolygons(list(Polygons(list(Polygon(cbind(c(0, 100, 100, 0, -100, -100, 0), 
                                                         c(100, 50, -50, -100, -50, 50, 100)))), 'B')))
C    <- SpatialPolygons(list(Polygons(list(Polygon(cbind(c(40, 140, 140, 40, -60, -60, 40), 
                                                         c(100, 50, -50, -100, -50, 50, 100)))), 'C')))
现在我们得到每个相交多边形所在的单元的值,并计算平均值

vals    <- unlist(lapply(intsct.B@polygons, function(x) { 
  extract(A, data.frame(t(slot(x, 'labpt'))))
}))

sum(weights * vals)
> [1] 3
同样,正如我们预期的那样,平均值更大(因为值为2和5的单元格的权重更高)。此外,由于我们只沿一个轴移动六边形,因此两个权重出现两次是有意义的

具有较高单元数的光栅 下一个图显示了
B
(左侧)和
C
(右侧)与
4x4
光栅的交点,光栅值为
C(1:8,10:17)
。对于
B
有12个交叉口,对于
C
8个交叉口。再次注意,由于对称性,
B
的平均值正好是9


这适用于任何
空间多边形
对象。请确保对您扔进
intersect

的对象使用相同的CRS,还有什么其他论坛?如果您必须交叉发布,请链接到问题。我怀疑您期待的是
extract
无法提供的内容。如果阅读
?extract
,您会注意到“如果y表示多边形,extract方法将返回被多边形覆盖的光栅*对象的单元格的值。如果单元格的中心位于多边形内,则该单元格将被覆盖(但有关部分覆盖的单元格,请参见权重选项;”。也许您可以将光栅强制为多边形(
rasterToPolygons
),并使用
rgeos
软件包查找重叠区域?感谢您的回复Roman,hvala lepa:)我了解了y多边形,但我认为如果启用“权重”选项,将得到所需的结果。你能告诉我更多关于rgeos软件包的细节吗?谢谢你的回复,马丁。如果你有更多的时间,我有一些问题。1.它也适用于非矩形区域吗?或者prod函数会给出错误的结果?另外,我读到一些关于光栅包的内容,这些内容适用于矩形区域,但不适用于不同的形状。2.当新光栅有超过1个单元时,它是否可以升级为适用于光栅堆栈?再次感谢:)进行了编辑。这至少可以回答你的一些问题。继续,做一些尝试和错误…嗨,马丁,我正在检查你的回答,我正在做一些新的分析,有一个问题你可以回答:“area.C”是多边形的总面积。我注意到,“权重”的总和不等于1,因为“area”属性的总和不等于“area.C”。对于您的示例sum(weights)=1,但对于我当前的分析,大约有0.03%的差异。知道为什么会这样吗?不知道。我现在在阿尔卑斯山,在雪地里呆的时间比在笔记本前多。我回家后会查看的。祝您玩得愉快,非常感谢您在这个问题上的帮助,非常感谢:)
require(raster)
require(scales)

A    <- raster(nrow=2, ncol=2, xmn=-180, xmx=180, ymn=-180, ymx=180)
A[]  <- c(1,2,4,5)    
A.pl <- as(A, 'SpatialPolygons')
B    <- SpatialPolygons(list(Polygons(list(Polygon(cbind(c(0, 100, 100, 0, -100, -100, 0), 
                                                         c(100, 50, -50, -100, -50, 50, 100)))), 'B')))
C    <- SpatialPolygons(list(Polygons(list(Polygon(cbind(c(40, 140, 140, 40, -60, -60, 40), 
                                                         c(100, 50, -50, -100, -50, 50, 100)))), 'C')))
# get intersections
intsct.B <- raster::intersect(B, A.pl)
intsct.C <- raster::intersect(C, A.pl)

### B
area.B <- B@polygons[[1]]@area

weights <- unlist(lapply(intsct.B@polygons, function(x) {
  slot(x, 'area')/area.B
}))
weights
> [1] 0.25 0.25 0.25 0.25
vals    <- unlist(lapply(intsct.B@polygons, function(x) { 
  extract(A, data.frame(t(slot(x, 'labpt'))))
}))

sum(weights * vals)
> [1] 3
### C
area.C <- C@polygons[[1]]@area

weights <- unlist(lapply(intsct.C@polygons, function(x) {
  slot(x, 'area')/area.C
}))
weights
> [1] 0.13 0.37 0.13 0.37

vals    <- unlist(lapply(intsct.C@polygons, function(x) { 
  extract(A, data.frame(t(slot(x, 'labpt'))))
}))

sum(weights * vals)
> [1] 3.24