Specks
Specks

Reputation: 1

How to crop a raster stack using multiple shapefiles in r

I am new to r so I am still figuring out the basics. I am trying to a take a list of multiple shapefiles and use them to crop several rasters stack. Then use the cropped raster stacks and create histograms from them. I know I have to make lists of shapefiles which I have already figured out how to do. I also figured out how to individually crop rasters and make histograms. Unfortunately, the looping is throwing me for a loop. Does anyone have any suggestions?

Here's what I have so far:

library('rgdal')
library('raster')
library('landsat')
library('ggplot2')
library('rasterVis')
library('spatial.tools')
library('plyr')
library('reshape')
library('reshape2')
library('GGally')
library('lattice')
library('sp')
library('maptools')
library('rgeos')
library('gdata')

   #Create folder for shapefiles located and rasters
foldershp <- paste0("F:/2926/Hayes/crp/hnw/")
setwd("F:/2926/Hayes/crp/hnw/")
fileName<-list.files(path= ".", pattern = ".shp$")

folderout<- paste0("F:/Indices/Histograms/")

#list for Rasters
ras.root<- paste0("F:/2926/July/")
ras.list <- c("mtvi", "ndsvi", "ndvi", "ndwi", "satvi", "swir32")

 #Loop
for (i in ras.list) {
  s <- stack()
  setwd(paste(ras.root,i,sep=""))
  files <- list.files(path = getwd(), pattern = "*.tif$")
  s <- stack(files)
  for (fileName in fileNames){
    setwd(foldershp)
    data <- readOGR(dsn=".",substr(fileName,1,nchar(fileName)-4))
    names(data) <- substr(fileName,1,nchar(fileName)-4)
    m <- mask(s,data)
    setwd(folderout)
    png(paste(i,"_",names(data),"_hist_plot",sep=""))
    hist(m)
    dev.off()
    png(paste(i,"_clipped_",names(data),sep=""))
    plot(m)
    dev.off()
  }
    }

Upvotes: 0

Views: 1777

Answers (1)

Sam
Sam

Reputation: 1482

I'll give this a shot, though i'm sure there are more elegant ways....

set environments, read in the shapefiles as a list of names, create a character vector of where the rasters are kept (in your case, "mtvi","ndvi" etc)

require(raster)
require(gdata)
require(rgdal)

setwd("/home/st/R/shapes")
fileNames <- list.files(path = ".", pattern = "*.shp$")

ras.fols <- c("one","two","three")
setwd("/home/st/R/rasters")

now loop through the raster folders vector, setting the working directory to that folder and make a stack of the rasters inside it.

Then the nested loop will call your list of shapefiles and, one by one, mask the first rasterstack by the shapefiles and save a histogram and plot image of the masked data.

It then returns to the original loop, moves onto the next raster folder and performs the same action.

for (i in ras.fols) {
  s <- stack()
  setwd(paste("/home/st/R/rasters/",i,sep=""))
  files <- list.files(path = getwd(), pattern = "*.tif$")
  s <- stack(files)
    for (fileName in fileNames){
      setwd("/home/st/R/shapes")
      data <- readOGR(dsn=".",substr(fileName,1,nchar(fileName)-4))
      names(data) <- substr(fileName,1,nchar(fileName)-4)
      m <- mask(s,data)
      setwd("/home/st/R/write")
      png(paste(i,"_",names(data),"_hist_plot",sep=""))
      hist(m)
      dev.off()
      png(paste(i,"_clipped_",names(data),sep=""))
      plot(m)
      dev.off()
    }
}

hope there's something that can help. You can tidy it up, put the shapefile folder and character vector of raster folders to the top, replace some 'setwd9("adfad/asdad/asdasd")' with some tidier stuff etc

Upvotes: 2

Related Questions