Skip to content

Commit f7f6c2c

Browse files
committed
Revert "Lesson 3 updated by replacing calls to raster and rgdal packages with calls to terra package. #368 #363" because it was included by accident.
1 parent 2461571 commit f7f6c2c

File tree

1 file changed

+59
-69
lines changed

1 file changed

+59
-69
lines changed

episodes/03-raster-reproject-in-r.Rmd

Lines changed: 59 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ source("setup.R")
2222
::::::::::::::::::::::::::::::::::::::::::::::::::
2323

2424
```{r load-libraries, echo=FALSE, results="hide", message=FALSE, warning=FALSE}
25-
library(terra)
25+
library(raster)
26+
library(rgdal)
2627
library(ggplot2)
2728
library(dplyr)
2829
```
@@ -32,17 +33,16 @@ library(dplyr)
3233
## Things You'll Need To Complete This Episode
3334

3435
See the [lesson homepage](.) for detailed information about the software,
35-
data, and other prerequisites you will need to work through the examples in
36-
this episode.
36+
data, and other prerequisites you will need to work through the examples in this episode.
3737

3838

3939
::::::::::::::::::::::::::::::::::::::::::::::::::
4040

4141
Sometimes we encounter raster datasets that do not "line up" when plotted or
4242
analyzed. Rasters that don't line up are most often in different Coordinate
43-
Reference Systems (CRS). This episode explains how to deal with rasters in
44-
different, known CRSs. It will walk though reprojecting rasters in R using
45-
the `project()` function in the `terra` package.
43+
Reference Systems (CRS). This episode explains how to deal with rasters in different, known CRSs. It
44+
will walk though reprojecting rasters in R using the `projectRaster()`
45+
function in the `raster` package.
4646

4747
## Raster Projection in R
4848

@@ -57,23 +57,21 @@ far in that the digital surface model (DSM) includes the tops of trees, while
5757
the digital terrain model (DTM) shows the ground level.
5858

5959
We'll be looking at another model (the canopy height model) in
60-
[a later episode](04-raster-calculations-in-r/) and will see how to calculate
61-
the CHM from the DSM and DTM. Here, we will create a map of the Harvard Forest
62-
Digital Terrain Model (`DTM_HARV`) draped or layered on top of the hillshade
63-
(`DTM_hill_HARV`).
64-
The hillshade layer maps the terrain using light and shadow to create a
65-
3D-looking image, based on a hypothetical illumination of the ground level.
60+
[a later episode](04-raster-calculations-in-r/) and will see how to calculate the CHM from the
61+
DSM and DTM. Here, we will create a map of the Harvard Forest Digital
62+
Terrain Model
63+
(`DTM_HARV`) draped or layered on top of the hillshade (`DTM_hill_HARV`).
64+
The hillshade layer maps the terrain using light and shadow to create a 3D-looking image,
65+
based on a hypothetical illumination of the ground level.
6666

6767
![](fig/dc-spatial-raster/lidarTree-height.png){alt='Source: National Ecological Observatory Network (NEON).'}
6868

6969
First, we need to import the DTM and DTM hillshade data.
7070

7171
```{r import-DTM-hillshade}
72-
DTM_HARV <-
73-
rast("data/NEON-DS-Airborne-Remote-Sensing/HARV/DTM/HARV_dtmCrop.tif")
72+
DTM_HARV <- raster("data/NEON-DS-Airborne-Remote-Sensing/HARV/DTM/HARV_dtmCrop.tif")
7473
75-
DTM_hill_HARV <-
76-
rast("data/NEON-DS-Airborne-Remote-Sensing/HARV/DTM/HARV_DTMhill_WGS84.tif")
74+
DTM_hill_HARV <- raster("data/NEON-DS-Airborne-Remote-Sensing/HARV/DTM/HARV_DTMhill_WGS84.tif")
7775
```
7876

7977
Next, we will convert each of these datasets to a dataframe for
@@ -101,7 +99,8 @@ ggplot() +
10199

102100
Our results are curious - neither the Digital Terrain Model (`DTM_HARV_df`)
103101
nor the DTM Hillshade (`DTM_hill_HARV_df`) plotted.
104-
Let's try to plot the DTM on its own to make sure there are data there.
102+
Let's try to
103+
plot the DTM on its own to make sure there are data there.
105104

106105
```{r plot-DTM}
107106
ggplot() +
@@ -124,12 +123,10 @@ geom_raster(data = DTM_hill_HARV_df,
124123
coord_quickmap()
125124
```
126125

