From adc4087d8c6375540014c088003753fc4eea79f1 Mon Sep 17 00:00:00 2001 From: Ashlesha-Khatiwada Date: Mon, 13 Nov 2023 21:10:32 -0700 Subject: [PATCH] Commiting Hw --- 01_spatial_intro_Ashlesha.Rmd | 413 +++++++++++++++++++ 02_spatial_analysis_Ashlesha.Rmd | 378 +++++++++++++++++ 02_spatial_analysis_Ashlesha.md | 499 +++++++++++++++++++++++ bonus/get_spatial_challenge_Ashlesha.Rmd | 221 ++++++++++ data/poudre_elevation.RDS | Bin 0 -> 14581 bytes data/poudre_elevation.tif | Bin 0 -> 15431 bytes data/poudre_hwy.dbf | Bin 0 -> 1446 bytes data/poudre_hwy.prj | 1 + data/poudre_hwy.shp | Bin 0 -> 54132 bytes data/poudre_hwy.shx | Bin 0 -> 132 bytes data/poudre_points.dbf | Bin 0 -> 309 bytes data/poudre_points.prj | 1 + data/poudre_points.shp | Bin 0 -> 184 bytes data/poudre_points.shx | Bin 0 -> 124 bytes data/poudre_spatial_objects.RData | Bin 0 -> 40278 bytes 15 files changed, 1513 insertions(+) create mode 100644 01_spatial_intro_Ashlesha.Rmd create mode 100644 02_spatial_analysis_Ashlesha.Rmd create mode 100644 02_spatial_analysis_Ashlesha.md create mode 100644 bonus/get_spatial_challenge_Ashlesha.Rmd create mode 100644 data/poudre_elevation.RDS create mode 100644 data/poudre_elevation.tif create mode 100644 data/poudre_hwy.dbf create mode 100644 data/poudre_hwy.prj create mode 100644 data/poudre_hwy.shp create mode 100644 data/poudre_hwy.shx create mode 100644 data/poudre_points.dbf create mode 100644 data/poudre_points.prj create mode 100644 data/poudre_points.shp create mode 100644 data/poudre_points.shx create mode 100644 data/poudre_spatial_objects.RData diff --git a/01_spatial_intro_Ashlesha.Rmd b/01_spatial_intro_Ashlesha.Rmd new file mode 100644 index 0000000..fe6d537 --- /dev/null +++ b/01_spatial_intro_Ashlesha.Rmd @@ -0,0 +1,413 @@ +--- +title: "Intro to Spatial Data in R" +author: "Caitlin Mothes" +date: "`r Sys.Date()`" +output: github_document +--- + +```{r setup, include= FALSE} +knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE, eval = FALSE) +``` + +## 1. Spatial Data Formats + +**Vector Data** + +- Locations (points) + + - Coordinates, address, country, city + +- Shapes (lines or polygons) + + - Political boundaries, roads, building footprints, water bodies + +**Raster Data** + +- Images (matrix of cells organized by rows and columns) + + - Satellite imagery, climate, landcover, elevation + + ![](spatial_formats.png){width="50%"} + +## 2. Import and manipulate spatial data + +There are a few new R packages we will need to work with spatial data, listed below with hyperlinks and decribed in more detail throughout this and other lessons. + +- `sf` : working with vector data + +- `terra` : working with raster data + +- `tmap` : visualizing spatial data (i.e., making maps!) + +- `tigris` : import vector data from the U.S. Census database (i.e., political boundaries, roads, etc.) + +- `elevatr` : import elevation data + +- `rgbif` (optional) : import species occurrence data from the GBIF database + +- `soilDB` (optional) : import snow depth data from SNOTEL sites across the U.S. + +We've already added these packages to a 'setup.R' script in this project directory, so you can use `source("setup.R")` at the beginning of each lesson if you want, otherwise you will need to install each new one manually with `install.packages()`. + +```{r} +source("setup.R") +``` + +### 2.1 Vector Data + +### [`tigris`](https://github.com/walkerke/tigris) + +### **Polygons** + +All the data we are working with in this lesson is confined to the state of Colorado. Let's start by pulling in political boundaries for Colorado counties with the `tigris` package, which returns a shapefile consisting of polygons for each county. + +```{r} +# download county shapefile for the state of Colorado +co_counties <- counties(state = "CO") +``` + +The `tigris` package is one of many data retrieval R packages that uses API calls to pull in data from various online/open databases directly into your R session, without the need to separately download. When you close out your R session, these 'temp' files are erased, so it does not use up any of your local storage. + +At the end of this lesson you will learn how to save shapefiles to your computer if you do in fact want to store and use them in the future (e.g., you manipulated a data set quite a bit and don't want to re-run the entire process every new R session). + +### **Lines** + +`tigris` has many other data sets in addition to political boundaries. Today let's work with another shapefile, importing roads for Larimer county, which returns a polyline dataset for all roads in Larimer County. + +```{r} +co_roads <- roads(state = "CO", county = "Larimer") +``` + +### [`tmap`](https://r-tmap.github.io/tmap/) + +Throughout this lesson we will be using the `tmap` package to produce quick static or interactive maps. + +`tmap` allows for both static ("plot" mode) and interactive ("view" mode) mapping options, which you can set using the function `tmap_mode()` . For today we will be making quick interactive plots. Once you set the mode with `tmap_mode()`, every plot call to `tmap` after that produces a plot in that mode. + +```{r} +tmap_mode("view") +``` + +Lets view our Colorado counties and Larimer County roads shapefiles. To make a "quick thematic map" in `tmap` you can use the `qtm()` function. You can also use `tm_shape()` plus the type of spatial layer (e.g., `tm_polygons()`) to add your layers to the map. Both methods below will produce the same exact map, and you may think why would you ever need to use the `tm_shape()` method since its more code? The answer may be rarely, but there are some cases where you can customize your maps better with `tm_shape()` that we will see later on. + +Also notice that `tmap` uses `+` signs to tack on additional maps/elements similar to `ggplot2` code (i.e., no pipe!) + +*Note: map rendering may take a few seconds because the roads layer is pretty large and detailed.* + +```{r} +# Option 1: Using qtm() +qtm(co_counties)+ + qtm(co_roads) +``` + +```{r} +# Option 2: Using tm_shape() +tm_shape(co_counties)+ + tm_polygons()+ +tm_shape(co_roads)+ + tm_lines() +``` + +Mess around with this map a little bit. See that you can change the basemap, turn layers on and off, and click on features to see their attributes. + +There are a ton of ways to customize these maps (more details on this in the spatial viz lesson!). For example, `co_counties` has an 'ALAND' variable, which represents the total land area of each county. To color by that variable we would use: + +```{r} +qtm(co_counties, fill = "ALAND") +``` + +Let's inspect the spatial data sets a little more. What do you see when you run the following line of code? + +```{r} +class(co_counties) +``` + +### [`sf`](https://r-spatial.github.io/sf/) + +By default, the `tigris` package imports spatial data in `sf` format, which stands for 'simple features'. The `sf` package provides an easy and efficient way to work with vector data, and represents spatial features as a `data.frame` or `tibble` with a **geometry** column, and therefore also works well with `tidyverse` packages to perform manipulations like you would a data frame. + +For example, we are going to do an exercise for the Poudre Canyon Highway, so we want to filter out the roads data set to only those features. Using your investigative geography skills and your interactive map, find the highway on your map and find out what the exact 'FULLNAME' attribute is, and use that to `filter()` the data set. Call the new roads feature `poudre_hwy`. + +```{r} +poudre_hwy <- co_roads %>% + filter(FULLNAME == "Poudre Canyon Hwy") + +qtm(poudre_hwy) +``` + +### Points + +Most often when you are working with points, you start with an excel file or something similar that consists of the raw latitude and longitude. When you have spatial data that is not explicitly spatial yet or not in the `sf` format, you use the `st_as_sf()` function to transform it. + +Lets work with a couple locations along the Poudre highway, making a small data frame of their coordinates: + +```{r} +poudre_points <- data.frame(name = c("Mishawaka", "Rustic", "Blue Lake Trailhead"), + long = c(-105.35634, -105.58159, -105.85563), + lat = c(40.68752, 40.69687, 40.57960)) +``` + +Right now, `poudre_points` is just a data frame (run `class(poudre_points)` to check). We need to convert it to a spatial (`sf`) object first in order to map and spatially analyze it. + +Within the `st_as_sf()` function we need to specifying the longitude and latitude columns in our `poudre_points` data frame and the CRS (Coordinate Reference System). **Note** **that 'x' (longitude) always goes first followed by 'y' (latitude).** Otherwise it will map your points on the other side of the world. + +```{r} +poudre_points_sf <- st_as_sf(poudre_points, coords = c("long", "lat"), crs = 4326) + +qtm(poudre_hwy)+ + qtm(poudre_points_sf) +``` + +Note the 4-digit number we assign for `crs`. This is an EPSG code, which is tied to a specific CRS called WGS84 and one of the most common reference systems coordinates are recorded in (often noted by the fact that the values are in decimal degrees). This is used by Google Earth, the U.S. Department of Defense and all GPS satellites (among others). A full list of EPSG codes and coordinate reference systems can be found [here](https://spatialreference.org/ref/epsg/). Note, there are A LOT. Probably the most common used in the U.S. are WGS84 (a global CRS) and NAD83 (used by many U.S. federal agencies). + +### Coordinate Reference Systems + +Probably the most important part of working with spatial data is the coordinate reference system (CRS) that is used. The CRS describes how and where your spatial data is located on Earth. There are numerous different CRS's depending on when and how the data was collected, the spatial location and extent it was collected, etc. In order to analyze and visualize spatial data, **all objects must be in the exact same CRS**. + +We can check a spatial object's CRS by printing it the object name to the console, which will return a bunch of metadata about the object. You can specifically return the CRS for `sf` objects with `st_crs()`. + +```{r} +# see the CRS in the header metadata: +co_counties + +#return just the CRS (more detailed) +st_crs(co_counties) +``` + +You can check if two objects have the same CRS like this: + +```{r} +st_crs(poudre_hwy) == st_crs(poudre_points_sf) +``` + +Uh oh, the CRS of our points and lines doesn't match. While `tmap` performs some on-the-fly transformations to map the two layers together, in order to do any analyses with these objects you'll need to re-project one of them. You can project one object's CRS to that of another with `st_transform` like this: + +```{r} +# transform the CRS of poudre_points_sf to the CRS of poudre_hwy +poudre_points_prj <- st_transform(poudre_points_sf, st_crs(poudre_hwy)) + +# Now check that they match +st_crs(poudre_points_prj) == st_crs(poudre_hwy) +``` + +### 2.2 Raster Data + +### [`elevatr`](https://github.com/jhollist/elevatr/) + +Lets import some elevation data using the `elevatr` package. The function `get_elev_raster()` returns a raster digital elevation model (DEM) from the AWS Open Data Terrain Tiles. For this function you must supply a spatial object specifying the **extent** of the returned elevation raster and the resolution (specified by the zoom level `z`). We are importing elevation at \~ 1km resolution (more like 900 m), and we can use our `co_counties` object as the extent we want to download to, which will return elevation tiles for the state of Colorado. + +*Note: 'extent' is the spatial bounding box of the data (represented by the x,y coordinates of the four corners inclusive of the entire spatial data)* + +```{r} +co_elevation <- get_elev_raster(co_counties, z = 7) +``` + +```{r} +qtm(co_elevation) +``` + +By default, `tmap` uses a categorical symbology to color the cells by elevation. You can change that to a continuous palette like this (an example of when `tm_shape()` allows us to edit the map more): + +```{r} +tm_shape(co_elevation)+ + tm_raster(style = "cont", title = "Elevation (m)") +``` + +When we see this on a map, we see that it actually extends beyond Colorado due to how the Terrain Tiles are spatially organized. + +Let's inspect this raster layer a little. By printing the object name to the console we see a bunch of metadata like resolution (cell/pixel size), extent, CRS, and file name. + +```{r} +co_elevation +``` + +### `terra` + +We use the `terra` package to work with raster data. For example, we only want to see elevation along the Poudre highway. We can use `crop` to crop the raster to the extent of our `poudre_hwy` spatial object using the `ext()` function to get the extent (i.e., bounding box) of our `poudre_hwy` object. + +However...the following line of code **doesn't work:** + +```{r} +# If we try this, we get an error +co_elevation_crop <- crop(co_elevation, ext(poudre_hwy)) + +``` + +This doesn't work because our `co_elevation` object is actually not in the proper format to work with the `terra` package. The `elevatr` package still uses the `raster` package to work with raster data, however this package is outdated and we want to stick with `terra` for this course and any future work you do with raster data. + +```{r} +# note the data type of elevation is RasterLayer +class(co_elevation) +``` + +`terra` uses objects of a new class called `SpatRaster`. Converting a `RasterLayer` to a `SpatRaster` is quick using the `rast()` function. + +```{r} +co_elevation <- rast(co_elevation) +``` + +Now check the class: + +```{r} +class(co_elevation) +``` + +Now we can use `terra` functions, and re-run the `crop()` code we tried earlier: + +```{r} +co_elevation_crop <- crop(co_elevation, ext(poudre_hwy)) +``` + +Plot all our spatial layers together: + +```{r} +qtm(co_elevation_crop) + + qtm(poudre_hwy) + + qtm(poudre_points_prj) +``` + +## 3. Reading and Writing Spatial Data + +### 3.1 Writing spatial data + +All of the spatial data we've worked with are only saved as objects in our environment. To save the data to disk, the `sf` and `terra` packages have functions to do so. You are not required to save these files, but if you want to follow along with these functions save the data to the 'data/' folder. + +To save vector data with `sf`, use `write_sf()` + +```{r} +write_sf(poudre_hwy, "data/poudre_hwy.shp") + +write_sf(poudre_points_prj, "data/poudre_points.shp") +``` + +While you can give the file any name you want, note that you **must put '.shp' as the extension of the file**. While '.shp' stands for 'shapefile', if you run the code above you'll notice a bunch of other files are saved, having the same file name but different extensions. These are auxiliary files required to properly work with the .shp shapefile. **If you ever want to share or move a shapefile,** **you must zip all the auxiliary files and .shp file together**. Think of them as a package deal! + +To save raster data with `terra` use `writeRaster()` + +```{r} +writeRaster(co_elevation_crop, "data/poudre_elevation.tif") +``` + +Same as with the vector data, when saving raster data you **must add the '.tif' file extension** to the name. There are various formats raster data can be stored as (e.g., ASCII, ESRI Grid) but GeoTiffs are the most common and generally easiest to deal with in R. + +### 3.2 .RData Files + +Another way you can store data is saving your environmental variables as R Data objects. You may have already seen '.RData' files in your folders before if you ever click 'yes' when closing out of RStudio asks you to save your workspace. What this does is save everything in your environment to a file with a '.RData' extension in your project directory, and then every time you open your project it reloads everything that was in the environment. This however is often poor practice, as it prevents you from writing reproducible code and all those variables start racking up storage space on your computer. We recommend changing this setting by going to Global Options and under 'Workspace' set 'Save workspace to .RData on exit' to '**Never**'. + +However, there are times you may want to save your variables as R files, such as when you have a set of variables you want to quickly re-load at the beginning of your session, or some files that are pretty large in size which is often the case with spatial data (R object files are much smaller). **You can save single *or* multiple variables to an .RData file, or single variables to an .RDS file**. + +Since the `poudre_hwy` and `poudre_points_prj` were objects you created in this session, to avoid the need to recreate them you can save them to an .RData file with `save()` : + +```{r} +save(poudre_hwy, poudre_points_prj, file = "data/poudre_spatial_objects.RData") +``` + +Note that you must add the 'file =' to your second argument. + +Now to test out how .RData files work, remove them from your environment with `rm()` (*be careful with this function though, it is permanent!*) and load them back in with `load()` + +```{r} +rm(poudre_hwy, poudre_points_prj) +``` + +See they are no longer in your Environment pane, but after you load the .RData file back in, it loads in those two objects with the same environmental names they were given when you saved them. + +```{r} +load("data/poudre_spatial_objects.RData") +``` + +Note that `terra` objects don't properly save to .RData files, but there is a work around if you save a single `terra` object as an .RDS file with `saveRDS`. Here is that workflow, there is just a second step to 'unpack' the loaded .RDS object with `rast()`. + +```{r} +saveRDS(co_elevation_crop, "data/poudre_elevation.RDS") +``` + +```{r} +readRDS("data/poudre_elevation.RDS") %>% rast() +``` + +Note that with .RDS files you must assign the loaded file to a new environmental variable (unlike with .RData that returns the objects with the exact names they had before). + +### 3.3 Reading Spatial Data + +To read in shapefiles, you use `read_sf()` . If you saved the `poudre_hwy` shapefile in the steps above, you can load it back into your environment like this: + +```{r} +read_sf("data/poudre_hwy.shp") +``` + +Notice that when reading shapefiles into R you only specify the file with the '.shp' extension, and don't need to pay much attention to any of those auxiliary files. As long as all the other auxiliary files are saved in that same folder, it will read in the shapefile correctly, but if you are missing any then the .shp file becomes useless on its own. + +To read in raster files you use the `rast()` function and file path with the appropriate file extension + +```{r} +rast("data/poudre_elevation.tif") +``` + +**Remember when reading in files you will want to assign them to a new variable name with `<-` to keep them in your environment**. + +## 4. Exercises + +1. **Explore the use of `extract` from the `terra` package by running `?terra::extract`. (Note we need to specify `terra::` because 'extract' is a function name in multiple packages we may have loaded in our session).** + + **How would you extract the elevation at each of the three points in `poudre_points_prj` ? (2 pts)** + + ```{r} + terra::extract(co_elevation,poudre_points_prj) + + ``` + +2. **Choose your favorite state (other than Colorado). For that state, carry out the following tasks: (8 pts)** + +Import the county boundaries for your state: + +```{r} +MT_counties <- counties (state = "MT") +``` + +Import elevation for your state (using your new counties object as the extent/bounding box and set `z = 7`): + +```{r} +MT_elevation <- get_elev_raster(MT_counties, z=7 ) + +#checking and converting data class +Mt_elevation <- rast(MT_elevation) + +#croping the elevation data to county boundary + +MT_Elevation_masked <- crop(MT_elevation, MT_counties, mask = TRUE) +``` + +Create an interactive map of your state counties and the elevation layer underneath (*note:* use `?qtm` to see the argument options for `fill =` to draw only the county borders, i.e. remove the fill color). + +```{r} + +tmap_mode("view") + +tm_map <- tm_shape(MT_Elevation_masked) + + tm_raster(title = "Elevation in meter") + + tm_shape(MT_counties) + + tm_borders(col = "black") +tm_map +``` + +```{} +``` + +Choose a single county within your state county object, and crop your elevation layer to the extent of that county (*note:* use `filter()` to create an object of just your selected county that you want to crop to). Follow the steps above we used to crop `co_elevation` to the poudre hwy. + +```{r} +Missoula_County <- MT_counties %>% + filter(NAME == "Missoula") + +Missoula_Elevation_masked <- crop(MT_elevation, Missoula_County, mask = TRUE) + +tmap_mode("view") + +tm_map <- tm_shape(Missoula_Elevation_masked) + + tm_raster(title = "Elevation in Missoula County", palette = "-Blues") + + tm_shape(Missoula_County) + + tm_borders(col = "black") + +tm_map +``` diff --git a/02_spatial_analysis_Ashlesha.Rmd b/02_spatial_analysis_Ashlesha.Rmd new file mode 100644 index 0000000..741ae56 --- /dev/null +++ b/02_spatial_analysis_Ashlesha.Rmd @@ -0,0 +1,378 @@ +--- +title: "Spatial Data Analysis" +author: "Caitlin Mothes" +date: "`r Sys.Date()`" +output: github_document +--- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE, eval = FALSE) +``` + +In the first lesson this week you were introduced to different spatial data types, various databases you can pull spatial data from and worked through importing, wrangling, and saving those spatial data types. Today we are going to dive deeper in spatial analyses in R. + +You have briefly used the `sf` and `terra` packages so far, but today we will be exploring them much more in depth using the wide range of spatial analysis operations they provide. + +You shouldn't need to install any new packages for today, but need to load in all the necessary libraries: + +```{r} +source("setup.R") +``` + +## Load in spatial data + +We will be working with some new datasets today that are already included in the 'data/' folder. These include: + +- "spatDat.RData" : an .RData file that loads in the four objects: + + - `counties` : a multipolygon layer of Colorado counties (which we used in 01_spatial_intro.Rmd) + + - `rivers` : a polyline layer of all major rivers in Colorado + + - `occ` : a list of three dataframes that includes species occurrence data (i.e., point locations) for Elk, Yellow-bellied Marmot, and Western Tiger Salamander in Colorado retrieved from the [GBIF](https://www.gbif.org/) database. + + - `snotel_data` : spatial point dataframe (i.e., `sf` object) of daily snow depth for 8 SNOTEL sites in Colorado + +```{r key1} +#load in all your vector data +load("data/spatDat.RData") + +#read in the elevation and landcover rasters +landcover <- terra::rast("data/NLCD_CO.tif") + +elevation <- terra::rast("data/elevation.tif") +``` + +### Bonus Lesson + +All the above objects were retrieved and cleaned in R. The lesson plan in the 'bonus/' folder titled **'get_spatial_challenge.Rmd'** is an assignment that tasks you with importing and cleaning the data that was saved in 'spatDat.RData'. If you complete this challenge assignment fully you will get *up to 3 extra credit points*. Even if you don't want to complete this challenge, it is worth your while to read and work through it! + +## Distance Calculations + +We're going to start off today with some distance calculations. Using our species occurrence data, say we want to know on average how far away is each species found from a major river, and compare that among species. + +Throughout today we are going to be mapping our spatial data to quickly inspect it and get a visual of the data's extent and characteristics, so lets set our `tmap` mode to interactive. + +```{r} +tmap_mode("view") +``` + +First, our `occ` object is not in a spatial format. We first need to bind our dataframes into a single one, and convert it to an `sf` object using `st_as_sf()` : + +```{r} +occ_sp <- bind_rows(occ) %>% + st_as_sf(coords = c("decimalLongitude", "decimalLatitude"), crs = 4236) +``` + +We set the CRS to `4236`, which is the EPSG code for WGS84, the most commonly used CRS for GPS coordinates (But I also checked the GBIF metadata to make sure it was in fact WGS84). + +Quick view of all our points, colored by species: + +```{r} +qtm(occ_sp, symbols.col = "Species") +``` + +Now, calculating the distance to the nearest river involves point to line distance calculations, which we can perform with the `sf` package. + +Before performing any spatial operations, remember all of our spatial objects must be in the same CRS. + +### Exercise #1 + +```{r} +st_crs(rivers) == st_crs(occ_sp) +``` + +The CRS of our objects does not match. Using what you learned in week one, conduct a spatial transformation to our `occ_sp` object to coerce it to the same CRS of our `rivers` object. Call the new object `occ_prj` and double check that `rivers` and our new occurrences object are in the same CRS after transforming + +```{r} +occ_prj <- occ_sp %>% + st_transform(crs = st_crs(rivers)) + +``` + + +Now lets visualize our rivers and occurrence data: + +```{r} +qtm(rivers) + + qtm(occ_prj, symbols.col = "Species") +``` + +Our occurrence data set covers all of Colorado, but rivers are only for Larimer County. So, we have to first filter our points to Larimer County. + +Similar to `filter()` from the {tidyverse}, we can use `st_filter()` to perform a *spatial* filtering (i.e., we want to filer just the points that occur in Larimer County). + +### Exercise #2 + +Use `?st_filter` to explore the use of the function, and then use it to filter our `occ_prj` points to Larimer county and call the new object `occ_larimer`. + +*Note:* You will first need to create a spatial object of just Larimer county to use as a filter. + +```{r} + +Larimer_county <- counties(state = "CO")%>% + filter(NAME == "Larimer") + +occ_larimer <- st_filter(occ_prj,Larimer_county) + +``` + +```{r} +qtm(occ_larimer) +``` + +Great, now we just have species occurrences within Larimer County. + +Now for each point we want to calculate its distance to the nearest river. The most efficient way is to first find the nearest line feature for each point. We can do this with the `st_nearest_feature()` function. + +This function returns the index values (row number) of the river feature in the `rivers` spatial data frame that is closest in distance to each point. Here we are assigning these index values to a new column of our Larimer occurrences called 'nearest_river' that we will use later to calculate distances: + +```{r} +occ_larimer$nearest_river <- st_nearest_feature(occ_larimer, rivers) +``` + +Now, for each point we can use the `st_distance()` function to calculate the distance to the nearest river feature, using the index value in our new "nearest_river" column. Adding `by_element = TRUE` is necessary to tell the function to perform the distance calculations by element (row), which we will fill into a new column "river_dist_m". + +```{r} +occ_larimer$river_dist_m <- + st_distance(occ_larimer, rivers[occ_larimer$nearest_river, ], by_element = TRUE) +``` + +Notice that the new column "river_dist_m" is more than just a numeric class, but a "units" class, specifying that the values are in meters. + +```{r} +str(occ_larimer) +``` + +### Exercise #3 + +Cool, now you have the distance to the nearest river (in meters) for each individual species occurrence, but you want the average distance for each species. Using what you know of the `dplyr` functions, calculate the species average distance, then make a bar plot to compare the averages among species: + +*Hint*: remember that the new distance column is a 'units' data type will throw an error when you try to plot those values. You will need to make use of `mutate()` and `as.numeric` within your string of operations in order to complete task. + +```{r} + +occ_larimer$nearest_river <- st_nearest_feature(occ_larimer, rivers) + +# Calculate the distance to the nearest river and add it as a new column +occ_larimer$river_dist_m <- st_distance(occ_larimer, rivers[occ_larimer$nearest_river, ], by_element = TRUE) + +# Calculate average distance for each species +species_avg_dist <- occ_larimer %>% + mutate(distance_numeric = as.numeric(river_dist_m)) %>% + group_by(Species) %>% + summarize(avg_distance = mean(distance_numeric)) + +ggplot(species_avg_dist, aes(x = Species, y = avg_distance, fill = Species)) + + geom_bar(stat = "identity") + + labs(title = "Average Distance to Nearest River by Species", + x = "Species", + y = "Average Distance (meters)") + + +``` + + + +Which species is, on average, found closest to a river? + +-> Elk is found nearest to the River and Western Tiger Salamender is the farthest form the river. +## Buffers + +Alternatively, say you want to know what percentage of species' occurrences (points) were found within a specified distance of a river (calculated buffer). Here lets investigate how often each species is found within 100m of a river. + +To do this we can add a buffer around our line features and filter the points that fall within that buffer zone. We can use `st_buffer()` with a specified distance (default is meters since our `rivers` object uses 'meters' as its length unit, we can tell by checking the CRS with `st_crs()`) + +```{r eval=FALSE} +river_buffer <- st_buffer(rivers, dist = 100) + +qtm(river_buffer) +``` + +If you zoom in on the map you can now see a buffer around the rivers, and this new object is actually a polygon geometry type now instead of a line. + +```{r} +river_buffer +``` + +## Spatial Intersect + +We can conduct spatial intersect operations using the function `st_intersects()`. This function checks if each occurence intersects with the river buffer, and if so it returns an index value (row number) for the river feature it intersects. This function returns a list object for each occurrence, that will be empty if there are no intersections. We will add this as a column to our occurrence data set, and then create a binary yes/no river intersection column based on those results (is the list empty or not?). + +First look at what `st_intersects()` returns: + +```{r} +st_intersects(occ_larimer, river_buffer) +``` + +We see it is a list of the same length as our `occ_larimer` object, where each list element is either empty (no intersections) or the index number for the river buffer feature it intersects with. To add this as a new column in our `occ_larimer` data we run this: + +```{r} +occ_larimer$river_intersections <- st_intersects(occ_larimer, river_buffer) +``` + +Now we can create a new column in `occ_larimer` called 'river_100m' that returns TRUE/FALSE if the buffer intersects with a river. We make use of `if_else()` and the `lengths()` function to check the length of each list element in each row, as the empty ones will return a length of 0. If the length is zero/empty, then we return FALSE meaning that occurrence was not found within 100m of a river. + +```{r} +occ_rivers <- occ_larimer %>% + mutate(river_100m = if_else(lengths(river_intersections) == 0, FALSE, TRUE)) +``` + +Now we can calculate what percentage of occurrences are within 100 m of a river for each species using `dplyr` operations. Which species is most often found within 100m of a river? + +```{r} +occ_rivers %>% + group_by(Species) %>% + summarise(total_occ = n(), + total_rvier = sum(river_100m == TRUE), + percent_river = (sum(river_100m == TRUE)/total_occ)*100) +``` + +
+ +#### Reflection + +This analysis is just for teaching purposes, why would you be cautious about these results for answering real research questions? Think about how we filtered everything to a political boundary, what's wrong with this method? + +## Raster Reclassification + +So far we've dealt with a bunch of vector data and associated analyses with the `sf` package. Now lets work through some raster data analysis using the `terra` package. + +First, lets explore the landcover raster by making a quick plot. + +```{r} +qtm(landcover) +``` + +This land cover data set includes attributes (land cover classes) associated with raster values. The is because of the .aux auxiliary file paired with the .tif. in the 'data/' folder. Similar to shapefiles, this file provides metadata (in this case land cover class names) to the raster file. + +We can quickly view the frequency of each land cover type with the `freq()` function, where 'count' is the number of pixels in the raster of that landcover type. + +```{r} +freq(landcover) +``` + +### Exercise 4 + +Create a bar chart of landcover frequency, and order the bars highest to lowest (see [this resource](https://sebastiansauer.github.io/ordering-bars/) to guide you on sorting bars by a numeric variable/column). Also investigate the use of `coor_flip()` and how it might make your plot look better... + +```{r} +landcover_freq <- freq(landcover) + + +ggplot(landcover_freq, aes(x = reorder(value, -count), y = count))+ + geom_bar(stat = "identity")+ + labs(y = "Landcover Frequency",x = "Landcover Type")+ + coord_flip() + +``` + +Say we want to explore some habitat characteristics of our species of interest, and we are specifically interested in forest cover. We can use raster reclassification to create a new layer of just forest types in Colorado. + +Since rasters are technically matrices, we can using **indexing** and change values quickly using matrix operations. Given this particular raster uses character names associated with values (thanks to the .aux file!), we can index by those names. + +```{r} +#first assign landcover to a new object name so we can manipulate it while keeping the original +forest <- landcover + +#where the raster equals any of the forest categories, set that value to 1 +forest[forest %in% c("Deciduous Forest", "Evergreen Forest", "Mixed Forest")] <- 1 + +#SPELLING IS IMPORTANT + +#now set all non forest pixels to NA +forest[forest != 1] <- NA +``` + +Now plot the new forest layer to get a quick sense if it looks accurate or not. + +```{r} +plot(forest) +``` + +## Extraction Statistics + +When we want to summarize raster values for certain shapes (points, polygons, etc), the `extract()` function from the `terra` package helps us do that. + +Say we want to find out the most common land cover type each of our species is found in. We can use `extract()` to get the landcover value from the raster at each of our occurrence points, and then do some summary statistics. + +Within this function, the first element is the raster you want to get values from, and the second element is the spatial layer you want to extract values at. Here we will use our `landcover` raster layer and the `occ_prj` object to extract values for occurrences across Colorado. + +First, we need to project our landcover raster to the CRS of our occurrences, otherwise the operation will only return NAs. + +```{r} +# project the landcover layer +landcover_prj <- project(landcover, crs(occ_prj)) + +extract(landcover_prj, occ_prj) +``` + +Notice that this returns a 2 column data frame, with an ID for each feature (occurrence) and the extracted raster value in the second column. We can actually use `extract()` within `mutate()` to add the values as a new column to our occurrences data frame so we can do further summary statistics. + +However, since `extract()` returns a 2 column data frame, it will nest this into a single column in the `occ_prj` data frame. To separate this into two separate columns we can use `unnest()` : + +```{r} +occ_landcover <- occ_prj %>% + mutate(common_landcover = extract(landcover_prj, occ_prj)) %>% + unnest(common_landcover) %>% + #lets rename the land cover column which is now called "NLCD Land Cover Class" + rename(common_landcover = "NLCD Land Cover Class") +``` + +Now, we can find the most common land cover type for each species, using some tidyverse wrangling. Note the use of `st_drop_geometry()`, this reverts the sf object back to an original data frame, which is required for some tidyverse operations. + +```{r} +occ_landcover %>% + st_drop_geometry() %>% # this converts the data back to a dataframe, required for some tidyverse operations + group_by(Species) %>% + count(common_landcover) %>% + slice(which.max(n)) #returns the row with the highest count "n" +``` + +We can also use `extract()` to extract raster values within polygons, but here must supply some function of how to summarize all the values within each polygon. For this example, lets fine the most common landcover type in each Colorado county. + +```{r} +county_landcover <- + counties %>% + mutate(landcover = extract(landcover_prj, counties, fun = "modal")) %>% + unnest(landcover) %>% + rename(value = "NLCD Land Cover Class") #renaming this helps us perform a join later on... +``` + +Uh oh, this gives us the raw pixel values instead of the land cover classes. We can get a table of value - class pairs by using the `cats()` function: + +```{r} +classes <- as.data.frame(cats(landcover)) #coerce to a data frame because cats() actually returns it as a list +``` + +Value and NLCD.Land.Cover.Class are our cell value - class pairs. Now we want to join this to our `county_landcover` object to get the actual land cover name. + +### Exercise 5 + +Perform the appropriate `*_join` operation to tie our `county_landcover` and `classes` data frames together. Then make a map of the counties each colored/filled by the most common NLCD land cover class. + +```{r} +county_landcover_joined <- county_landcover %>% + left_join(classes, by = "value") + +qtm(county_landcover_joined, fill = "NLCD.Land.Cover.Class") + +``` + +### Exercise 6 + +Find the average elevation each species occurs at (for all Colorado occurrences). Which species is, on average, found at the highest elevations? + +*Hints*: Use the `elevation` and `occ_prj` objects we have created or read in above. Remember to check the CRS and perform a spatial transformation if necessary! All parts needed to answer this question have been introduced in this lesson plan. + +```{r} +st_crs(elevation) == st_crs(occ_prj) + +species_elevation <- occ_prj %>% + mutate(elevation = extract(elevation, occ_prj, fun = "modal"))%>% + unnest(elevation)%>% + group_by(Species)%>% + summarise(avg_elevation = mean(Elevation, na.rm = TRUE)) +``` +The species in the highest elevation is Yellow-bellied Marmot 3301.699m + diff --git a/02_spatial_analysis_Ashlesha.md b/02_spatial_analysis_Ashlesha.md new file mode 100644 index 0000000..d3a11ff --- /dev/null +++ b/02_spatial_analysis_Ashlesha.md @@ -0,0 +1,499 @@ +Spatial Data Analysis +================ +Caitlin Mothes +2023-11-13 + +In the first lesson this week you were introduced to different spatial +data types, various databases you can pull spatial data from and worked +through importing, wrangling, and saving those spatial data types. Today +we are going to dive deeper in spatial analyses in R. + +You have briefly used the `sf` and `terra` packages so far, but today we +will be exploring them much more in depth using the wide range of +spatial analysis operations they provide. + +You shouldn’t need to install any new packages for today, but need to +load in all the necessary libraries: + +``` r +source("setup.R") +``` + +## Load in spatial data + +We will be working with some new datasets today that are already +included in the ‘data/’ folder. These include: + +- “spatDat.RData” : an .RData file that loads in the four objects: + + - `counties` : a multipolygon layer of Colorado counties (which we + used in 01_spatial_intro.Rmd) + + - `rivers` : a polyline layer of all major rivers in Colorado + + - `occ` : a list of three dataframes that includes species occurrence + data (i.e., point locations) for Elk, Yellow-bellied Marmot, and + Western Tiger Salamander in Colorado retrieved from the + [GBIF](https://www.gbif.org/) database. + + - `snotel_data` : spatial point dataframe (i.e., `sf` object) of daily + snow depth for 8 SNOTEL sites in Colorado + +``` r +#load in all your vector data +load("data/spatDat.RData") + +#read in the elevation and landcover rasters +landcover <- terra::rast("data/NLCD_CO.tif") + +elevation <- terra::rast("data/elevation.tif") +``` + +### Bonus Lesson + +All the above objects were retrieved and cleaned in R. The lesson plan +in the ‘bonus/’ folder titled **‘get_spatial_challenge.Rmd’** is an +assignment that tasks you with importing and cleaning the data that was +saved in ‘spatDat.RData’. If you complete this challenge assignment +fully you will get *up to 3 extra credit points*. Even if you don’t want +to complete this challenge, it is worth your while to read and work +through it! + +## Distance Calculations + +We’re going to start off today with some distance calculations. Using +our species occurrence data, say we want to know on average how far away +is each species found from a major river, and compare that among +species. + +Throughout today we are going to be mapping our spatial data to quickly +inspect it and get a visual of the data’s extent and characteristics, so +lets set our `tmap` mode to interactive. + +``` r +tmap_mode("view") +``` + +First, our `occ` object is not in a spatial format. We first need to +bind our dataframes into a single one, and convert it to an `sf` object +using `st_as_sf()` : + +``` r +occ_sp <- bind_rows(occ) %>% + st_as_sf(coords = c("decimalLongitude", "decimalLatitude"), crs = 4236) +``` + +We set the CRS to `4236`, which is the EPSG code for WGS84, the most +commonly used CRS for GPS coordinates (But I also checked the GBIF +metadata to make sure it was in fact WGS84). + +Quick view of all our points, colored by species: + +``` r +qtm(occ_sp, symbols.col = "Species") +``` + +Now, calculating the distance to the nearest river involves point to +line distance calculations, which we can perform with the `sf` package. + +Before performing any spatial operations, remember all of our spatial +objects must be in the same CRS. + +### Exercise \#1 + +``` r +st_crs(rivers) == st_crs(occ_sp) +``` + +The CRS of our objects does not match. Using what you learned in week +one, conduct a spatial transformation to our `occ_sp` object to coerce +it to the same CRS of our `rivers` object. Call the new object `occ_prj` +and double check that `rivers` and our new occurrences object are in the +same CRS after transforming + +``` r +occ_prj <- occ_sp %>% + st_transform(crs = st_crs(rivers)) +``` + +Now lets visualize our rivers and occurrence data: + +``` r +qtm(rivers) + + qtm(occ_prj, symbols.col = "Species") +``` + +Our occurrence data set covers all of Colorado, but rivers are only for +Larimer County. So, we have to first filter our points to Larimer +County. + +Similar to `filter()` from the {tidyverse}, we can use `st_filter()` to +perform a *spatial* filtering (i.e., we want to filer just the points +that occur in Larimer County). + +### Exercise \#2 + +Use `?st_filter` to explore the use of the function, and then use it to +filter our `occ_prj` points to Larimer county and call the new object +`occ_larimer`. + +*Note:* You will first need to create a spatial object of just Larimer +county to use as a filter. + +``` r +Larimer_county <- counties(state = "CO")%>% + filter(NAME == "Larimer") + +occ_larimer <- st_filter(occ_prj,Larimer_county) +``` + +``` r +qtm(occ_larimer) +``` + +Great, now we just have species occurrences within Larimer County. + +Now for each point we want to calculate its distance to the nearest +river. The most efficient way is to first find the nearest line feature +for each point. We can do this with the `st_nearest_feature()` function. + +This function returns the index values (row number) of the river feature +in the `rivers` spatial data frame that is closest in distance to each +point. Here we are assigning these index values to a new column of our +Larimer occurrences called ‘nearest_river’ that we will use later to +calculate distances: + +``` r +occ_larimer$nearest_river <- st_nearest_feature(occ_larimer, rivers) +``` + +Now, for each point we can use the `st_distance()` function to calculate +the distance to the nearest river feature, using the index value in our +new “nearest_river” column. Adding `by_element = TRUE` is necessary to +tell the function to perform the distance calculations by element (row), +which we will fill into a new column “river_dist_m”. + +``` r +occ_larimer$river_dist_m <- + st_distance(occ_larimer, rivers[occ_larimer$nearest_river, ], by_element = TRUE) +``` + +Notice that the new column “river_dist_m” is more than just a numeric +class, but a “units” class, specifying that the values are in meters. + +``` r +str(occ_larimer) +``` + +### Exercise \#3 + +Cool, now you have the distance to the nearest river (in meters) for +each individual species occurrence, but you want the average distance +for each species. Using what you know of the `dplyr` functions, +calculate the species average distance, then make a bar plot to compare +the averages among species: + +*Hint*: remember that the new distance column is a ‘units’ data type +will throw an error when you try to plot those values. You will need to +make use of `mutate()` and `as.numeric` within your string of operations +in order to complete task. + +``` r +occ_larimer$nearest_river <- st_nearest_feature(occ_larimer, rivers) + +# Calculate the distance to the nearest river and add it as a new column +occ_larimer$river_dist_m <- st_distance(occ_larimer, rivers[occ_larimer$nearest_river, ], by_element = TRUE) + +# Calculate average distance for each species +species_avg_dist <- occ_larimer %>% + mutate(distance_numeric = as.numeric(river_dist_m)) %>% + group_by(Species) %>% + summarize(avg_distance = mean(distance_numeric)) + +ggplot(species_avg_dist, aes(x = Species, y = avg_distance, fill = Species)) + + geom_bar(stat = "identity") + + labs(title = "Average Distance to Nearest River by Species", + x = "Species", + y = "Average Distance (meters)") +``` + +Which species is, on average, found closest to a river? + +-\> Elk is found nearest to the River and Western Tiger Salamender is +the farthest form the river. \## Buffers + +Alternatively, say you want to know what percentage of species’ +occurrences (points) were found within a specified distance of a river +(calculated buffer). Here lets investigate how often each species is +found within 100m of a river. + +To do this we can add a buffer around our line features and filter the +points that fall within that buffer zone. We can use `st_buffer()` with +a specified distance (default is meters since our `rivers` object uses +‘meters’ as its length unit, we can tell by checking the CRS with +`st_crs()`) + +``` r +river_buffer <- st_buffer(rivers, dist = 100) + +qtm(river_buffer) +``` + +If you zoom in on the map you can now see a buffer around the rivers, +and this new object is actually a polygon geometry type now instead of a +line. + +``` r +river_buffer +``` + +## Spatial Intersect + +We can conduct spatial intersect operations using the function +`st_intersects()`. This function checks if each occurence intersects +with the river buffer, and if so it returns an index value (row number) +for the river feature it intersects. This function returns a list object +for each occurrence, that will be empty if there are no intersections. +We will add this as a column to our occurrence data set, and then create +a binary yes/no river intersection column based on those results (is the +list empty or not?). + +First look at what `st_intersects()` returns: + +``` r +st_intersects(occ_larimer, river_buffer) +``` + +We see it is a list of the same length as our `occ_larimer` object, +where each list element is either empty (no intersections) or the index +number for the river buffer feature it intersects with. To add this as a +new column in our `occ_larimer` data we run this: + +``` r +occ_larimer$river_intersections <- st_intersects(occ_larimer, river_buffer) +``` + +Now we can create a new column in `occ_larimer` called ‘river_100m’ that +returns TRUE/FALSE if the buffer intersects with a river. We make use of +`if_else()` and the `lengths()` function to check the length of each +list element in each row, as the empty ones will return a length of 0. +If the length is zero/empty, then we return FALSE meaning that +occurrence was not found within 100m of a river. + +``` r +occ_rivers <- occ_larimer %>% + mutate(river_100m = if_else(lengths(river_intersections) == 0, FALSE, TRUE)) +``` + +Now we can calculate what percentage of occurrences are within 100 m of +a river for each species using `dplyr` operations. Which species is most +often found within 100m of a river? + +``` r +occ_rivers %>% + group_by(Species) %>% + summarise(total_occ = n(), + total_rvier = sum(river_100m == TRUE), + percent_river = (sum(river_100m == TRUE)/total_occ)*100) +``` + +
+ +#### Reflection + +This analysis is just for teaching purposes, why would you be cautious +about these results for answering real research questions? Think about +how we filtered everything to a political boundary, what’s wrong with +this method? + +## Raster Reclassification + +So far we’ve dealt with a bunch of vector data and associated analyses +with the `sf` package. Now lets work through some raster data analysis +using the `terra` package. + +First, lets explore the landcover raster by making a quick plot. + +``` r +qtm(landcover) +``` + +This land cover data set includes attributes (land cover classes) +associated with raster values. The is because of the .aux auxiliary file +paired with the .tif. in the ‘data/’ folder. Similar to shapefiles, this +file provides metadata (in this case land cover class names) to the +raster file. + +We can quickly view the frequency of each land cover type with the +`freq()` function, where ‘count’ is the number of pixels in the raster +of that landcover type. + +``` r +freq(landcover) +``` + +### Exercise 4 + +Create a bar chart of landcover frequency, and order the bars highest to +lowest (see [this +resource](https://sebastiansauer.github.io/ordering-bars/) to guide you +on sorting bars by a numeric variable/column). Also investigate the use +of `coor_flip()` and how it might make your plot look better… + +``` r +landcover_freq <- freq(landcover) + + +ggplot(landcover_freq, aes(x = reorder(value, -count), y = count))+ + geom_bar(stat = "identity")+ + labs(y = "Landcover Frequency",x = "Landcover Type")+ + coord_flip() +``` + +Say we want to explore some habitat characteristics of our species of +interest, and we are specifically interested in forest cover. We can use +raster reclassification to create a new layer of just forest types in +Colorado. + +Since rasters are technically matrices, we can using **indexing** and +change values quickly using matrix operations. Given this particular +raster uses character names associated with values (thanks to the .aux +file!), we can index by those names. + +``` r +#first assign landcover to a new object name so we can manipulate it while keeping the original +forest <- landcover + +#where the raster equals any of the forest categories, set that value to 1 +forest[forest %in% c("Deciduous Forest", "Evergreen Forest", "Mixed Forest")] <- 1 + +#SPELLING IS IMPORTANT + +#now set all non forest pixels to NA +forest[forest != 1] <- NA +``` + +Now plot the new forest layer to get a quick sense if it looks accurate +or not. + +``` r +plot(forest) +``` + +## Extraction Statistics + +When we want to summarize raster values for certain shapes (points, +polygons, etc), the `extract()` function from the `terra` package helps +us do that. + +Say we want to find out the most common land cover type each of our +species is found in. We can use `extract()` to get the landcover value +from the raster at each of our occurrence points, and then do some +summary statistics. + +Within this function, the first element is the raster you want to get +values from, and the second element is the spatial layer you want to +extract values at. Here we will use our `landcover` raster layer and the +`occ_prj` object to extract values for occurrences across Colorado. + +First, we need to project our landcover raster to the CRS of our +occurrences, otherwise the operation will only return NAs. + +``` r +# project the landcover layer +landcover_prj <- project(landcover, crs(occ_prj)) + +extract(landcover_prj, occ_prj) +``` + +Notice that this returns a 2 column data frame, with an ID for each +feature (occurrence) and the extracted raster value in the second +column. We can actually use `extract()` within `mutate()` to add the +values as a new column to our occurrences data frame so we can do +further summary statistics. + +However, since `extract()` returns a 2 column data frame, it will nest +this into a single column in the `occ_prj` data frame. To separate this +into two separate columns we can use `unnest()` : + +``` r +occ_landcover <- occ_prj %>% + mutate(common_landcover = extract(landcover_prj, occ_prj)) %>% + unnest(common_landcover) %>% + #lets rename the land cover column which is now called "NLCD Land Cover Class" + rename(common_landcover = "NLCD Land Cover Class") +``` + +Now, we can find the most common land cover type for each species, using +some tidyverse wrangling. Note the use of `st_drop_geometry()`, this +reverts the sf object back to an original data frame, which is required +for some tidyverse operations. + +``` r +occ_landcover %>% + st_drop_geometry() %>% # this converts the data back to a dataframe, required for some tidyverse operations + group_by(Species) %>% + count(common_landcover) %>% + slice(which.max(n)) #returns the row with the highest count "n" +``` + +We can also use `extract()` to extract raster values within polygons, +but here must supply some function of how to summarize all the values +within each polygon. For this example, lets fine the most common +landcover type in each Colorado county. + +``` r +county_landcover <- + counties %>% + mutate(landcover = extract(landcover_prj, counties, fun = "modal")) %>% + unnest(landcover) %>% + rename(value = "NLCD Land Cover Class") #renaming this helps us perform a join later on... +``` + +Uh oh, this gives us the raw pixel values instead of the land cover +classes. We can get a table of value - class pairs by using the `cats()` +function: + +``` r +classes <- as.data.frame(cats(landcover)) #coerce to a data frame because cats() actually returns it as a list +``` + +Value and NLCD.Land.Cover.Class are our cell value - class pairs. Now we +want to join this to our `county_landcover` object to get the actual +land cover name. + +### Exercise 5 + +Perform the appropriate `*_join` operation to tie our `county_landcover` +and `classes` data frames together. Then make a map of the counties each +colored/filled by the most common NLCD land cover class. + +``` r +county_landcover_joined <- county_landcover %>% + left_join(classes, by = "value") + +qtm(county_landcover_joined, fill = "NLCD.Land.Cover.Class") +``` + +### Exercise 6 + +Find the average elevation each species occurs at (for all Colorado +occurrences). Which species is, on average, found at the highest +elevations? + +*Hints*: Use the `elevation` and `occ_prj` objects we have created or +read in above. Remember to check the CRS and perform a spatial +transformation if necessary! All parts needed to answer this question +have been introduced in this lesson plan. + +``` r +st_crs(elevation) == st_crs(occ_prj) + +species_elevation <- occ_prj %>% + mutate(elevation = extract(elevation, occ_prj, fun = "modal"))%>% + unnest(elevation)%>% + group_by(Species)%>% + summarise(avg_elevation = mean(Elevation, na.rm = TRUE)) +``` + +The species in the highest elevation is Yellow-bellied Marmot 3301.699m diff --git a/bonus/get_spatial_challenge_Ashlesha.Rmd b/bonus/get_spatial_challenge_Ashlesha.Rmd new file mode 100644 index 0000000..0705242 --- /dev/null +++ b/bonus/get_spatial_challenge_Ashlesha.Rmd @@ -0,0 +1,221 @@ +--- +title: "Retrieve and Wrangle Spatial Data" +author: "Caitlin Mothes" +date: "`r Sys.Date()`" +output: github_document +--- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE, eval = FALSE) +``` + +In this lesson you will be exposed to various R packages you can retrieve spatial data from and work through importing, wrangling, and saving various spatial data sets. + +```{r} +source("setup.R") +``` + +Set up the `tmap` mode to interactive for some quick exploitative mapping of all these various spatial data sets. + +```{r} +tmap_mode("view") +``` + +## Vector Data + +### US Census spatial data with `tigris` + +Import the counties shapefile for Colorado again as you did in lesson 1, along with linear water features for Larimer county. + +```{r} + +counties <- tigris::counties(state = "CO") + +linear_features <- linear_water(state = "CO", county = "Larimer") + +``` + +This linear features file is pretty meaty. Inspect all the unique names for the features, what naming pattern do you notice? Let's filter this data set to only major rivers in the county, which all have 'Riv' at the end of their name. For working with character strings, the `stringr` package is extremely helpful and a member of the Tidyverse. + +To filter rows that have a specific character string, you can use `str_detect()` within `filter()`. + +```{r} +rivers <- linear_features %>% + filter(str_detect(FULLNAME, "Riv")) +``` + +### Species Occurrence data with [`rgbif`](https://docs.ropensci.org/rgbif/) + +To experiment with point data (latitude/longitude), we are going to explore the `rgbif` package, which allows you to download species occurrences from the [Global Biodiversity Information Facility (GBIF)](https://www.gbif.org/), a database of global species occurrences with over 2.2 billion records. + +We are going to import occurrence data for a couple of charismatic Colorado species: Elk, Yellow-Bellied Marmots, and Western Tiger Salamanders. + +To pull occurrence data with this package you use the `occ_data()` function from `rgbif` and give it a species scientific name you want to retrieve data for. Since we want to perform this operation for three species, this is a good opportunity to work through the iterative coding lessons you learned last week. + +We first need to create a string of species scientific names to use in the download function, and create a second string with their associated common names (order matters, make sure the two strings match). + +```{r} +#make a string of species names to use in the 'occ_data' function +species <- c("Cervus canadensis", "Marmota flaviventris", "Ambystoma mavortium") + +#also make a string of common names +common_name <- c("Elk", "Yellow-bellied Marmot", "Western Tiger Salamander") +``` + +### Exercise #1 {style="color: red"} + +The code below shows you the steps we want to import data for a single species. I got it started for you so that it runs for one species, but your task is to convert this chunk of code to a for loop that iterates across each species scientific and common name. + +*Tip for getting started*: You will need to add a couple extra steps outside of the for loop, including first creating an empty list to hold each output of each iteration and after the for loop bind all elements of the list to a single data frame using `bind_rows()` . + +```{r} +# workflow outline +species <- species[1] +common_name <- common_name[1] + +occ <- + occ_data( + scientificName = species, + hasCoordinate = TRUE, #we only want data with spatial coordinates + geometry = st_bbox(counties), #filter to the state of CO + limit = 2000 #optional set an upper limit for total occurrences to download + ) %>% + .$data #return just the data frame. The '.' symbolizes the previous function's output. + + # add species name column as ID to use later + occ$ID <- common_name + + #clean by removing duplicate occurrences + occ <- + occ %>% distinct(decimalLatitude, decimalLongitude, .keep_all = TRUE) %>% + dplyr::select(Species = ID, + decimalLatitude, + decimalLongitude, + year, + month, + basisOfRecord) +``` + +Once you have your full data frame of occurrences for all three species, convert it to a spatial `sf` points object with the CRS set to 4326. Name the final object `occ`. + +```{r} + +species_df <- data.frame(scientific = species, common = common_name) + + +process_species <- function(scientific_name, common_name) { + occ_data( + scientificName = scientific_name, + hasCoordinate = TRUE, + geometry = st_bbox(counties), + limit = 2000 + )$data %>% + mutate(Species = common_name) %>% + distinct(decimalLatitude, decimalLongitude, .keep_all = TRUE) %>% + select(Species, decimalLatitude, decimalLongitude, year, month, basisOfRecord) +} + +occ_list <- map2( + species_df$scientific, + species_df$common, + ~process_species(.x, .y) +) +occ <- bind_rows(occ_list) + +occ_sf <- st_as_sf(occ, coords = c("decimalLongitude", "decimalLatitude"), crs = 4326) + + +``` + +**Note**: we only used a few filter functions here available with the `occ_data()` function, but there are many more worth exploring! + +```{r} +?occ_data +``` + +#### Challenge! {style="color:red"} + +Re-write the for loop to retrieve each species occurrences but using `purrr::map()` instead. + +```{r} + + +# Define a function to retrieve and process occurrence for a single species +process_species <- function(species_name, common_name) { + # Retrieve occurrence data using occ_data() + occ_data( + scientificName = species_name, + hasCoordinate = TRUE, # Only include data with spatial coordinates + geometry = st_bbox(counties), # Filter to the state of Colorado + limit = 2000 # Limit the number of occurrences to download + )$data %>% + mutate(Species = common_name) %>% + distinct(decimalLatitude, decimalLongitude, .keep_all = TRUE) %>% + select(Species, decimalLatitude, decimalLongitude, year, month, basisOfRecord) # Select relevant columns +} + +# Iterate over each species using map2 and process_species function +# map2 forr two vectors simultaneously +species_occurrences <- map2(species, common_name, process_species) + +# Combine the results of all species into one data frame +occ <- bind_rows(species_occurrences) + +# Convert the combined data frame to an sf object for spatial analysis +# Set the CRS to 4326 (WGS 84) +occ_sf <- st_as_sf(occ, coords = c("decimalLongitude", "decimalLatitude"), crs = 4326) + +``` + +### SNOTEL data with [`soilDB`](http://ncss-tech.github.io/soilDB/) + +The `soilDB` package allows access to many databases, one of which includes daily climate data from USDA-NRCS SCAN (Soil Climate Analysis Network) stations. We are particularly interested in the SNOTEL (Snow Telemetry) sites to get daily snow depth across Colorado. + +First, you will need to read in the site metadata to get location information. The metadata file is included with the `soilDB` package installation, and you can bring it into your environment with `data()` + +```{r} +data('SCAN_SNOTEL_metadata', package = 'soilDB') +``` + +### Exercise #2 {style="color: red"} + +Filter this metadata to only the 'SNOTEL' sites and 'Larimer' county, convert it to a spatial `sf` object (set the CRS to `4326`, WGS 84), and name it 'snotel_sites'. + +```{r} + +# Filter for SNOTEL sites in Larimer County +snotel_sites <- SCAN_SNOTEL_metadata %>% + filter(Network == "SNOTEL", County == "Larimer") %>% + st_as_sf(coords = c("Longitude", "Latitude"), crs = 4326) + +``` + +How many SNOTEL sites are located in Colorado? + +8 Snotel in Colorado. + +### Exercise #3 {style="color: red"} + +Below is the string of operations you would use to import data for a single SNOTEL site for the years 2020 to 2022. Use `purrr::map()` to pull data for all unique SNOTEL sites in the `snotel_sites` object you just created. Coerce the data to a single data frame, then as a final step use `left_join()` to join the snow depth data to the station data to get the coordinates for all the sites, and make it a spatial object. + +```{r} +#First Site ID +Site <- unique(snotel_sites$Site)[1] + + +data <- fetchSCAN(site.code = Site, + year = 2020:2022) %>% + # this returns a list for each variable, bind them to a single df + bind_rows() %>% + as_tibble() %>% + #filter just the snow depth site + filter(sensor.id == "SNWD.I") %>% + #remove metadata columns + dplyr::select(-(Name:pedlabsampnum)) +``` + +```{r} + + +``` + diff --git a/data/poudre_elevation.RDS b/data/poudre_elevation.RDS new file mode 100644 index 0000000000000000000000000000000000000000..ccac2c987dc2afb5459013f3948d3d703535d635 GIT binary patch literal 14581 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

