Как вырезать растры с объектом шейп-файла в цикле по папкам в R?

#r #loops #raster #shapefile #cut

#r #циклы #растр #шейп-файл #вырезать

Вопрос:

Как, ребята. Как дела?

Я рад приветствовать вас.

Я пытаюсь вырезать растры (tif) из объектов шейп-файла

Структура моих данных выглядит следующим образом:

(Начальная папка)

Вид 1 <- model1.tif, model2.tif, model3.tif, cut1.shp

Вид 2 <- model1.tif, model2.tif, model3.tif, cut1.shp

Вид 3 <- model1.tif, model2.tif, model3.tif, cut1.shp

У меня разные папки из разных видов. В каждой папке у меня разные модели tiff и разные шейп-файлы. Что мне нужно, так это скрипт, который вырезает весь растр внутри этой папки species, используя файл шейп-файла в той же папке. А затем перейдите в следующую папку, чтобы сделать то же самое. Мне не нужно вырезать файлы, которые не находятся в одной папке. Я безуспешно пытаюсь выполнить следующий код. Я относительно новый пользователь в R, поэтому буду признателен за любую помощь. Спасибо, ребята. Хорошего дня.

 setwd ("H:/Tesis_maestria/1_Eliposides/1_Cut_models")
library(purrr)
library(kuenm)
library(raster)
library(maptools)
library(rgeos)
library(rgdal)
rm(list=ls())

path_general <- "H:/Tesis_maestria/1_Eliposides/1_Cut_models"


dirs_especies_path <- list.dirs(full.names = T,
                                recursive = F)

datum <- CRS(" proj=longlat  ellps=WGS84  datum=WGS84")

x=1
y=1
resultados_all <- seq_along(dirs_especies_path) %>% purrr::map_df(function(x){
   sp_mods <- list.files(dirs_especies_path[x], pattern = ".tif", full.names = TRUE)
   M <-list.files(dirs_especies_path[x], pattern=".shp", full.names = TRUE)
   r1 <- raster(sp_mods[y])
   cut_all <- seq_along(sp_mods) %>%  purrr::map_df(function(y){
   cor <-crop(r1,M)
   mas<-mask(cor,M)
   return(cut_all)
    })
     nwdf <- data.frame(cut_all,
                     sp_name=dirs_especies_names[x])
                         setwd("H:/Tesis_maestria/1_Eliposides/1_Cut_models/cut")
    writeRaster(cut_all,filename=paste(M[[i]]),bylayer=T,suffix=names(stac),format="GTiff")
  return(nwdf)
})
print(resultados_all)
  

Ответ №1:

После рабочего дня я смог успешно запустить этот код. Как следует. Я надеюсь, что это может помочь кому-то с той же проблемой. С уважением.

 rm(list=ls())
library(rgdal)
library(raster)
library(maptools)
library(rgeos)
library(purrr)
rm(list=ls())

setwd("H:/Tesis_maestria/1_Eliposides/1_Cut_models1")
datum <- CRS(" proj=longlat  ellps=WGS84  datum=WGS84")

path_general <- "H:/Tesis_maestria/1_Eliposides/1_Cut_models1"

dirs_especies_path <- list.dirs(full.names = T,
                                recursive = F)
                                
dirs_especies_names <- list.dirs(full.names = F,
                                 recursive = F)
                                 
#paste(path_general,dirs_especies_names,sep="")

##Presente##
for (i in 1:length(dirs_especies_path)){
    M <- list.files(dirs_especies_path[i],pattern = "csv.shp$",full.names = TRUE)
    mods <- list.files(dirs_especies_path[i],pattern = ".tif$",full.names = TRUE)
    stack <- raster::stack(mods)
    Ms <- shapefile(M)
    Ms@proj4string <- datum
    cor <- crop(stack,Ms)
    mas <- mask(cor,Ms)
    writeRaster(mas,filename=paste(M),bylayer=T,suffix=names(stack),format="GTiff")
    next}