127-
If we look at the axes, we can see that the projections of the two rasters are
128-
different.
129-
When this is the case, `ggplot` won't render the image. It won't even throw an
130-
error message to tell you something has gone wrong. We can look at Coordinate
131-
Reference Systems (CRSs) of the DTM and the hillshade data to see how they
132-
differ.
126+
If we look at the axes, we can see that the projections of the two rasters are different.
127+
When this is the case, `ggplot` won't render the image. It won't even
128+
throw an error message to tell you something has gone wrong. We can look at Coordinate Reference Systems (CRSs) of the DTM and
129+
the hillshade data to see how they differ.
133130

134131
::::::::::::::::::::::::::::::::::::::: challenge
135132

@@ -144,10 +141,10 @@ does each use?
144141

145142
```{r explore-crs}
146143
# view crs for DTM
147-
crs(DTM_HARV, parse = TRUE)
144+
crs(DTM_HARV)
148145
149146
# view crs for hillshade
150-
crs(DTM_hill_HARV, parse = TRUE)
147+
crs(DTM_hill_HARV)
151148
```
152149

153150
`DTM_HARV` is in the UTM projection, with units of meters.
@@ -161,12 +158,12 @@ crs(DTM_hill_HARV, parse = TRUE)
161158
::::::::::::::::::::::::::::::::::::::::::::::::::
162159

163160
Because the two rasters are in different CRSs, they don't line up when plotted
164-
in R. We need to reproject (or change the projection of) `DTM_hill_HARV` into
165-
the UTM CRS. Alternatively, we could reproject `DTM_HARV` into WGS84.
161+
in R. We need to reproject (or change the projection of) `DTM_hill_HARV` into the UTM CRS. Alternatively,
162+
we could reproject `DTM_HARV` into WGS84.
166163

167164
## Reproject Rasters
168165

169-
We can use the `project()` function to reproject a raster into a new CRS.
166+
We can use the `projectRaster()` function to reproject a raster into a new CRS.
170167
Keep in mind that reprojection only works when you first have a defined CRS
171168
for the raster object that you want to reproject. It cannot be used if no
172169
CRS is defined. Lucky for us, the `DTM_hill_HARV` has a defined CRS.
@@ -175,46 +172,46 @@ CRS is defined. Lucky for us, the `DTM_hill_HARV` has a defined CRS.
175172

176173
## Data Tip
177174

178-
When we reproject a raster, we move it from one "grid" to another. Thus, we are
179-
modifying the data! Keep this in mind as we work with raster data.
175+
When we reproject a raster, we
176+
move it from one "grid" to another. Thus, we are modifying the data! Keep this
177+
in mind as we work with raster data.
180178

181179

182180
::::::::::::::::::::::::::::::::::::::::::::::::::
183181

184-
To use the `project()` function, we need to define two things:
182+
To use the `projectRaster()` function, we need to define two things:
185183

186184
1. the object we want to reproject and
187185
2. the CRS that we want to reproject it to.
188186

189-
The syntax is `project(RasterObject, crs)`
187+
The syntax is `projectRaster(RasterObject, crs = CRSToReprojectTo)`
190188

191189
We want the CRS of our hillshade to match the `DTM_HARV` raster. We can thus
192-
assign the CRS of our `DTM_HARV` to our hillshade within the `project()`
193-
function as follows: `crs(DTM_HARV)`.
194-
Note that we are using the `project()` function on the raster object,
190+
assign the CRS of our `DTM_HARV` to our hillshade within the `projectRaster()`
191+
function as follows: `crs = crs(DTM_HARV)`.
192+
Note that we are using the `projectRaster()` function on the raster object,
195193
not the `data.frame()` we use for plotting with `ggplot`.
196194

197-
First we will reproject our `DTM_hill_HARV` raster data to match the `DTM_HARV`
198-
raster CRS:
195+
First we will reproject our `DTM_hill_HARV` raster data to match the `DTM_HARV` raster CRS:
199196

200197
```{r reproject-raster}
201-
DTM_hill_UTMZ18N_HARV <- project(DTM_hill_HARV,
202-
crs(DTM_HARV))
198+
DTM_hill_UTMZ18N_HARV <- projectRaster(DTM_hill_HARV,
199+
crs = crs(DTM_HARV))
203200
```
204201

205-
Now we can compare the CRS of our original DTM hillshade and our new DTM
206-
hillshade, to see how they are different.
202+
Now we can compare the CRS of our original DTM hillshade
203+
and our new DTM hillshade, to see how they are different.
207204

208205
```{r}
209-
crs(DTM_hill_UTMZ18N_HARV, parse = TRUE)
210-
crs(DTM_hill_HARV, parse = TRUE)
206+
crs(DTM_hill_UTMZ18N_HARV)
207+
crs(DTM_hill_HARV)
211208
```
212209

213210
We can also compare the extent of the two objects.
214211

215212
```{r}
216-
ext(DTM_hill_UTMZ18N_HARV)
217-
ext(DTM_hill_HARV)
213+
extent(DTM_hill_UTMZ18N_HARV)
214+
extent(DTM_hill_HARV)
218215
```
219216

