如何创建重叠瓦片以解决大栅格terra::distance内存密集型计算问题?
解决Terra中创建重叠栅格瓦片的问题
针对大型栅格用terra::distance()内存过高的问题,你可以通过以下两种方法轻松创建重叠瓦片,避免边缘伪影:
方法1:手动生成重叠瓦片(灵活可控)
直接基于栅格行列数手动计算每个瓦片的范围,给相邻瓦片设置重叠区域,代码示例:
library(terra) # 加载目标栅格 r <- rast("your_large_raster.tif") # 自定义参数:瓦片像素尺寸、重叠像素宽度 tile_pixel_size <- c(500, 500) # 每个瓦片500x500像素 overlap_pixels <- 50 # 相邻瓦片重叠50像素 # 获取原栅格的行列总数 total_rows <- nrow(r) total_cols <- ncol(r) # 计算瓦片的起始行/列(每次步进=瓦片尺寸-重叠宽度) row_starts <- seq(1, total_rows, by = tile_pixel_size[1] - overlap_pixels) col_starts <- seq(1, total_cols, by = tile_pixel_size[2] - overlap_pixels) # 循环生成所有重叠瓦片 overlap_tiles <- list() tile_index <- 1 for (rs in row_starts) { for (cs in col_starts) { # 计算当前瓦片的结束行/列(不超出原栅格边界) end_row <- min(rs + tile_pixel_size[1] - 1, total_rows) end_col <- min(cs + tile_pixel_size[2] - 1, total_cols) # 创建瓦片范围并裁剪原栅格 tile_extent <- ext(r, rs, end_row, cs, end_col) overlap_tiles[[tile_index]] <- crop(r, tile_extent) tile_index <- tile_index + 1 } }
方法2:基于非重叠瓦片扩展范围
先利用terra::makeTiles()生成基础瓦片,再扩展每个瓦片的范围实现重叠,适合规则化场景:
library(terra) r <- rast("your_large_raster.tif") # 先创建非重叠瓦片 base_tiles <- makeTiles(r, c(500, 500)) # 计算重叠对应的地图单位距离(这里取50像素的重叠) overlap_distance <- res(r)[1] * 50 # 扩展每个瓦片的范围并裁剪原栅格 overlap_tiles <- lapply(base_tiles, function(tile) { original_ext <- ext(tile) # 向四个方向扩展范围 extended_ext <- ext( original_ext[1] - overlap_distance, original_ext[2] + overlap_distance, original_ext[3] - overlap_distance, original_ext[4] + overlap_distance ) # 裁剪原栅格到扩展范围(自动适配原栅格边界) crop(r, extended_ext) })
关键后续:拼接结果时去除重叠区域
计算完每个重叠瓦片的距离图后,需要提取每个瓦片的核心区域(去掉重叠部分)再拼接,避免结果重复:
# 假设dist_tiles是每个重叠瓦片计算得到的距离图列表 final_tiles <- list() tile_index <- 1 for (rs in row_starts) { for (cs in col_starts) { # 计算核心区域的行列范围(去掉两边的重叠部分) core_start_row <- max(rs + overlap_pixels, 1) core_end_row <- min(rs + tile_pixel_size[1] - 1 - overlap_pixels, total_rows) core_start_col <- max(cs + overlap_pixels, 1) core_end_col <- min(cs + tile_pixel_size[2] - 1 - overlap_pixels, total_cols) # 裁剪出核心区域 core_extent <- ext(r, core_start_row, core_end_row, core_start_col, core_end_col) final_tiles[[tile_index]] <- crop(dist_tiles[[tile_index]], core_extent) tile_index <- tile_index + 1 } } # 拼接所有核心瓦片得到完整的距离图 final_distance_raster <- do.call(merge, final_tiles)
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

