You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建重叠瓦片以解决大栅格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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:26:26