Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Part 3 working with raster data #3

Merged
merged 39 commits into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
c5c4143
Add data
cforgaci Sep 28, 2023
81cfd25
Update renv
cforgaci Sep 28, 2023
39c6b15
Add vector episodes
cforgaci Sep 28, 2023
a833d6a
Ignore mac os x specific files
cforgaci Sep 28, 2023
92c3afb
Update episode on opening and plotting vector layers
cforgaci Oct 10, 2023
c8ff9bf
Add first raster episode
cforgaci Oct 30, 2023
82b8589
Add all raster episodes
cforgaci Oct 30, 2023
5b0232b
Add raster data
cforgaci Oct 30, 2023
bf6ed04
Update config.yml
cforgaci Oct 30, 2023
5b160c1
Add all raster episodes
cforgaci Oct 30, 2023
e751fb8
Remove example episode from raster lesson
cforgaci Oct 31, 2023
b4fb975
Add missing link in episodes/13-intro-to-raster-data.Rmd
cforgaci Jan 15, 2024
efbba48
Add missing link in episodes/13-intro-to-raster-data.Rmd
cforgaci Jan 15, 2024
e0fdd63
Add missing link in episodes/13-intro-to-raster-data.Rmd
cforgaci Jan 15, 2024
e7d2899
Increase number of bins in histogram
cforgaci Jan 15, 2024
88a1259
Replace `unique()` with `levels()` for factors
cforgaci Jan 15, 2024
2cadb06
Replace native pipe with magrittr pipe
cforgaci Jan 15, 2024
29d6509
Add space before ## More Plot Formatting
cforgaci Jan 15, 2024
9e74cce
Increase plot output size
cforgaci Jan 15, 2024
9272883
Change color scale to increase contrast in overlay
cforgaci Jan 15, 2024
646c81b
Add link to multi-band raster episode
cforgaci Jan 17, 2024
4f3ac04
Replace coord_quickmap() with coord_equal()
cforgaci Jan 18, 2024
b37fde7
Update 13-intro-to-raster-data.Rmd
cforgaci Jan 18, 2024
4375b75
Fix challenge callout not being displayed correclty
cforgaci Jan 18, 2024
be758f9
Update raster episodes
cforgaci Jan 19, 2024
53e78c2
Add data needed for updated raster episodes
cforgaci Jan 19, 2024
656c53d
Fix typo in episodes/13-intro-to-raster-data.Rmd
cforgaci Jan 22, 2024
ac8881b
Update episodes/13-intro-to-raster-data.Rmd
cforgaci Jan 22, 2024
eab2218
Apply Daniele's suggestions from code review
cforgaci Jan 22, 2024
70ddf42
Update raster episodes
cforgaci Jan 22, 2024
5800b10
Resolve conflicts
cforgaci Jan 22, 2024
8db86f7
Merge branch 'main' into 3-raster-cf
cforgaci Jan 22, 2024
517010e
Delete unused raster
cforgaci Jan 29, 2024
47ae95d
Merge remote-tracking branch 'origin/3-raster-cf' into 3-raster-cf
cforgaci Jan 29, 2024
c8c9b95
Remove lesson data zip file
cforgaci Jan 29, 2024
d9d7040
Add raster slides
cforgaci Jan 29, 2024
da04bc4
Update slides
cforgaci Jan 29, 2024
6ddc793
Update raster slides
cforgaci Jan 29, 2024
c2fc41f
Add figure used in raster slides
cforgaci Jan 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,6 @@ po/*~

# renv detritus
renv/sandbox/

# Mac OS X files
.DS_Store
16 changes: 10 additions & 6 deletions config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ carpentry: 'incubator'
title: 'Geospatial Data Carpentry with R for Urbanists'

# Date the lesson was created (YYYY-MM-DD, this is empty by default)
created:
created:

# Comma-separated list of keywords for the lesson
keywords: 'software, data, lesson, The Carpentries, geospatial'
Expand Down Expand Up @@ -58,21 +58,25 @@ contact: '[email protected]'
# - another-learner.md

# Order of episodes in your lesson
episodes:
- introduction.Rmd
episodes:
- 09-open-and-plot-vector-layers.Rmd
- 10-explore-and-plot-by-vector-layer-attributes.Rmd
- 11-plot-multiple-shape-files.Rmd
- 12-handling-spatial-projection-and-crs.Rmd
- 13-intro-to-raster-data.Rmd
- 14-plot-raster-data.Rmd
- 15-reproject-raster-data.Rmd
- 16-raster-calculations.Rmd
- 17-work-with-multi-band-rasters.Rmd

# Information for Learners
learners:
learners:

# Information for Instructors
instructors:
instructors:

# Learner Profiles
profiles:
profiles:

# Customisation ---------------------------------------------
#
Expand Down
189 changes: 189 additions & 0 deletions episodes/09-open-and-plot-vector-layers.Rmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
---
title: "Open and Plot Vector Layers"
teaching: 25
exercises: 5
---

:::::::::::::::::::::::::::::::::::::: questions

- How can I read, examine and visualize point, line and polygon vector data in R?

::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::: objectives

- Know the difference between point, line, and polygon vector data.
- Load vector data into R.
- Access the attributes of a vector object in R.

::::::::::::::::::::::::::::::::::::::::::::::::

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor

Make sure that the `sf` package and its dependencies are installed before the
workshop. The installation can take quite some time, so allocate enough extra
time before the workshop for solving installation problems. We recommend one
or two installation 'walk-in' hours on a day before the workshop and 15-30
minutes at the beginning of the first workshop day should be enough to tackle
installation issues.

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::: prereq

If you have not installed the `sf` package yet, run `install.packages("sf")` first. Note that the `sf` package has some external dependencies, namely GEOS, PROJ.4, GDAL and UDUNITS, which need to be installed beforehand. Follow the workshop [setup instructions]() for the installation of `sf` and its dependencies.

:::

First we need to load the packages we will use in this lesson. We will use the packages `tidyverse` and `here` with which you are already familiar from the previous lesson. In addition, we need to load the [`sf`](https://r-spatial.github.io/sf/) package for working with spatial vector data.

```{r lib, message=FALSE}
library(tidyverse) # tools for wrangling, reshaping and visualizing data
library(here) # managing paths
library(sf) # work with spatial vector data
```

::: callout

# The `sf` package

`sf` stands for Simple Features which is a standard defined by the Open Geospatial Consortium for storing and accessing geospatial vector data. PostGIS uses the same standard; so those of you who used PostGIS, might find some resemblances with the functions used by the `sf` package.

:::

## Import shapefiles

Let's start by opening a shapefile. Shapefiles a common file format to store spatial vector data used in GIS software. We will read a shapefile with the administrative boundary of Delft with the function `st_read()` from the `sf` package.

```{r results='hide'}
boundary_Delft <- st_read("data/delft-boundary.shp")
```

::: callout

# All `sf` functions start with `st_`

Note that all functions from the `sf` package start with the standard prefix `st_` which stands for Spatial Type. This is helpful in at least two ways: (1) it makes the interaction with or translation to/from software using the simple features standard like PostGIS easy, and (2) it allows for easy autocompletion of function names in RStudio.

:::

## Spatial Metadata

The `st_read()` function gave us a message with a summary of metadata about the file that was read in. To examine the metadata in more detail, we can use other, more specialised, functions from the `sf` package. The `st_geometry_type()` function, for instance, gives us information about the geometry type, which in this case is `POLYGON`.

```{r}
st_geometry_type(boundary_Delft)
```

The `st_crs()` function returns the coordinate reference system (CRS) used by the shapefile, which in this case is `WGS84` and has the unique reference code `EPSG: 4326`.

```{r}
st_crs(boundary_Delft)
```

::: callout

# Examining the output of `st_crs()`

As the output of `st_crs()` can be long, you can use `$Name` and `$epsg` after the `crs()` call to extract the projection name and EPSG code respectively.

:::

The `st_bbox()` function shows the extent of the layer. As `WGS84` is a **geographic CRS**, the extent of the shapefile is displayed in degrees.

```{r}
st_bbox(boundary_Delft)
```

We need a **projected CRS**, which in the case of the Netherlands is typically the Amersfort / RD New projection. To reproject our shapefile, we will use the `st_transform()` function. For the `crs` argument we can use the EPSG code of the CRS we want to use, which is `28992` for the `Amersfort / RD New` projection.

```{r}
boundary_Delft <- st_transform(boundary_Delft, 28992)
st_crs(boundary_Delft)
```

Notice that the bounding box is measured in meters after the transformation.

```{r}
st_bbox(boundary_Delft)
```

We confirm the transformation by examining the reprojected shapefile.

```{r}
boundary_Delft
```

::: callout

More about CRS in [Handling Spatial Projection & CRS]().

:::



## Plot a vector layer

Now, let's plot this shapefile. You are already familiar with the `ggplot2` package from [Introduction to Visualisation](). `ggplot2` has special `geom_` functions for spatial data. We will use the `geom_sf()` function for `sf` data.

```{r}

ggplot(data = boundary_Delft) +
geom_sf(size = 3, color = "black", fill = "cyan1") +
labs(title = "Delft Administrative Boundary") +
coord_sf(datum = st_crs(28992)) # this is needed to display the axes in meters

```

::::::::::::::::::::::::::::::::::::: challenge

### Challenge 1: Import line and point vector layers

Read in `delft-streets.shp` and `delft-leisure.shp` and assign them to `lines_Delft` and `point_Delft` respectively. Answer the following questions:

1. What type of R spatial object is created when you import each layer?
2. What is the CRS and extent for each object?
3. Do the files contain points, lines, or polygons?
4. How many features are in each file?

ClementineCttn marked this conversation as resolved.
Show resolved Hide resolved
:::::::::::::::::::::::: solution

```{r results='hide'}
lines_Delft <- st_read("data/delft-streets.shp")
point_Delft <- st_read("data/delft-leisure.shp")
```

We can check the type of data with the `class()` function from base R. Both `lines_Delft` and `point_Delft` are objects of class `"sf"`, which extends the `"data.frame"` class.

```{r}
class(lines_Delft)
class(point_Delft)
```

`lines_Delft` and `point_Delft` are in the correct CRS.

```{r}
st_crs(lines_Delft)$epsg
st_crs(point_Delft)$epsg
```

When looking at the bounding boxes with the `st_bbox()` function, we see the spatial extent of the two objects in a projected CRS using meters as units. `lines_Delft()` and `point_Delft` have similar extents.

```{r}
st_bbox(lines_Delft)
st_bbox(point_Delft)
```

:::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::



::::::::::::::::::::::::::::::::::::: keypoints

- Metadata for vector layers include geometry type, CRS, and extent.
- Load spatial objects into R with the `st_read()` function.
- Spatial objects can be plotted directly with `ggplot` using the `geom_sf()` function. No need to convert to a data frame.

::::::::::::::::::::::::::::::::::::::::::::::::
Loading
Loading