R:迭代地应用一些分析,并根据用于分析的数字保存输出



我有一个光栅,我正在对其重新采样多次(15次(。每次重新采样时,我都会使用光栅名称和一些因子作为名称保存结果(请参见下面的代码(。例如,如果光栅的名称是r,那么在使用std 0.2对其重新采样后,输出应该是r2。如果std是0.25,那么输出应该是r25,依此类推。到目前为止,我正在手动进行重新采样,但我想自动化这个过程。这里有一个例子:

library(raster)
r = raster("path/r1.tif")
m = as.matrix(r)
psf = down_sample_image(m,
factor = 4.66,
gaussian_blur = T,
gauss_sigma = 0.2 * 450) # 0.2 to 0.9 with step 0.05
e <- extent(r)
m2r = raster(psf)
extent(m2r) <- e
plot(m2r)
raster::crs(m2r) <- "EPSG:7767"
writeRaster(m2r, "path/r2.tif")

光栅的输出名称是基于函数gauss_sigma确定的。所以最后,我应该得到以下光栅:r2、r25、r3、r35、r4、r45……r9。总而言之,我正在寻找一个重复的过程:读取相同的光栅并执行上述分析15次(只有gauss_sigma的值随着步骤0.05从0.2变为0.9。*450应保持不变(。在每次迭代中,输出都应该使用基于gauss_sigma值的名称进行保存。

以下是我的尝试(基于以下答案(:

library(terra)
library(OpenImageR)

setwd("C:/Users/Geography/Desktop/multipolygon_test")


fname <- file.path(tempdir(), "a.tif")
r <- rast(ext(583400, 594200, 1005800, 1025900), res = 100, crs = "EPSG:7767")
values(r) <- sample(46:550, ncell(r), replace = T)
writeRaster(r, fname, overwrite = T)
dsi <- function(m, f) {
down_sample_image(m,
factor = 4.66,
gaussian_blur = T,
gauss_sigma = 0.20 * 450)
return(m / f)
}
ff <- c(0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90)
outf <- paste0(gsub("\.tif$", "", fname), "_", 1:15, ".tif")
nms <- paste0("f_", ff)
m <- as.matrix(r)
for (i in seq_along(ff)) {
d <- dsi(m, ff[i])
m2r <- setValues(r, d)
writeRaster(m2r, outf[i], overwrite=TRUE, names=nms[i])
}
rast(outf)

这是输出:

class       : SpatRaster 
dimensions  : 201, 108, 15  (nrow, ncol, nlyr)
resolution  : 100, 100  (x, y)
extent      : 583400, 594200, 1005800, 1025900  (xmin, xmax, ymin, ymax)
coord. ref. : WGS 84 / Maharashtra (EPSG:7767) 
sources     : a_1.tif  
a_2.tif  
a_3.tif  
... and 12 more source(s)
names       : f_0.2, f_0.25,     f_0.3,    f_0.35, f_0.4,    f_0.45, ... 
min values  :   230,    184,  153.3333,  131.4286,   115,  102.2222, ... 
max values  :  2750,   2200, 1833.3334, 1571.4286,  1375, 1222.2222, ...

问题是我不知道如何导出那些光栅文件。我尝试使用writeRaster函数,但我得到了这个错误(我多次尝试中的一次(:

Error in (function (classes, fdef, mtable)  : 
unable to find an inherited method for function ‘writeRaster’ for signature ‘"character", "character"’

有什么想法吗?

这是一个小光栅:

r = raster(extent(583400, 594200, 1005800, 1025900), res=100, crs="EPSG:7767")
values(r) <- sample(46:550, ncell(r), replace=T)

我用"terra";,代替";光栅";

示例数据

library(terra)
fname <- file.path(tempdir(), "test.tif")
r <- rast(ext(583400, 594200, 1005800, 1025900), res=100, crs="EPSG:7767")
values(r) <- sample(46:550, ncell(r), replace=T)
writeRaster(r, fname, overwrite=TRUE)

我没有down_sample_image,但这里有一个简单的存根,应该足够好的

dsi <- function(m, f) {
return(m / f)
}

定义参数,创建输出文件名,并在参数上循环。

ff <- c(1,2,3)
outf <- paste0(gsub("\.tif$", "", fname), "_", 1:3, ".tif")
nms <- paste0("f_", ff)
m <- as.matrix(r)
for (i in seq_along(ff)) {
d <- dsi(m, ff[i])
m2r <- setValues(r, d)
writeRaster(m2r, outf[i], overwrite=TRUE, names=nms[i])
}

这是输出

rast(outf)
#class       : SpatRaster 
#dimensions  : 201, 108, 3  (nrow, ncol, nlyr)
#resolution  : 100, 100  (x, y)
#extent      : 583400, 594200, 1005800, 1025900  (xmin, xmax, ymin, ymax)
#coord. ref. : WGS 84 / Maharashtra (EPSG:7767) 
#sources     : test_1.tif  
#              test_2.tif  
#              test_3.tif  
#names       : f_1, f_2,       f_3 
#min values  :  46,  23,  15.33333 
#max values  : 550, 275, 183.33333 

看起来你的功能是错误的

dsi <- function(m, f) {
down_sample_image(m,
factor = 4.66,
gaussian_blur = T,
gauss_sigma = 0.20 * 450)
return(m / f)
}

稍后:

您没有捕获down_sample_image的输出。我认为应该是

dsi <- function(m, f) {
m <- down_sample_image(m,
factor = 4.66,
gaussian_blur = T,
gauss_sigma = 0.20 * 450)
return(m / f)
}

以下是我根据上面的答案所做的:

library(gridkernel)
library(gridprocess)
library(raster)
tirs = raster("path/tirs.tif")
cr = raster("path/ntl.tif")
for (i in seq(from = 0.2, to = 0.9, by = 0.05)) {
g = as.grid(tirs)
smoothed = gaussiansmooth(g, sd = i * 460, max.r = 100)
r <- raster(smoothed)

raster::crs(r) <- "EPSG:7755"

print(i)

r = resample(r, cr, method = "ngb")
stringedi = gsub("0\.", "", toString(format(i, nsmall = 2)))
file_name <- paste0("tirs", stringedi, ".txt")
print(file_name)
# Make sure here you supply full path to folder without the last "/"
full_file_path = paste0("path", "/", file_name)
writeRaster(r, full_file_path, format = "GTiff", overwrite = T)
}

最新更新