R语言中如何提取栅格数据某点对应像素的8邻域共9个像素值?
R语言提取栅格点周边3×3邻域像素值实现方法
方法1:基于raster包原生行列定位实现
该方法可以保留邻域像素的空间相对位置,同时兼容栅格边缘的点查询场景:
# 原有基础数据准备 library(raster) r1 <- raster(ncol=10, nrow=10) r1[] <- 1:ncell(r1) x <- c(-6) y <- c(-67) pt <- SpatialPoints(cbind(y,x), CRS("+init=EPSG:4326")) # 1. 定位目标点对应的栅格行列号 row_pt <- rowFromY(r1, y) col_pt <- colFromX(r1, x) # 2. 生成3×3邻域的行列范围,自动处理边界越界问题 row_range <- max(1, row_pt - 1):min(nrow(r1), row_pt + 1) col_range <- max(1, col_pt - 1):min(ncol(r1), col_pt + 1) # 3. 提取邻域像素值 neighbor_values <- getValuesBlock(r1, row = min(row_range), nrows = length(row_range), col = min(col_range), ncols = length(col_range)) # 可选:转为3×3矩阵,保持像素的空间位置关系 neighbor_matrix <- matrix(neighbor_values, nrow = length(row_range), byrow = TRUE)
方法2:基于缓冲提取快速实现
如果不需要保留空间位置,只需要获取9个像素的数值,可以直接设置等于栅格分辨率的缓冲半径提取:
# 获取栅格分辨率(经纬度投影下单位为度,和buffer参数单位匹配) res_r <- res(r1)[1] # 提取缓冲范围内所有像素值,返回长度为9的向量 neighbor_values <- extract(r1, pt, buffer = res_r)[[1]]
两种方法都可以实现目标点自身+8邻域共9个像素的提取,边界场景下会自动返回实际存在的邻域像素,不会报错。
内容的提问来源于stack exchange,提问作者bic ton
相关产品推荐
相关产品推荐

