如何高效将Shapefile划分为等面积网格?转换步骤耗时过长
问题:将Shapefile划分为等大小网格时转换耗时过长的优化方法
我需要将一份Shapefile划分为等大小的网格(多边形),当前的实现步骤如下:
# 加载Shapefile library(geodata) library(terra) can_shp <- geodata::gadm('CAN', level = 1, path = file.path(dir_ls$input, 'shapefile')) can_shp <- can_shp[can_shp$NAME_1 == 'British Columbia'] # 根据Shapefile范围创建栅格 temp_raster <- terra::rast(xmin = ext(can_shp)[1], xmax = ext(can_shp)[2], ymin = ext(can_shp)[3], ymax = ext(can_shp)[4], resolution = 0.008333333, crs = crs(can_shp), val = 0) # 保留Shapefile边界内的栅格单元 temp_raster <- terra::mask(temp_raster, can_shp) temp_raster <- terra::crop(temp_raster, can_shp) # 将栅格转换为网格多边形 temp_grid <- as.polygons(temp_raster, trunc = FALSE, dissolve = FALSE)
最终得到的temp_grid即为我需要的、位于边界内的等大小网格,但最后一步转换耗时数小时,请问我的操作是否存在问题,或是有更高效的实现方法?
优化方案
当前方法的核心问题
你当前流程的瓶颈在于高分辨率栅格转多边形的步骤:0.008333333度的分辨率下,不列颠哥伦比亚省范围内的栅格单元数量超过百万级,as.polygons需要逐个将栅格单元转换为多边形几何对象,内存开销和计算量都极大,因此耗时极长。
更高效的实现方法
1. 跳过栅格环节,直接生成矢量网格(推荐)
直接基于目标Shapefile的范围生成矢量网格,再裁剪到边界内,完全避免栅格转多边形的巨大开销:
library(geodata) library(terra) # 加载并筛选不列颠哥伦比亚省数据 can_shp <- geodata::gadm('CAN', level = 1, path = file.path(dir_ls$input, 'shapefile')) can_shp <- can_shp[can_shp$NAME_1 == 'British Columbia'] # 定义网格分辨率 grid_res <- 0.008333333 # 直接生成覆盖目标区域的矢量网格 grid <- terra::vect(ext(can_shp), res = grid_res, crs = crs(can_shp)) # 裁剪并保留边界内的网格 grid <- terra::crop(grid, can_shp) grid <- terra::intersect(grid, can_shp)
2. 若保留原流程,优化栅格转多边形参数
如果必须沿用栅格中转的方式,可通过以下方式提速:
- 设置
trunc = TRUE:减少多边形顶点数量,降低计算和内存负载 - 使用
filename参数直接写入文件:避免在内存中存储大量多边形对象,减少内存交换
temp_grid <- as.polygons(temp_raster, trunc = TRUE, dissolve = FALSE, filename = "bc_grid.shp", overwrite = TRUE)
3. 内存优化
确保R进程有足够的内存分配:
- Windows系统可通过
memory.limit(size = 16384)(单位为MB)调整内存上限 - Linux/macOS可通过启动R时设置环境变量
R_MAX_VSIZE提升内存限制,避免因内存不足导致的磁盘交换拖慢速度
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

