通过具有任意函数的非整数因子聚合栅格
我想将人口栅格聚合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,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),resolution = .5) detailedRas <- projectRaster(r,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 事实上它应该是这样的: 我建议使用焦点栅格功能和自定义/用户定义的功能,以根据需要汇总人口值. 或者您将重采样的栅格除以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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |