The terra
package provides bindings to the
Geospatial Data Abstraction Library (GDAL) and access to projection and transformation
operations from the PROJ
library. This software is the basis for spatial software applications
and geodata analysis within R and is the successor of the
raster
package. Its bindings allow fast I/O (input/output)
operations for GDAL-supported raster formats, OGR-supported vector formats and numerous utility
functions to convert geographic longitude and latitude coordinates into
Cartesian coordinates (and vice versa). Furthermore, the
terra
package simplifies the access to large raster data
sets and extends the analytic tools available for both raster and vector
data. Additionally, the rasterVis
package provides enhanced
visualization opportunities.
library(terra)
library(rasterVis)
## load Berlin spatial data
load(url("https://userpage.fu-berlin.de/soga/data/r-data/berlin_districts_sp_wgs84.RData"))
load(url("https://userpage.fu-berlin.de/soga/data/r-data/berlin_geocampus.RData"))
If you have not installed the required packages yet, you can do so by
install.packages("terra", "rasterVIS")
To showcase some of the features provided by the terra
and rasterVis
packages we download the SRTM digital elevation model (DEM) for Germany. The data
was retrieved from OPENDEM on June 25, 2017. Please note the zipped
file is about 86.4 MB in size.
## build a temporary folder on disk
temp <- tempfile()
download_url <- "https://userpage.fu-berlin.de/soga/data/raw-data/spatial/"
zipfile <- "srtm_germany_dtm.zip"
## download the file
download.file(paste0(download_url, zipfile), temp, mode = "wb")
## unzip the file
unzip(temp)
unlink(temp)
To load the raster data set we apply the rast()
function
out of the terra
package.
## read the data
srtm <- rast("srtm_germany_dtm.tif")
Printing the SpatRaster
object summarizes the raster
data set.
srtm
## class : SpatRaster
## dimensions : 10801, 13201, 1 (nrow, ncol, nlyr)
## resolution : 0.0008333333, 0.0008333333 (x, y)
## extent : 4.999583, 16.00042, 46.99958, 56.00042 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source : srtm_germany_dtm.tif
## name : srtm_germany_dtm
When working with large data sets, checking the file size in advance is recommended. The processing time of large data may be quite long.
fs <- file.size("srtm_germany_dtm.tif")
print(paste("The file size is", as.numeric(fs) / 1e6, "MB"))
## [1] "The file size is 285.254776 MB"
Owing to the large file size, we downscaled the raster data set using
the aggregate()
function. The aggregate()
function performs aggregation by grouping adjacent pixels into new ones,
given an input raster and the aggregation factor fact
. For
example, using fact = 5
means that each set of 5 \(\times\) 5 cells in the original raster
becomes a single cell in the new raster. In addition, the
fun
argument specifies which function will be used to
calculate the new values based on existing ones (the default is
mean).
For demonstration purposes, we apply the aggregate()
function on the SRTM raster, aggregating 5 \(\times\) 5 sets of cells.
srtm_small <- aggregate(srtm, 5, fun = mean)
plot(srtm_small, main = "DEM-SRTM with default colormap")
Further, to clean up the data set, we exclude the area covering the
ocean. We can achieve this by setting all values equal to 0 to
NA
.
srtm_small[srtm_small == 0] <- NA
Now, we plot the aggregated and cleaned-up data set. Therefore, we
want to create two plots that show the same visualization with different
implementations. For the first one, we only use functions provided
directly by the base R
and the terra
package.
We use the additional library viridisLite
for the second plot, which provides several colorblind-friendly colour
maps for visualization purposes.
par(mfrow = c(1,2))
# creating an own colorRamp for DEM-Visualization
mycols <- colorRampPalette(c("#4a235a","slateblue4", "lightseagreen", "seagreen3",
"chartreuse2", "yellowgreen", "lightgoldenrod1"))
plot(srtm_small,
main = "DEM-SRTM Germany with own colorramp",
col=mycols(100), cex = 1.2)
# Create the same plot by using the viridisLite library
library(viridisLite)
plot(srtm_small,
main = "DEM-SRTM Germany",
col = viridis(1000), cex = 1.2)
Well, still there could be done some further adaptations, but we keep it for now.
Now, we want to subset the raster data set to reflect our area of
interest (AOI). Therefore, we apply the crop()
function and
feed it with a sp
object, in our case the district border
of the city of Berlin (berlin.sp.wgs84
).
srtm_berlin <- crop(srtm, berlin.sp.wgs84)
We may plot the resulting subset using the generic
plot()
function. In order to add additional layers, we call
the plot()
function once again; this time, however, we add
the argument add = TRUE
to the function call. To showcase
this functionality, we plot our AOI (the area of Berlin) and add the
SpatialPoints
object geocampus.sp
, which
represents the location of the GeoCampus Lankwitz.
plot(srtm_berlin,
main = "DEM-SRTM Berlin and GeoCampus Lankwitz",
cex.main = 0.7,
col = viridis(10)
)
plot(geocampus.sp, add = TRUE)
Another useful function is the mask()
function, which
creates a new Raster
object with the same values as the
input Raster
object, except for the masked cells, which are
set to NA
by default. Therefore, we need to transform the
sp
object to the equivalent terra
package
representation by using the vect()
function.
We use the mask()
function to mask the area outside the
district of Berlin. We plot the result using the objects
srtm_berlin
and geocampus.sp
.
berlin_vect <- vect(berlin.sp.wgs84)
srtm_berlin_masked <- mask(srtm_berlin, berlin_vect)
plot(srtm_berlin_masked,
main = "DEM-SRTM Berlin and GeoCampus Lankwitz",
cex.main = 0.7,
col = viridisLite::viridis(10)
)
plot(geocampus.sp, add = T)
The rasterVis
package defines additional methods for
spatial raster data access, manipulation and visualization (for more
information on the rasterVis
package, go here).
Here, we apply the levelplot()
function which is
optimized for displaying raster data and provides some very nice
additional graphic features. Type ??rasterVis::levelplot
in
your console for further information.
m <- 20
levelplot(srtm_berlin,
margin = FALSE,
contour = TRUE,
at = seq(0, minmax(srtm_berlin)[2], m),
main = paste("DEM-SRTM, contour lines", m, "m"),
par.settings = rasterTheme()
)
Another useful function in the terra
package is the
terrain()
function. This function computes the slope,
aspect and other terrain characteristics from a raster with elevation
data.
slope <- terrain(srtm_berlin,
v = "slope", neighbors=8,
unit = "degrees")
levelplot(slope,
margin = FALSE,
par.settings = BuRdTheme(),
main = "Slope"
)
The levelpot()
function returns a trellis
object, which relates to the lattice
graphics package. In order to
overlay different trellis
objects we make use of the
layer()
function of the latticeExtra
package.
For example, let us add the administrative border of Berlin. We overlay
trellis
objects with the +
sign.
library(latticeExtra)
library(sp)
levelplot(slope,
margin = FALSE,
par.settings = BuRdTheme(),
main = "Slope"
) + layer(sp.polygons(berlin.sp.wgs84))
Citation
The E-Learning project SOGA-R was developed at the Department of Earth Sciences by Kai Hartmann, Joachim Krois and Annette Rudolph. You can reach us via mail by soga[at]zedat.fu-berlin.de.
Please cite as follow: Hartmann, K., Krois, J., Rudolph, A. (2023): Statistics and Geodata Analysis using R (SOGA-R). Department of Earth Sciences, Freie Universitaet Berlin.