基于真实数据半径在R中生成特定区域不规则空间点网格
基于采样点生成指定区域内的5公里间距空间网格点
步骤1:加载依赖包并准备基础数据
使用sf包处理空间数据,dplyr辅助数据清洗,先将原始采样点转为空间对象:
# 加载所需工具包 library(sf) library(dplyr) # 原始采样点数据集 df <- data.frame( lon = c(52.08249,52.09444,52.09731,52.09779,52.09875,52.09922,52.10114,52.10162,52.10305,52.10401), lat = c(36.62644,36.61794,36.61590,36.61556,36.61488,36.61454,36.61318,36.61284,36.61182,36.61114) ) # 转换为WGS84坐标系的空间对象(EPSG:4326) sf_points <- st_as_sf(df, coords = c("lon", "lat"), crs = 4326)
步骤2:定义目标区域(黄色圆圈范围)
由于经纬度无法直接计算准确距离,先转换到UTM平面投影(该区域对应UTM 39N,EPSG:32639),再生成采样点的5公里缓冲区作为目标区域:
# 转换为UTM投影,确保距离计算准确 sf_points_utm <- st_transform(sf_points, crs = 32639) # 创建采样点的5公里缓冲区,合并为单个目标区域 target_area <- st_union(sf_points_utm) %>% st_buffer(dist = 5000)
如果你的黄色圆圈是自定义多边形,直接替换target_area为你的空间多边形对象即可
步骤3:生成并筛选网格点
在目标区域内生成5公里间距的网格中心点,再过滤出区域内的点:
# 生成5公里×5公里的网格中心点 grid <- st_make_grid( target_area, cellsize = c(5000, 5000), what = "centers" ) %>% st_sf() # 筛选出目标区域内的网格点 grid_in_area <- grid %>% st_filter(target_area)
步骤4:转回经纬度坐标系(可选)
如果需要将结果转换回WGS84经纬度格式:
grid_final <- st_transform(grid_in_area, crs = 4326) # 提取经纬度到普通数据框 grid_final_df <- grid_final %>% mutate( lon = st_coordinates(.)[,1], lat = st_coordinates(.)[,2] ) %>% st_drop_geometry()
结果验证
可以通过绘图确认网格点与目标区域的位置关系:
plot(st_geometry(target_area), col = "yellow", border = NA) plot(st_geometry(sf_points_utm), col = "red", add = TRUE) plot(st_geometry(grid_in_area), col = "blue", pch = 16, add = TRUE)
内容的提问来源于stack exchange,提问作者rezgar
相关产品推荐
相关产品推荐