ggA{O|6_$3VZLAq@{UV<6mF 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 K)9e53xBmmMa{9jj literal 0 HcmV?d00001 diff --git a/data/poudre_elevation.tif b/data/poudre_elevation.tif new file mode 100644 index 0000000000000000000000000000000000000000..48f8ecc8f9600d870cdd4d3517a874e710a4a128 GIT binary patch literal 15431 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 Is##bH0G^G*e*gdg literal 0 HcmV?d00001 diff --git a/data/poudre_hwy.prj b/data/poudre_hwy.prj new file mode 100644 index 0000000..5ded4bc --- /dev/null +++ b/data/poudre_hwy.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/data/poudre_hwy.shp b/data/poudre_hwy.shp new file mode 100644 index 0000000000000000000000000000000000000000..c154b5029e4be8f87c27165cc72ab89cb0f9e487 GIT binary patch literal 54132 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

btzG=U6IPL3GPhr&~@72#^ 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�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 literal 0 HcmV?d00001 diff --git a/data/poudre_hwy.shx b/data/poudre_hwy.shx new file mode 100644 index 0000000000000000000000000000000000000000..3d891269c19703a479b6ba8063ac154049e86dfe GIT binary patch literal 132 zcmZQzQ0HR64xC;vGcW)VgT~A`w)B)B%Ql3q5E)LkW gqlg*-c{_mk9Rma71O^7CCLn!*fq^BAfgv>k0RKf3F#rGn literal 0 HcmV?d00001 diff --git a/data/poudre_points.dbf b/data/poudre_points.dbf new file mode 100644 index 0000000000000000000000000000000000000000..c5a577417293107f5997011c0c46908efe307ad9 GIT binary patch literal 309 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 literal 0 HcmV?d00001