提取高程栅格时遇磁盘空间不足错误的技术咨询
我正尝试生成高程栅格,为一组14630个观测值的点数据计算地形起伏指数(TRI),这些点覆盖美国西南部大部分区域。示例代码如下:
#load packages library(geodata) library(elevatr) library(raster) #simulate point data longitude<-runif(n=14630, min=-115.4333, max=-108.6997) latitude<-runif(n=14630, min=32.45918, max=37.20805) pts<-data.frame(longitude,latitude) #change dataframe to a spatial points object coordinates(pts) = c("longitude", "latitude") # specify column names class(pts) #definining the lonlat projection prj_dd <- "+proj=longlat +datum=NAD83" #download a raster layer using the spatialpoints object as input #zoom specifies the resolution elevation <- get_elev_raster(pts, z = 13,prj=prj_dd,override_size_check=TRUE)
运行代码时,使用elevatr包的get_elev_raster函数持续出现以下错误:
Error in sf::gdal_utils(util = "warp", source = files, destination = destfile, :
gdal_utils warp: an error occured
附带警告信息:
In addition: Warning message:
In CPL_gdalwarp(source, destination, options, oo, doo, quiet, "-overwrite" %in% :
GDAL Error 3: C:\Users\name\AppData\Local\Temp\Rtmps3PYwn\file32b8e4c79d6.tif: Free disk space available is 8839901184 bytes, whereas 21476933632 are at least necessary. You can disable this check by defining the CHECK_DISK_FREE_SPACE configuration option to FALSE.
我的判断是要下载的栅格过大导致磁盘空间不足,请问这个判断是否正确?如果正确,有没有办法在保留所需高程数据(包含点数据所在单元格及其8个相邻单元格的高程)的前提下减小栅格大小,或者有什么释放磁盘空间的方法?
解答
判断正确性:是的,你的判断完全准确。错误信息清晰表明磁盘可用空间(约8.8GB)远小于生成目标栅格所需的最小空间(约21.5GB),这是报错的直接原因。
z=13的分辨率对于美国西南部这样大的区域来说,生成的栅格文件体积会非常庞大,超出了当前磁盘的承载能力。保留必要数据前提下缩减栅格体积的方案:
- 降低分辨率:如果业务场景允许,将
get_elev_raster中的z参数调小(例如z=10或z=11)。低分辨率栅格的文件体积会显著降低,同时仍能满足TRI计算中获取目标点8邻域高程的需求。 - 裁剪至点的邻域范围:不下载整个区域的栅格,而是仅下载覆盖所有点及其8邻域的最小范围:
- 将点转换为sf对象,为每个点创建覆盖自身及8邻域的缓冲(缓冲距离需匹配
z=13的栅格分辨率,z=13在WGS84下的单元格宽度约为0.0002度,可设置缓冲为0.0003度确保覆盖邻域); - 合并所有缓冲区域得到最小边界;
- 基于这个合并后的边界下载栅格。示例代码如下:
library(sf) # 转换为sf对象 pts_sf <- st_as_sf(pts, crs = prj_dd) # 创建覆盖点及邻域的缓冲 pts_buffer <- st_buffer(pts_sf, dist = 0.0003) # 合并所有缓冲 merged_extent <- st_union(pts_buffer) # 下载合并范围内的栅格 elevation <- get_elev_raster(merged_extent, z=13, prj=prj_dd, override_size_check=TRUE)
- 将点转换为sf对象,为每个点创建覆盖自身及8邻域的缓冲(缓冲距离需匹配
- 分块处理:将点数据按地理区域划分成若干子集,分别下载对应区域的栅格,计算每个子集的TRI后再合并结果,避免一次性加载超大栅格。
- 降低分辨率:如果业务场景允许,将
临时释放磁盘空间的方法:
- 清理系统临时文件夹:手动删除
C:\Users\name\AppData\Local\Temp\下的过期临时文件,释放被临时文件占用的空间; - 关闭占用磁盘的后台程序:暂停大型文件下载、视频渲染等占用大量磁盘IO的任务,释放更多可用空间;
- 临时禁用GDAL磁盘检查:在代码开头添加
Sys.setenv(CHECK_DISK_FREE_SPACE=FALSE),但仅在确认磁盘后续能容纳文件或可接受风险时使用,强制写入可能导致磁盘耗尽后程序崩溃或系统异常。
- 清理系统临时文件夹:手动删除
内容的提问来源于stack exchange,提问作者Jason Edelkind

