R语言无需合并单文件即可处理大型栅格镶嵌数据集的方案咨询
解决方案
推荐方案:使用terra包的虚拟栅格(VRT)功能
你需要的类lidR catalog的栅格处理逻辑,可通过GDAL虚拟栅格(VRT)实现,VRT仅存储栅格瓦片的元数据和引用关系,不会合并原始数据,处理时仅按需加载目标范围涉及的瓦片,内存占用极低。R中terra包(raster包官方迭代版本)原生支持VRT能力,是目前最优解决方案,代码逻辑和你熟悉的lidR catalog完全对齐:
library(terra) # 列出所有栅格瓦片路径,仅读取文件路径,不加载实际数据 raster_tiles <- list.files("D:/FOLDER/WITH/LOTS/OF/RASTER/TILES", pattern = "\\.tif$", full.names = TRUE) # 生成虚拟镶嵌,仅统计瓦片元数据,秒完成、几乎无内存占用 raster_mosaic <- vrt(raster_tiles) # 读取感兴趣区矢量 roi <- vect("D:/EG/SHP/FILE/OF/ROI.shp") # 裁剪感兴趣区,仅加载和ROI重叠的瓦片数据,内存效率和lidR catalog一致 raster_roi <- crop(raster_mosaic, roi)
terra是raster包作者推出的替代产品,性能远优于旧raster包,API和raster包高度兼容,迁移成本极低。
备选方案:raster包兼容方案
如果暂时不想迁移到terra包,可通过原生GDAL命令生成VRT文件后直接用raster包读取,同样不需要提前合并全量数据:
# 调用GDAL命令生成虚拟栅格文件,仅写入元数据,不碰原始栅格内容 system("gdalbuildvrt mosaic.vrt D:/FOLDER/WITH/LOTS/OF/RASTER/TILES/*.tif") # 用raster包直接读取vrt文件,和读取普通单栅格文件逻辑完全一致 library(raster) raster_mosaic <- raster("mosaic.vrt") raster_roi <- crop(raster_mosaic, roi)
注意事项
- 需保证所有栅格瓦片的投影、分辨率、nodata值等参数一致,和lidR catalog对LAS瓦片的要求逻辑一致,否则生成VRT时会出现参数不匹配的报错
- 上述两种方案均支持对虚拟镶嵌对象直接执行裁剪、掩膜、值提取等常见操作,所有操作都只会加载目标范围涉及的瓦片,不会读取全量数据
内容的提问来源于stack exchange,提问作者Honeybear
相关产品推荐
相关产品推荐

