当前位置 : 主页 > 手机开发 > 其它 >

通过具有任意函数的非整数因子聚合栅格

来源:互联网 收集:自由互联 发布时间:2021-06-22
我想将人口栅格聚合1.5倍,将细胞的值相加. 虽然aggregate()允许我在聚合时对值求和,但其factor参数仅接受整数值. projectRaster()和resample()允许我精确调整分辨率,但(据我所知)我被限制为预先
我想将人口栅格聚合1.5倍,将细胞的值相加.

虽然aggregate()允许我在聚合时对值求和,但其factor参数仅接受整数值. projectRaster()和resample()允许我精确调整分辨率,但(据我所知)我被限制为预先打包的双线性插值和最近邻计算方法.

有没有办法通过非整数因子聚合栅格并指定聚合时要使用的函数?

library(raster)
set.seed(10)

proj <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
r <- raster(resolution = 1, nrow = 100, crs = proj)
r[] <- round(rnorm(ncell(r), 100, 10))

# Doesn't accept non-integer factors
aggregate(r, fact = 1.5, fun = sum)

template <- raster(extent(r), crs = crs(r), resolution = 1.5)

# Correct resolution, but incorrect / impossible values for population
projectRaster(r, to = template, method = "ngb")
projectRaster(r, to = template, method = "bilinear")

可能的解决方法

到目前为止,我能够提出的唯一方法是将模板强制转换为SpatialPoints对象;从原始的高分辨率栅格中提取值;和rasterize()结果:

pts <- as(template, "SpatialPoints")
vals <- extract(r, pts)
pts2 <- SpatialPointsDataFrame(pts, data.frame(vals))

rasterize(pts2, template, field = "vals", fun = sum)

但是,如果在栅格单元的质心处创建点,我不确定在以原始栅格的1.5倍分辨率提取时如何处理它们.我首选的方法是创建一个SpatialPolygonsDataFrame并使用fun = mean进行栅格化,但是(根据我的经验)使用多边形提取栅格值效率非常低.

这是一个解决方法:

#first resample to higher resolution
template    <- raster(extent(r), crs = crs(r), resolution = .5)  
detailedRas <- projectRaster(r, to = template, method = "ngb")

#then use an integer as a factor (in this case 3)
aggRas      <- aggregate(detailedRas, fact=3, fun=sum)

但请注意,在这种情况下,总和不会返回居住在某个聚合区域的人的总和.

即:我们说我们有四个单元格,这些值的分辨率为1米:

10  15  
12  18

使用NN重新采样到0.5后:

10  10  15  15  
10  10  15  15  
12  12  18  18  
12  12  18  18

然后通过总和汇总到1.5米,得到第一个像素:

10 10 15 10 10 15 12 12 18 = 112

事实上它应该是这样的:
10 15/2 12/2 18/4 = 28(如果我们假设每个像素的人口分布相等.)

我建议使用焦点栅格功能和自定义/用户定义的功能,以根据需要汇总人口值.

或者您将重采样的栅格除以4,然后取总和:

2.5  2.5  3.75  3.75  
2.5  2.5  3.75  3.75   
3    3    4.5   4.5  
3    3    4.5   4.5

2.5 2.5 3.75 2.5 2.5 3.75 3 3 4.5 = 28

网友评论