我想将种群栅格汇总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倍的分辨率为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 m:
10 15
12 18
使用nn重新采样至0.5:
10 10 15 15
10 10 15 15
12 12 18 18
12 12 18 18
然后以总和为15m,我们获得第一个像素:
10 10 15 10 10 10 15 12 12 12 18 = 112
实际上应该是:10 15/2 12/2 18/4 = 28(如果我们假设每个像素上的种群分布相等。)
我建议将focal
栅格功能与自定义/用户定义的函数一起使用,以根据您的意愿将人口值汇总。
或将重新采样的栅格除以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 3 4.5 = 28