如何在R中裁剪栅格至Shapefile并保留完整网格单元?
R语言保留完整六边形网格单元的解决方案
核心逻辑
你需要的不是对网格几何进行切割,而是筛选出符合空间关系的完整网格单元——这和QGIS中"提取完整要素"的逻辑一致,而非几何裁剪操作。常用判断逻辑分为以下几种,可按需选择:
具体实现步骤
首先确保用sf包读取并对齐坐标系:
library(sf) # 读取Shapefile文件 hex_grid <- st_read("你的六边形网格文件路径.shp") boundary <- st_read("你的边界面文件路径.shp") # 统一坐标系(若不一致则转换) if (!st_crs(hex_grid) == st_crs(boundary)) { hex_grid <- st_transform(hex_grid, st_crs(boundary)) }
方法1:筛选完全被边界包含的网格
适合严格要求网格完全在边界内的场景:
# 判断每个网格是否完全被边界包含 is_inside <- st_within(hex_grid, boundary, sparse = FALSE)[,1] # 提取完整网格 filtered_hex <- hex_grid[is_inside, ]
方法2:筛选中心点在边界内的网格
适合快速筛选(和QGIS中常用的近似提取逻辑一致):
# 生成网格中心点 hex_centroids <- st_centroid(hex_grid) # 判断中心点是否在边界内 centroid_in_bound <- st_within(hex_centroids, boundary, sparse = FALSE)[,1] # 提取完整网格 filtered_hex <- hex_grid[centroid_in_bound, ]
方法3:筛选所有与边界相交的网格
保留所有和边界有交集的完整网格(无论是否完全包含):
# 判断网格是否与边界相交 is_intersect <- st_intersects(hex_grid, boundary, sparse = FALSE)[,1] # 提取完整网格 filtered_hex <- hex_grid[is_intersect, ]
结果验证与导出
# 可视化验证 plot(st_geometry(filtered_hex), col = "#4CAF50") plot(st_geometry(boundary), add = TRUE, border = "red", lwd = 2) # 导出筛选后的Shapefile st_write(filtered_hex, "筛选后的完整六边形网格.shp")
内容的提问来源于stack exchange,提问作者Grant Rogers
相关产品推荐
相关产品推荐

