R- 栅格数学,同时保留整数格式
R- Raster math while preserving integer format
我有一些大型栅格(每个约 110 MB),我想对其执行一些栅格计算。出于本示例的目的,我想对文件 SNDPPT_M_sl1_1km_ll.tif
和 SNDPPT_M_sl2_1km_ll.tif
进行平均,这些文件位于 this website。实际上,数学有点复杂(几个栅格的一些乘法和除法)。
两个输入栅格都是整数 (INT1U) 数据,我希望输出也为 INT1U。但是,每当我尝试进行光栅计算时,它都会创建浮点格式的中间临时文件,这些文件的大小非常大。我正在使用一台有大约 7 GB 可用硬盘驱动器 space 的笔记本电脑,它在计算完成之前就被填满了。
# load packages
require(raster)
## script control
# which property?
prop <- "SNDPPT"
# load layers
r.1 <- raster(paste0("1raw/", prop, "_M_sl1_1km_ll.tif"))
r.2 <- raster(paste0("1raw/", prop, "_M_sl2_1km_ll.tif"))
# allocate space for output raster - this is about 100 MB (same size as input files)
r.out <- writeRaster(r.1,
filename=paste0("2derived/", prop, "_M_meanTop200cm_1km_ll.tif"),
datatype="INT1U")
# perform raster math calculation
r.out <- integer(round((r.out+r.2)/2))
# at this point, my hard drive fills due to temporary files > 7 GB in size
是否有人知道在 R 中使用整数输入和输出文件执行光栅数学运算同时最小化或避免非常大的中间文件的解决方法?
这里的技巧可能是使用 raster::overlay
进行计算,同时将结果保存为压缩的 tiff。这样的事情应该有效:
library(raster)
#> Loading required package: sp
# load layers
r.1 <- raster("C:/Users/LB_laptop/Downloads/SNDPPT_M_sl1_1km_ll.tif")
r.2 <- raster("C:/Users/LB_laptop/Downloads/SNDPPT_M_sl1_1km_ll.tif")
out <- raster::overlay(r.1, r.2,
fun = function(x, y) (round((x + y) / 2)),
filename = "C:/Users/LB_laptop/Downloads/SNDPPT_out.tif",
datatype = "INT1U",
options = "COMPRESS=DEFLATE")
> out
class : RasterLayer
dimensions : 16800, 43200, 725760000 (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333 (x, y)
extent : -180, 180, -56.00083, 83.99917 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : C:\Users\LB_laptop\Downloads\SNDPPT_out.tif
names : SNDPPT_out
values : 0, 242 (min, max)
HTH。
我有一些大型栅格(每个约 110 MB),我想对其执行一些栅格计算。出于本示例的目的,我想对文件 SNDPPT_M_sl1_1km_ll.tif
和 SNDPPT_M_sl2_1km_ll.tif
进行平均,这些文件位于 this website。实际上,数学有点复杂(几个栅格的一些乘法和除法)。
两个输入栅格都是整数 (INT1U) 数据,我希望输出也为 INT1U。但是,每当我尝试进行光栅计算时,它都会创建浮点格式的中间临时文件,这些文件的大小非常大。我正在使用一台有大约 7 GB 可用硬盘驱动器 space 的笔记本电脑,它在计算完成之前就被填满了。
# load packages
require(raster)
## script control
# which property?
prop <- "SNDPPT"
# load layers
r.1 <- raster(paste0("1raw/", prop, "_M_sl1_1km_ll.tif"))
r.2 <- raster(paste0("1raw/", prop, "_M_sl2_1km_ll.tif"))
# allocate space for output raster - this is about 100 MB (same size as input files)
r.out <- writeRaster(r.1,
filename=paste0("2derived/", prop, "_M_meanTop200cm_1km_ll.tif"),
datatype="INT1U")
# perform raster math calculation
r.out <- integer(round((r.out+r.2)/2))
# at this point, my hard drive fills due to temporary files > 7 GB in size
是否有人知道在 R 中使用整数输入和输出文件执行光栅数学运算同时最小化或避免非常大的中间文件的解决方法?
这里的技巧可能是使用 raster::overlay
进行计算,同时将结果保存为压缩的 tiff。这样的事情应该有效:
library(raster)
#> Loading required package: sp
# load layers
r.1 <- raster("C:/Users/LB_laptop/Downloads/SNDPPT_M_sl1_1km_ll.tif")
r.2 <- raster("C:/Users/LB_laptop/Downloads/SNDPPT_M_sl1_1km_ll.tif")
out <- raster::overlay(r.1, r.2,
fun = function(x, y) (round((x + y) / 2)),
filename = "C:/Users/LB_laptop/Downloads/SNDPPT_out.tif",
datatype = "INT1U",
options = "COMPRESS=DEFLATE")
> out
class : RasterLayer
dimensions : 16800, 43200, 725760000 (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333 (x, y)
extent : -180, 180, -56.00083, 83.99917 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : C:\Users\LB_laptop\Downloads\SNDPPT_out.tif
names : SNDPPT_out
values : 0, 242 (min, max)
HTH。