Search code examples
rstackrasterlayergeotiff

Extracting all individual layers from a Raster Brick File


I have stacked 28 layers to a brick in R

brik
class      : RasterBrick 
dimensions : 720, 1440, 1036800, 28  (nrow, ncol, ncell, nlayers)
resolution : 0.25, 0.25  (x, y)
extent     : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
source     : C:/Users/Ujjal Baruah/AppData/Local/Temp/Rtmp0GaiPO/raster/r_tmp_2020-01-03_030159_46788_10398.grd 
names      : Data.Fiel//tNO2Trop.1, Data.Fiel//tNO2Trop.2, Data.Fiel//tNO2Trop.3, Data.Fiel//tNO2Trop.4, Data.Fiel//tNO2Trop.5, Data.Fiel//tNO2Trop.6, Data.Fiel//tNO2Trop.7, Data.Fiel//tNO2Trop.8, Data.Fiel//tNO2Trop.9, Data.Fiel//NO2Trop.10, Data.Fiel//NO2Trop.11, Data.Fiel//NO2Trop.12, Data.Fiel//NO2Trop.13, Data.Fiel//NO2Trop.14, Data.Fiel//NO2Trop.15, ... 

Now, i want to save this individual layers in Geotiff using

writeRaster(brik, file.path('/output/filepath/', names(brik)), bylayer=TRUE, format('GTiff'))

Unfortunately, i get just one file instead of multiple layers in geotiff.

Any solution would be appreciated. Thanks


Solution

  • writeRaster seems to strip off the dot-number before creating a raster file. Hence it tries to write your layers all to Data.Fiel//tNO2Trop.tif.

    > writeRaster(r, "./test.2", format="GTiff")
    > dir(".")
    [1] "test.tif"
    

    (Note for some reason your code has format("GTiff") for format="GTiff". This works by the fluke that format is a function and returns the string "GTiff" and writeRaster is expecting the format string here)

    I don't know why and I don't know if this is documented or a bug. You can work round by using dashes instead of dots:

    > writeRaster(r, "./test-2", format="GTiff")
    > dir(".")
    [1] "test-2.tif" "test.tif" 
    

    and if dots are important to you then do a file.rename afterwards.

    Edit: If you add the .tif to the file names then all is well:

    > writeRaster(s, names(s), bylayer=TRUE, format="GTiff")
    Error in .getGDALtransient(x, filename = filename, options = options,  : 
      filename exists; use overwrite=TRUE
    

    fails on the second layer because dot-number is stripped:

    > dir()
    [1] "layer.tif"
    

    add .tif to the names:

    > writeRaster(s, paste0(names(s),".tif"), bylayer=TRUE, format="GTiff")
    

    shazam:

    > dir()
    [1] "layer.1.tif" "layer.2.tif" "layer.3.tif" "layer.tif"