R语言中基于网格的地理空间随机采样问题求助
解决方案
问题出在st_sample对sfc(简单要素几何集合)对象的处理逻辑:当你直接传入整个网格集合并指定size参数时,它会在所有网格覆盖的总面积内随机生成指定数量的点,而非为每个网格单元单独采样。要实现每个网格单元内随机采样,需要将网格转换为带独立行的sf数据框,再对每个网格单元单独调用st_sample。
修正后的代码
library(raster) library(sf) library(ggplot2) library(purrr) # 获取蒙大拿州边界数据 States <- raster::getData("GADM", country = "United States", level = 1) Montana <- States[States$NAME_1 == "Montana",] MT <- sf::st_as_sf(Montana) # 创建六边形网格并转换为sf数据框(每个网格为一行) grid <- MT %>% st_make_grid(cellsize = 1, what = "polygons", square = FALSE) %>% st_intersection(MT) %>% st_sf() # 关键:将sfc转为sf数据框,每个网格作为独立行 # 为每个网格单元随机采样1个点(可根据需求调整size值) set.seed(51) pts_list <- purrr::map(grid$geometry, ~st_sample(.x, size = 1)) # 将采样点列表转换为统一的sf对象 pts_sf <- do.call(c, pts_list) %>% st_sf() # 可视化验证 ggplot() + geom_sf(data = MT, fill = "white", color = "black") + geom_sf(data = grid, fill = NA, color = "gray") + geom_sf(data = pts_sf, color = "red", size = 2)
关键说明
st_sf():将原本的sfc几何集合转换为sf数据框,让每个六边形网格成为数据框的一行,这样后续可以对每个网格单独操作。purrr::map():遍历每个网格的几何对象,为每个网格调用st_sample生成指定数量的随机点。如果不需要purrr包,也可以用基础R的lapply替代。- 调整采样数量:如果需要每个网格采样多个点,只需修改
st_sample中的size参数(比如size=2表示每个网格生成2个点)。
内容的提问来源于stack exchange,提问作者jrp
相关产品推荐
相关产品推荐

