如何调整stars对象的aggregate()函数实现基于重叠面积的加权聚合?
实现stars对象基于重叠面积的加权均值聚合
默认的stars::aggregate()函数仅对相交的像素取简单平均值,要实现基于像素与目标cell重叠面积的加权均值聚合,需要手动计算重叠面积作为权重,具体步骤如下:
完整代码实现
library(stars) library(sf) # 原示例基础代码 gpoly <- st_sfc(st_polygon(list(rbind(c(0, 0), c(1, 0), c(1, 1), c(0, 1), c(0, 0))))) grid1 <- st_sf(data.frame(x = 1:9), geometry = st_make_grid(gpoly, n = c(3, 3))) grid2 <- st_make_grid(gpoly, n = c(2, 2)) st1 <- st_as_stars(grid1) # 1. 将stars对象转换为sf格式,便于空间交集计算 sf1 <- st_as_sf(st1) # 2. 计算每个grid1像素与grid2 cell的交集及对应面积 intersections <- st_intersection(sf1, st_sf(geometry = grid2)) intersections$overlap_area <- st_area(intersections) # 3. 按grid2 cell分组计算加权均值 weighted_result <- aggregate( x ~ .geo_y, data = intersections, FUN = function(vals) { group_weights <- intersections$overlap_area[intersections$.geo_y == unique(intersections$.geo_y)] sum(vals * group_weights) / sum(group_weights) } ) # 4. 将聚合结果转回stars格式 st_weighted_agg <- st_as_stars(weighted_result, dims = "geometry") # 查看最终加权聚合结果 st_weighted_agg
步骤解释
- 格式转换:将stars对象转为sf格式,利用sf的空间分析工具计算重叠面积。
- 交集面积计算:通过
st_intersection获取所有grid1像素与grid2 cell的相交配对,再用st_area计算每个交集的面积,作为加权的权重。 - 加权均值计算:按grid2的cell分组,对每组内的像素值乘以对应重叠面积求和,再除以该组的总重叠面积,得到加权均值。
- 格式还原:将聚合后的sf对象转回stars格式,保持与原生
aggregate()结果一致的数据结构。
结果差异说明
以示例中左下角的grid2 cell为例:
- 简单平均结果为
(1+2+4+5)/4 = 3 - 加权均值结果约为
2.333(基于各像素的实际重叠面积占比计算)
内容的提问来源于stack exchange,提问作者agila
相关产品推荐
相关产品推荐

