如何从R栅格中将面积加权和提取为多边形?

时间:2017-02-21 07:31:15

标签: r r-raster

我有一个栅格(类“RasterLayer”),其中包含人数,N。我有表示管理边界的多边形(类“SpatialPolygonsDataFrame”)。

我想将栅格图层中的值提取到多边形中,其方式是通过覆盖多边形的栅格图块区域的比例进行加权。假设有四个栅格图块,其值(4,8,12,16)与单个多边形重叠。如果每个栅格的25%与多边形重叠,我希望它们对多边形的贡献总和为(1,2,3,4),并且提取到该多边形的总加权和为10.

基本上,我想完成以下任务:

 some_polygons$n_people = extract(count_raster$n_people, 
                                   some_polygons, 
                                   fun=sum, 
                                   weights=T, 
                                   na.rm=T)

但是,当我在R中运行此命令时,我收到以下内容:

  

“警告讯息:   在.local(x,y,...)中:     “乐趣”改为“卑鄙”;当“weights = TRUE”“

时,不能使用其他功能

R强制更改为fun =使用权重时的平均值。我需要使用权重来计算落在多边形中的栅格的比例,但是平均值不会让我计算出我想要的数量。我需要找到一种方法来在光栅中添加计数N,通过落在多边形内的栅格中的面积量加权(加权和不是加权平均值)。有谁知道我怎么能做到这一点?

我很乐意尝试使用其他空间数据类来实现这一点。我尝试将栅格表示为SpatialPixelsSpatialPointsSpatialGrid并使用sp::over()函数,但无法弄清楚如何计算我的加权和需要。非常感谢帮助!

1 个答案:

答案 0 :(得分:2)

首先,请提供一个可重复的示例,它将帮助我们帮助您; - )

*编辑 这适用于版本raster v2.5-8,但不适用于raster v2.3-12

weights解释如下:

  

如果为TRUE且normalizeWeights = FALSE,则函数返回每个函数   多边形,具有单元格值和近似分数的矩阵   由多边形覆盖的每个单元格(舍入到1/100)。如果是真的   和normalizeWeights = TRUE将权重归一化为它们   加起来一个。权重可用于平均;看例子。   如果多边形很小,此选项可能很有用(但速度很慢)   相对于Raster *对象的单元格大小

所以你可以用它来计算加权和:

library(raster)
library(sp)

# Reproducible example
set.seed(13)
N = raster(nrows=4, ncol=4, xmn=0, xmx=4, ymn=0, ymx=4)
N[] = runif(16, 50, 100)

Ps1 = Polygons(list(Polygon(cbind(c(0.5,2.8,3.7,1.2,0.5), c(2,3.4,1.2,1.1,2)))), 
               ID = "a")
SPs = SpatialPolygons(list(Ps1))
poly = SpatialPolygonsDataFrame(SPs, data.frame(onecol = c("one"), 
                                                row.names = c("a")))
# See plot below
plot(N)
plot(poly, add=T, border='red')

# Extract with the arguments to get the appropriate weights 
# Check the version of your raster package for normalizeWeights!
myextr = as.data.frame(extract(N, poly, weights=T, normalizeWeights=F))
#      value weight
# 1 69.48172   0.16
# 2 98.10323   0.08
# 3 50.54667   0.61
# 4 78.71476   0.99
# 5 88.21990   0.17
# 6 93.66912   0.17
# 7 52.05317   0.87
# 8 83.05608   0.85
# 9 93.91854   0.43

# compute your weighted sum
mywsum = sum(myextr$value * myextr$weight)
# [1] 314.9164

enter image description here

*编辑前

对于raster v2.3-12,参数normalizeWeights显然不存在,因此我不得不手动完成工作,并警告栅格的分辨率与多边形的大小相比(即,需要一个完全封闭的单元,否则就需要进行调整。因此,这个答案下面的两个第一个评论。

Ps2 = Polygons(list(Polygon(cbind(c(0.5,2.8,3.7,1.2,0.5), c(2,3.4,1.2,0.2,2)))), 
               ID = "a")
SPs2 = SpatialPolygons(list(Ps2))
poly2 = SpatialPolygonsDataFrame(SPs2, data.frame(onecol = c("one"),
                                                  row.names = c("a")))
plot(poly2, add=T, border='blue', lty=3)

myextr2 = as.data.frame(extract(N, poly2, weights=T))

# compute the weight (cells fully enclosed = 1)
myextr2$weight2 = myextr2$weight/max(myextr2$weight)
#       value      weight weight2
# 1  69.48172 0.027777778    0.16
# 2  98.10323 0.013888889    0.08
# 3  50.54667 0.105902778    0.61
# 4  78.71476 0.171875000    0.99
# 5  88.21990 0.029513889    0.17
# 6  93.66912 0.052083333    0.30
# 7  52.05317 0.173611111    1.00
# 8  83.05608 0.173611111    1.00
# 9  93.91854 0.090277778    0.52
# 10 94.52795 0.003472222    0.02
# 11 78.31402 0.107638889    0.62
# 12 79.67737 0.048611111    0.28
# 13 68.22573 0.001736111    0.01

mywsum2 = sum(myextr2$value * myextr2$weight2)
# [1] 428.2086

这表明raster包已经很好但仍在改进:-D

[警告:尝试将normalizeWeightsraster v2.3-12一起使用,它没有崩溃也没有抛出错误,但没有完成工作,所以要小心并更新您的raster版本!