4.2 Read and write a raster data file
Sometimes we can download raster data of interest as we saw in Section 3.1. But, most of the time you need to read raster data stored as a file. Raster data files can come in numerous different formats. For example, PRPISM comes in the Band Interleaved by Line (BIL) format, some of the Daymet data comes in netCDF format. Other popular formats include GeoTiff, SAGA, ENVI, and many others.
4.2.1 Read raster file(s)
You use terra::rast()
to read raster data of many common formats, and it should be almost always the case that the raster data you got can be read using this function. Here, we read a GeoTiff file (a file with .tif extension):
(<- rast("Data/IA_cdl_2015.tif")
IA_cdl_2015_sr )
class : SpatRaster
dimensions : 11671, 17795, 1 (nrow, ncol, nlyr)
resolution : 30, 30 (x, y)
extent : -52095, 481755, 1938165, 2288295 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=aea +lat_0=23 +lon_0=-96 +lat_1=29.5 +lat_2=45.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
source : IA_cdl_2015.tif
name : Layer_1
min value : 0
max value : 229
One important thing to note here is that the cell values of the raster data are actually not in memory when you “read” raster data from a file.
You basically just established a connection to the file. This helps to reduce the memory footprint of raster data handling. You can check this by raster::inMemory()
function for Raster
\(^*\) objects, but the same function has not been implemented for terra
yet.
You can read multiple single-layer raster datasets of the same spatial extent and resolution at the same time to have a multi-layer SpatRaster
object. Here, we import two single-layer raster datasets (IA_cdl_2015.tif and IA_cdl_2016.tif) to create a two-layer SpatRaster
object.
#--- the list of path to the files ---#
<- c("Data/IA_cdl_2015.tif", "Data/IA_cdl_2016.tif")
files_list
#--- read the two at the same time ---#
(<- rast(files_list)
multi_layer_sr )
class : SpatRaster
dimensions : 11671, 17795, 2 (nrow, ncol, nlyr)
resolution : 30, 30 (x, y)
extent : -52095, 481755, 1938165, 2288295 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=aea +lat_0=23 +lon_0=-96 +lat_1=29.5 +lat_2=45.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
sources : IA_cdl_2015.tif
IA_cdl_2016.tif
names : Layer_1, Layer_1
min values : 0, 0
max values : 229, 241
Of course, this only works because the two datasets have the identical spatial extent and resolution. There are, however, no restrictions on what variable each of the raster layers represent. For example, you can combine PRISM temperature and precipitation raster layers.
4.2.2 Write raster files
You can write a SpatRaster
object using terra::writeRaster()
.
::writeRaster(IA_cdl_2015_sr, "Data/IA_cdl_stack.tif", filetype = "GTiff", overwrite = TRUE) terra
The above code saves IA_cdl_2015_sr
(a SpatRaster
object) as a GeoTiff file.70 The filetype option can be dropped as writeRaster()
infers the filetype from the extension of the file name. The overwrite = TRUE
option is necessary if a file with the same name already exists and you are overwriting it. This is one of the many areas terra
is better than raster
. raster::writeRaster()
can be frustratingly slow for a large Raster
\(^*\) object. terra::writeRaster()
is much faster.
You can also save a multi-layer SpatRaster
object just like you save a single-layer SpatRaster
object.
::writeRaster(IA_cdl_stack_sr, "Data/IA_cdl_stack.tif", filetype = "GTiff", overwrite = TRUE) terra
The saved file is a multi-band raster datasets. So, if you have many raster files of the same spatial extent and resolution, you can “stack” them on R and then export it to a single multi-band raster datasets, which cleans up your data folder.