基于网格创建巴伐利亚地区位置数据的面积平衡随机样本
巴伐利亚州网格单元内随机抽取坐标样本解决方案
以下是实现你需求的完整流程,基于你的代码修正并补充关键步骤:
1. 依赖包加载与数据预处理
修正数据读取的语法错误,并将坐标转换为sf空间对象(空间操作必须依赖该类型):
library(sf) library(dplyr) library(tibble) # 读取巴伐利亚州边界 germany <- raster::getData("GADM", country = "Germany", level = 1) bavaria <- germany[germany$NAME_1 == "Bayern",] bavaria_mod <- sf::st_as_sf(bavaria) # 读取坐标数据(修正row.names参数的语法错误) coord <- read.csv("coords.csv", sep = ";", row.names = 1, na.strings = "") test <- coord %>% as_tibble() %>% filter(!is.na(Latitude), !is.na(Longitude)) %>% # 转换为sf空间对象,指定经纬度CRS(WGS84) st_as_sf(coords = c("Longitude", "Latitude"), crs = 4326)
2. 创建带唯一标识的巴伐利亚州网格
给网格单元添加ID,方便后续按单元分组抽样:
# 创建网格并与巴伐利亚边界裁剪 grid <- bavaria_mod %>% st_make_grid(cellsize = 0.1, what = "polygons", square = TRUE) %>% st_intersection(bavaria_mod) %>% # 为每个网格单元添加唯一ID mutate(grid_id = row_number())
3. 匹配坐标点到对应网格单元
通过空间连接,确定每个坐标点所属的网格:
# 空间连接:将点与所在网格匹配 points_with_grid <- st_join(test, grid, join = st_within)
4. 按网格单元随机抽样
指定每个网格要抽取的样本数量(示例中设为2),完成抽样:
# 每个网格单元随机抽取2个点(可修改n值调整样本量) sampled_points <- points_with_grid %>% group_by(grid_id) %>% slice_sample(n = 2, replace = FALSE) %>% # replace=FALSE表示不重复抽样 ungroup()
5. 结果可视化验证
plot(grid$geometry, border = "gray") plot(test$geometry, col = "orange", pch = 20, cex = 0.5, add = TRUE) plot(sampled_points$geometry, col = "red", pch = 19, cex = 1, add = TRUE)
关键说明:
- 确保所有空间对象的CRS一致,这里统一使用WGS84(EPSG:4326);
slice_sample的n参数可根据需求调整每个网格的样本数量;- 如果部分网格单元内的点数量小于指定抽样数,可将
replace设为TRUE启用有放回抽样,或添加条件判断跳过这类网格。
内容的提问来源于stack exchange,提问作者Oliver Schallert
相关产品推荐
相关产品推荐

