You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:用圆形缓冲区提取二项式栅格中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:50:17