我已经用AdehabitatHR生成了几个利用分布图(UD),并将它们存储为Geotiffs。我现在用同样的UDs和Lattice软件包生成一些地图,并将它们保存为LZW压缩的高分辨率tiff图像。问题是,我有数百张地图要制作、保存和命名。一旦我从一个目录中加载了所有必要的文件,是否有办法自动做到这一点?我的每一个UD都有以下结构的文件名 "UD_resolution_species_area_year_season.tif",在最后的名称,我给我的地图,我想保持相同的结构(或整个文件名),但添加前缀 "blablabla_",如 "blablabla_UD_resolution_species_area_year_season.tiff"。图片还包括一个主名,一个大写字母,也要改。
此刻我用的是下面的。
rlist = list.files(getwd(), pattern = "tif$", full.names = FALSE)
for (i in rlist) {
assign(unlist(strsplit(i, "[.]"))[1], raster(i))
}
shplist = list.files(getwd(), pattern = "shp$", full.names = FALSE)
for (i in shplist) {
assign(unlist(strsplit(i, "[.]"))[1], readOGR(i))
}
UD <- 'UD_resolution_species_area_year_season'
ext <- extent(UD) + 0.3 # set the extent for the plot
aa <-
quantile(UD,
probs = c(0.25, 0.75),
type = 8,
names = TRUE)
my.at <- c(aa[1], aa[2])
my.at <- round(my.at, 3)
maxval <- maxValue(UD)
tiff(
"C:/myworkingdirectory/maps/blablabla_UD_resolution_species_area_year_season.tiff",
res = 600,
compression = "lzw",
width = 15,
height = 15,
units = "cm"
)
levelplot(
UD,
xlab = "",
ylab = "",
xlim = c(ext[1], ext[2]),
ylim = c(ext[3], ext[4]),
margin = FALSE,
contour = FALSE,
col.regions = viridis(1000),
colorkey = list(at = seq(0, maxval)),
main = "A",
maxpixels = 2e5
) + latticeExtra::layer(sp.polygons(Land, fill = "grey50", col = NA)) + contourplot(
`UD`,
at = my.at[1],
labels = FALSE,
margin = FALSE,
lty = 2,
col = "orange",
pretty = TRUE
) + contourplot(
UD,
at = my.at[2],
labels = FALSE,
margin = FALSE,
lty = 2,
col = "red",
pretty = TRUE,
)
dev.off()
这是一个常见的初学者错误,使用 assign
. 做 不 使用它,就会产生你现在所面临的那种麻烦。相反,你可以制作列表或者使用循环。
另外,你问的是基本的 R 东西,但你增加了很多关于设置范围和 levelplot 的无关细节,使问题复杂化了。学习做这些基本的东西,最好是先去掉杂乱无章的东西,集中精力做一个简单的案例。这也是你应该在这个论坛上写问题的方式。
实质上你有一堆文件要处理。下面我演示了如何在名字的向量上循环,然后循环,在循环中做你需要做的事情。
library(raster)
rastfiles <- list.files(pattern = "tif$", full.names=TRUE)
outputfiles <- file.path("output/path", paste0("prefix_", basename(rastfiles)))
for (i in 1:length(rastfiles))
r <- raster(rastfiles[i])
png(outputfiles[i])
plot(r)
dev.off()
}
你也可以先把所有的文件读到一个列表中去。
rastfiles <- list.files(pattern = "tif$", full.names=TRUE)
rlist <- lapply(rastfiles, raster)
names(rlist) <- gsub(".tif$", "", basename(rastfiles))
rastfiles <- list.files(pattern = "shp$", full.names=TRUE)
slist <- lapply(shpfiles, readOGR)
names(slist) <- gsub(".shp$", "", basename(shpfiles))
也许还可以创建一个输出文件名的向量。
outputtif <- file.path("output/dir", basename(rastfiles))
然后在列表中的项目或输出文件名上循环。