我有一个光栅,我正在对其重新采样多次(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)
}