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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:27:21