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

如何基于栅格按4×4像素区域生成2个伪缺失随机点?

按4×4像素区域生成伪缺失随机点的解决方案

方法一:基于dismo::randomPoints实现块限制

randomPoints本身不支持直接按块生成,但可以先给栅格划分4×4的块,再逐个块生成点:

library(dismo)
library(raster)

# 加载目标栅格(替换为你的栅格路径)
r <- raster("your_raster.tif")

# 为每个像素分配所属的4×4块ID
block_col <- ceiling(colFromCell(r, 1:ncell(r)) / 4)
block_row <- ceiling(rowFromCell(r, 1:ncell(r)) / 4)
block_id <- paste(block_row, block_col, sep = "_")

# 创建块ID栅格,用于后续筛选区域
block_raster <- raster(r)
values(block_raster) <- block_id

# 获取所有非NA的唯一块ID
unique_blocks <- na.omit(unique(values(block_raster)))

# 初始化点列表
pseudo_points <- list()

# 遍历每个块生成2个随机点
for (b in unique_blocks) {
  # 生成当前块的掩码栅格
  block_mask <- block_raster == b
  # 在掩码内生成2个随机点(自动排除NA区域)
  pts <- randomPoints(block_mask, n = 2)
  # 转为空间点格式(方便后续处理)
  pseudo_points[[b]] <- SpatialPoints(pts, proj4string = crs(r))
}

# 合并所有块的点
all_pseudo_points <- do.call(rbind, pseudo_points)

方法二:自定义函数(基于栅格cell属性)

如果不想依赖dismo,可以直接通过栅格的行列、cell信息手动生成随机点:

library(raster)

# 加载目标栅格
r <- raster("your_raster.tif")

n_rows <- nrow(r)
n_cols <- ncol(r)

# 计算4×4块的总数量
n_block_rows <- ceiling(n_rows / 4)
n_block_cols <- ceiling(n_cols / 4)

# 存储结果的数据框
pseudo_points <- data.frame(x = numeric(), y = numeric())

# 遍历每个4×4块
for (br in 1:n_block_rows) {
  # 确定当前块的行范围
  row_range <- ((br - 1)*4 + 1):min(br*4, n_rows)
  for (bc in 1:n_block_cols) {
    # 确定当前块的列范围
    col_range <- ((bc - 1)*4 + 1):min(bc*4, n_cols)
    
    # 获取块内所有cell的ID
    block_cells <- cellFromRowColCombine(r, row_range, col_range)
    # 筛选出非NA的有效cell
    valid_cells <- block_cells[!is.na(values(r)[block_cells])]
    
    # 仅当块内有有效cell时生成点
    if (length(valid_cells) > 0) {
      # 随机选择2个cell(若有效cell不足2,按实际数量生成)
      selected_cells <- sample(valid_cells, min(2, length(valid_cells)), replace = FALSE)
      
      # 为每个选中的cell生成随机坐标(在cell范围内,而非仅中心)
      for (cell in selected_cells) {
        cell_bounds <- extract(rasterToPolygons(r, cells = cell), cell)@polygons[[1]]@Polygons[[1]]@coords
        x <- runif(1, min(cell_bounds[,1]), max(cell_bounds[,1]))
        y <- runif(1, min(cell_bounds[,2]), max(cell_bounds[,2]))
        pseudo_points <- rbind(pseudo_points, data.frame(x, y))
      }
    }
  }
}

# 转为空间点对象(可选)
coordinates(pseudo_points) <- ~x+y
proj4string(pseudo_points) <- crs(r)

关键注意事项

  • 如果某个4×4块内全为NA,代码会自动跳过该块;若需要强制每个块都生成点,需先预处理栅格填充NA或调整规则。
  • 代码中生成的是像素内的随机坐标,而非固定的像素中心点,符合伪缺失点的随机性要求。
  • 你的栅格分辨率为30×30,因此每个4×4块的地理范围是120×120单位(与栅格extent单位一致)。

内容的提问来源于stack exchange,提问作者PickleRick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:37:30