如何基于栅格按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
相关产品推荐
相关产品推荐

