【问题标题】:How can I automize raster processing in R如何在 R 中自动化栅格处理
【发布时间】:2021-08-10 18:31:24
【问题描述】:

我有 90 个栅格需要裁剪和重新采样以匹配我的模板栅格。有没有办法让我“自动化”? (即,只需要运行一次该过程,例如,我可以让它运行一夜)

我知道答案可能是“循环”,但我不知道该怎么做,因为每个原始文件都有不同的名称,最终产品需要具有相同的名称,但以“_final.升序”

这是我一直在使用的代码:

library(raster)

#load original world raster (the one to be processed)
mau <- raster("PATH/name_of_the_raster.asc")

#load bounding box raster made by me (to clip the original and therefore make the next steps easier)
rastergrande <- raster("PATH")

#clip original raster by bounding box raster
intermedio <- crop(mau, rastergrande)

#load my template raster (the one that has the extent and cell size I want)
template <- raster("PATH")

#resample raster to template parameters
novoraster <- resample(intermedio, template, "bilinear")

#assign NA's to where template is NA
values(novoraster)[is.na(values(template))] <- NA

#Export to ascii
writeRaster(novoraster, "PATH/name_of_the_raster_final.asc", overwrite=TRUE)

【问题讨论】:

    标签: r r-raster


    【解决方案1】:

    这个问题的变体已经被问过很多次了。这是一个example

    一般的方法是获取包含所有文件名的向量,通常使用list.files,并使用它通过更改名称或路径来制作输出文件名的向量。像这样的:

    input <- list.files(path=".", pattern="asc$", full.names=TRUE)
    output <- gsub(".tif", "_out.tif", input)
    

    或者换个文件夹

    output <- gsub("this/path", "that/path", input)
    

    然后使用循环

    for (i in 1:length(input)) {
       # read input[i]
       # write output[i] 
    }
    

    一个工作的最小示例(使用单个文件):

    library(raster)
    input <- system.file("external/test.grd", package="raster")
    # write to current working directory, but with asc extensions
    output <- gsub(".grd", ".asc", basename(input))
    
    for (i in 1:length(input)) {
        r <- raster(input[i])
        writeRaster(r, output[i], overwrite=TRUE)
    }
    

    另外,与您的问题没有直接关系,但是:

    values(novoraster)[is.na(values(template))] <- NA
    

    应该是

    novoraster <- mask(novoraster, template)     
    

    【讨论】:

    • 在循环中,这一行不起作用:r
    【解决方案2】:

    您可以使用lapply。您可能需要一个文件名向量,可能带有

    fn_list <- list.files("PATH", pattern="asc$")
    

    你的主力函数可能看起来像

    one_file <- function(fn, template, rastergrande) {
       mau <- raster(fn)
       intermedio <- crop(mau, rastergrande)
       novoraster <- resample(intermedio, template, "bilinear")
       values(novoraster)[is.na(values(template))] <- NA
       fn_out <- gsub("asc$", "_final.asc", fn)
       writeRaster(novoraster, fn_out)
    }
    

    然后您可以在fn_list 上申请one_file

    library(raster)
    library(usdm)
    library(ggplot2)
    library(rgdal)
    
    rastergrande <- raster("PATH")
    template <- raster("PATH")
    
    lapply(fn_list, one_file, template=templ, rastergrande=rastergrande)
    

    顺便看看terra包:https://www.youtube.com/watch?v=O8V4QJ13Gjc

    【讨论】:

    • 我不确定我是否理解这部分: one_file
    【解决方案3】:

    在这里您可以使用 for 循环或应用(lapply 和 mapply)

    file_names <- list.files("PATH/", pattern = ".tif")
    r_list <- lapply(file_names,raster)
    
    rastergrande <- raster("PATH")
    template <- raster("PATH")
    
    
    intermedio <- list()
    novoraster <- list()
    

    使用栅格名称创建矢量

    rasternames <- c("name1","name2" ...)
    

    用于处理所有栅格的 For 循环

    for(i in 1:length(file_names){
    
    intermedio[[i]] <- crop(r_list[[i]], rastergrande)
    novoraster[[i]] <- resample(intermedio[[i]], template, "bilinear")  
    values(novoraster[[i]])[is.na(values(template))] <- NA
    
    writeRaster(novoraster[[i]], paste0("PATH/", rasternames[i], ".asc"), overwrite=TRUE)
    
    }
    

    【讨论】:

    • 我不明白你建议的代码的第二行。它是否会生成包含我所有栅格的栅格列表?
    • 是的,我将生成一个包含文件夹内所有栅格的栅格列表。
    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 2019-04-22
    相关资源
    最近更新 更多