--- title: "Copernicus Digital Elevation Models (an example use case)" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Copernicus_Digital_Elevation_Models (an example use case)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set(fig.width = 6, fig.height = 6, fig.align = "center", warning = FALSE, message = FALSE, echo = TRUE, eval = FALSE) ```
In this vignette I'll explain how to use the [CopernicusDEM](https://CRAN.R-project.org/package=CopernicusDEM) R package based on a use case of the [Movebank animal tracking data](https://www.movebank.org/cms/movebank-main). I picked animal tracking data because there is an abundance in the *Movebank* archive from all over the world. In this specific vignette I'll use data of **Wolves** from the *northeastern Alberta* and **Caribou** from the *British Columbia* (see the reference papers at the end of the vignette for more information).
The following wrapped code snippet creates the [leaflet](https://github.com/rstudio/leaflet) and [tmap](https://github.com/r-tmap/tmap) maps of this vignette, and it does the following: * it loads the required files (**Alberta_Wolves.csv** and **Mountain_caribou.csv**) * it iterates over the files * inside the for-loop for each file (and animal) separately * it keeps the required columns ('longitude', 'latitude', 'timestamp', 'individual_local_identifier', 'individual-taxon-canonical-name') * it builds a simple features object of the input data.tables * it creates a bounding box of the coordinate points * it extends the boundaries of the bounding box by 250 meters (so that points close to the boundaries are visible too) * it downloads and saves to a temporary directory the 30 meter elevation data for the Area of Interest (either for the 'Wolves' or the 'Tarandus') * it creates a Virtual Raster (.VRT) mosaic file of the multiple downloaded Elevation .tif files * it crops the Digital Elevation Model (DEM) using the previously created bounding box (the downloaded DEM's cover a bigger area, because they consist of fixed grid tiles) * it saves the **tmap** of each processed input file and the **data.table** which is required for the leaflet map to a separate list
```{r} # We disable s2 sf::sf_use_s2(use_s2 = FALSE) # We load the .csv files files = c(system.file('vignette_data/Alberta_Wolves.csv', package = "CopernicusDEM"), system.file('vignette_data/Mountain_caribou.csv', package = "CopernicusDEM")) leafgl_data = tmap_data = list() for (FILE in files) { cat(glue::glue("Processing of the '{basename(FILE)}' file ..."), '\n') dtbl = data.table::fread(FILE, header = TRUE, stringsAsFactors = FALSE) cols = c('location-long', 'location-lat', 'timestamp', 'individual-local-identifier', 'individual-taxon-canonical-name') dtbl_subs = dtbl[, ..cols] colnames(dtbl_subs) = c('longitude', 'latitude', 'timestamp', 'individual_local_identifier', 'individual-taxon-canonical-name') leafgl_data[[unique(dtbl_subs$`individual-taxon-canonical-name`)]] = dtbl_subs dtbl_subs_sf = sf::st_as_sf(dtbl_subs, coords = c("longitude", "latitude"), crs = 4326) sf_rst_ext = fitbitViz::extend_AOI_buffer(dat_gps_tcx = dtbl_subs_sf, buffer_in_meters = 250, CRS = 4326, verbose = TRUE) #................................................................ # Download the Copernicus DEM 30m elevation data because it has # a better resolution, it takes a bit longer to download because # the .tif file size is bigger #............................................................... dem_dir = tempdir() sfc_obj = sf_rst_ext$sfc_obj |> sf::st_make_valid() dem30 = CopernicusDEM::aoi_geom_save_tif_matches(sf_or_file = sfc_obj, dir_save_tifs = dem_dir, resolution = 30, crs_value = 4326, threads = parallel::detectCores(), verbose = TRUE) TIF = list.files(dem_dir, pattern = '.tif', full.names = TRUE) if (length(TIF) > 1) { #.................................................... # create a .VRT file if I have more than 1 .tif files #.................................................... file_out = file.path(dem_dir, 'VRT_mosaic_FILE.vrt') vrt_dem30 = CopernicusDEM::create_VRT_from_dir(dir_tifs = dem_dir, output_path_VRT = file_out, verbose = TRUE) } if (length(TIF) == 1) { #.................................................. # if I have a single .tif file keep the first index #.................................................. file_out = TIF[1] } raysh_rst = fitbitViz::crop_DEM(tif_or_vrt_dem_file = file_out, sf_buffer_obj = sfc_obj, verbose = TRUE) # convert to character to receive the correct labels in the 'tmap' object dtbl_subs_sf$individual_local_identifier = as.character(dtbl_subs_sf$individual_local_identifier) # use the latest version of the "tmap" R package (greater than version "3.99") # open with interactive viewer tmap::tmap_mode("view") map_coords = tmap::tm_shape(shp = dtbl_subs_sf) + tmap::tm_dots(col = 'individual_local_identifier') map_coords = map_coords + tmap::tm_shape(shp = raysh_rst, is.master = FALSE, name = 'Elevation') + tmap::tm_raster(col_alpha = 0.65, reverse = TRUE) tmap_data[[unique(dtbl_subs$`individual-taxon-canonical-name`)]] = map_coords } ``` ```{r, echo = FALSE} #.......................................................................................... # options to save the 'tmap' object: # # 1st. As an .html file which is approx. 9 MB # 2nd. As an .RDS object which saves the raster data too and it's approx. 98 MB # 3rd. Open in browser and take a screenshot and save the .png image # # Regarding the 1st. option an .html file can be loaded in an Rmarkdown file and # viewed on a web browser using 'iframe' in the following way: # # # # see: https://stackoverflow.com/a/54637781/8302386 # https://stackoverflow.com/a/36525111/8302386 #.......................................................................................... ``` ![](progress_logs.png)
Now, based on the saved data.tables we can create first the **leaflet map** to view the data of both animals in the same map,
```{r} #..................................... # create the 'leafGl' of both datasets #..................................... dtbl_all = rbind(leafgl_data$`Canis lupus`, leafgl_data$`Rangifer tarandus`) # see the number of observations for each animal table(dtbl_all$`individual-taxon-canonical-name`) # create an 'sf' object of both data.tables dat_gps_tcx = sf::st_as_sf(dtbl_all, coords = c("longitude", "latitude"), crs = 4326) lft = leaflet::leaflet() lft = leaflet::addProviderTiles(map = lft, provider = leaflet::providers$OpenTopoMap) lft = leafgl::addGlPoints(map = lft, data = dat_gps_tcx, opacity = 1.0, fillColor = 'individual-taxon-canonical-name', popup = 'individual-taxon-canonical-name') lft ```
![](leaflet_map.png)
The tracking data of the *Caribou* are on a higher elevation compared to the data of the *Wolves*. This is verified by the next *tmap* which includes the Elevation legend (**layer**). The additional legend shows the **individual identifier** of the animal - for the **Tarandus** there are **138** unique id's whereas
```{r} tmap_data$`Rangifer tarandus` # caribou ```
![](tarandus_elevation.png)
```{r} tmap_data$`Canis lupus` # wolves ```
for the **Wolves** only **12**,
![](wolves_elevation.png)
Elevation data using the **CopernicusDEM** R package can be visualized also in **3-dimensional space**. For the corresponding use case have a look to the [Vignette of the fitbitViz](https://CRAN.R-project.org/package=fitbitViz) package which uses internally the [Rayshader](https://github.com/tylermorganwall/rayshader) package.
**Movebank References**: * [Latham Alberta Wolves](https://datarepository.movebank.org/handle/10255/move.949) * Latham ADM (2009) Wolf ecology and caribou-primary prey-wolf spatial relationships in low productivity peatland complexes in northeastern Alberta. Dissertation. ProQuest Dissertations Publishing, University of Alberta, Canada, NR55419, 197 p. url:https://www.proquest.com/docview/305051214 * Latham ADM and Boutin S (2019) Data from: Wolf ecology and caribou-primary prey-wolf spatial relationships in low productivity peatland complexes in northeastern Alberta. Movebank Data Repository. \doi:10.5441/001/1.7vr1k987 * [Mountain caribou in British Columbia-radio-transmitter](https://datarepository.movebank.org/handle/10255/move.957) * BC Ministry of Environment (2014) Science update for the South Peace Northern Caribou (Rangifer tarandus caribou pop. 15) in British Columbia. Victoria, BC. 43 p. https://www2.gov.bc.ca/assets/gov/environment/plants-animals-and-ecosystems/wildlife-wildlife-habitat/caribou/science_update_final_from_web_jan_2014.pdf url:https://www2.gov.bc.ca/assets/gov/environment/plants-animals-and-ecosystems/wildlife-wildlife-habitat/caribou/science_update_final_from_web_jan_2014.pdf * Seip DR and Price E (2019) Data from: Science update for the South Peace Northern Caribou (Rangifer tarandus caribou pop. 15) in British Columbia. Movebank Data Repository. \doi:10.5441/001/1.p5bn656k