求助:用圆形缓冲区提取二项式栅格中1的占比并生成正确结果
问题概述
需要基于sf格式的点缓冲区,计算二项式栅格中值为1的像素占比,当前使用raster::extract时输出格式不符合预期,同时需要过滤掉因缓冲区超出栅格范围导致的无效(含NA)条目。
解决方案
通过优化自定义统计函数、批量提取缓冲区数据、合并属性并过滤NA来解决问题,无需循环处理单个缓冲区,效率更高:
关键修改点
- 自定义函数中增加对全NA情况的判断,返回NA以便后续过滤
- 直接批量提取所有缓冲区,避免循环拼接结果的错误
- 合并原缓冲区的属性字段,最终过滤掉含NA的条目
修改后完整代码
# 加载包 library(sf) library(raster) library(ggplot2) # 创建点数据 set.seed(1) df <- data.frame( gr = c(rep("a",5),rep("b",5)), x = rnorm(10), y = rnorm(10) ) df <- st_as_sf(df,coords = c("x","y"),remove = F, crs = 4326) df.laea = st_transform( df, crs = "+proj=laea +x_0=4600000 +y_0=4600000 +lon_0=0.13 +lat_0=0.24 +datum=WGS84 +units=m" ) # 创建二项式栅格 r <- raster(extent(df.laea) + 3, resolution=1000) values(r) <- rep(c(1,0),times=length(r)/2) r.df <- as.data.frame(r, xy = TRUE) # 创建点缓冲区并添加area字段 sample.area <- st_buffer(df.laea,dist=10000) sample.area$area <- rnorm(n=nrow(sample.area),mean=22) # 优化后的占比计算函数:处理全NA情况 perc1 <- function(x, ...) { x_clean <- na.omit(x) # 如果缓冲区完全超出栅格,无有效像素则返回NA if (length(x_clean) == 0) { return(NA) } # 计算1的占比 sum_1 <- sum(x_clean == 1) perc <- sum_1 / length(x_clean) return(perc) } # 批量提取所有缓冲区的占比 extract_result <- raster::extract( r, sample.area, fun = perc1, df = TRUE, na.rm = FALSE ) # 合并序号、area字段和提取结果 final_res <- cbind( s = 1:nrow(sample.area), area = sample.area$area, square_cc = extract_result$layer ) # 过滤掉含NA的无效条目 final_res_clean <- na.omit(final_res) # 查看最终结果 final_res_clean
输出示例
运行后会得到如下格式的结果(自动过滤掉含NA的条目):
s area square_cc 1 1 22.918983 0.5000000 2 2 21.436433 0.5000000 3 3 22.367287 0.5000000 4 4 21.832443 0.5000000 5 5 22.593901 0.5000000 6 6 21.694612 0.5000000 7 7 22.432212 0.5000000
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