220217
Notice in the output above that the `crs()` of `DTM_hill_UTMZ18N_HARV` is now
@@ -231,9 +228,8 @@ Why do you think the two extents differ?
231228

232229
## Answers
233230

234-
The extent for DTM\_hill\_UTMZ18N\_HARV is in UTMs so the extent is in meters.
235-
The extent for DTM\_hill\_HARV is in lat/long so the extent is expressed in
236-
decimal degrees.
231+
The extent for DTM\_hill\_UTMZ18N\_HARV is in UTMs so the extent is in meters. The extent for DTM\_hill\_HARV is in lat/long so the extent is expressed
232+
in decimal degrees.
237233

238234

239235

@@ -243,36 +239,31 @@ decimal degrees.
243239

244240
## Deal with Raster Resolution
245241

246-
Let's next have a look at the resolution of our reprojected hillshade versus
247-
our original data.
242+
Let's next have a look at the resolution of our reprojected hillshade versus our original data.
248243

249244
```{r view-resolution}
250245
res(DTM_hill_UTMZ18N_HARV)
251246
res(DTM_HARV)
252247
```
253248

254-
These two resolutions are different, but they're representing the same data. We
255-
can tell R to force our newly reprojected raster to be 1m x 1m resolution by
256-
adding a line of code `res=1` within the `project()` function. In the
257-
example below, we ensure a resolution match by using `res(DTM_HARV)` as a
258-
variable.
249+
These two resolutions are different, but they're representing the same data. We can tell R to force our
250+
newly reprojected raster to be 1m x 1m resolution by adding a line of code
251+
`res=1` within the `projectRaster()` function. In the example below, we ensure a resolution match by using `res(DTM_HARV)` as a variable.
259252

260253
```{r reproject-assign-resolution}
261-
DTM_hill_UTMZ18N_HARV <- project(DTM_hill_HARV,
262-
crs(DTM_HARV),
263-
res = res(DTM_HARV))
254+
DTM_hill_UTMZ18N_HARV <- projectRaster(DTM_hill_HARV,
255+
crs = crs(DTM_HARV),
256+
res = res(DTM_HARV))
264257
```
265258

266-
Now both our resolutions and our CRSs match, so we can plot these two data sets
267-
together. Let's double-check our resolution to be sure:
259+
Now both our resolutions and our CRSs match, so we can plot these two data sets together. Let's double-check our resolution to be sure:
268260

269261
```{r}
270262
res(DTM_hill_UTMZ18N_HARV)
271263
res(DTM_HARV)
272264
```
273265

274-
For plotting with `ggplot()`, we will need to create a dataframe from our newly
275-
reprojected raster.
266+
For plotting with `ggplot()`, we will need to create a dataframe from our newly reprojected raster.
276267

277268
```{r make-df-projected-raster}
278269
DTM_hill_HARV_2_df <- as.data.frame(DTM_hill_UTMZ18N_HARV, xy = TRUE)
@@ -311,16 +302,15 @@ Reproject the data as necessary to make things line up!
311302

312303
```{r challenge-code-reprojection, echo=TRUE}
313304
# import DSM
314-
DSM_SJER <-
315-
rast("data/NEON-DS-Airborne-Remote-Sensing/SJER/DSM/SJER_dsmCrop.tif")
305+
DSM_SJER <- raster("data/NEON-DS-Airborne-Remote-Sensing/SJER/DSM/SJER_dsmCrop.tif")
316306
# import DSM hillshade
317307
DSM_hill_SJER_WGS <-
318-
rast("data/NEON-DS-Airborne-Remote-Sensing/SJER/DSM/SJER_DSMhill_WGS84.tif")
308+
raster("data/NEON-DS-Airborne-Remote-Sensing/SJER/DSM/SJER_DSMhill_WGS84.tif")
319309
320310
# reproject raster
321-
DTM_hill_UTMZ18N_SJER <- project(DSM_hill_SJER_WGS,
322-
crs(DSM_SJER),
323-
res = 1)
311+
DTM_hill_UTMZ18N_SJER <- projectRaster(DSM_hill_SJER_WGS,
312+
crs = crs(DSM_SJER),
313+
res = 1)
324314
325315
# convert to data.frames
326316
DSM_SJER_df <- as.data.frame(DSM_SJER, xy = TRUE)
@@ -365,7 +355,7 @@ is this one was reprojected from WGS84 to UTM prior to plotting.
365355
:::::::::::::::::::::::::::::::::::::::: keypoints
366356

367357
- In order to plot two raster data sets together, they must be in the same CRS.
368-
- Use the `project()` function to convert between CRSs.
358+
- Use the `projectRaster()` function to convert between CRSs.
369359

370360
::::::::::::::::::::::::::::::::::::::::::::::::::
371361

0 commit comments

Comments
 (0)