This Notebook will demonstrate how to import raster GIS data into R.

Import a Landsat 8 Image

Because Landsat images are multi-band we import them using the brick():

library(raster)
Loading required package: sp
yose_l8_rst <- raster::brick("./data/yose_l8_20180822_b2345.tif")
yose_l8_rst
class      : RasterBrick 
dimensions : 2555, 2014, 5145770, 4  (nrow, ncol, ncell, nlayers)
resolution : 30, 30  (x, y)
extent     : 246315, 306735, 4152885, 4229535  (xmin, xmax, ymin, ymax)
crs        : +proj=utm +zone=11 +datum=WGS84 +units=m +no_defs
Error in gregexpr(calltext, singleline, fixed = TRUE) : 
  regular expression is invalid UTF-8
 
source     : D:/Workshops/R-Spatial/rspatial_mod/outputs/rspatial_data/data/yose_l8_20180822_b2345.tif 
names      : yose_l8_20180822_b2345.1, yose_l8_20180822_b2345.2, yose_l8_20180822_b2345.3, yose_l8_20180822_b2345.4 
min values :                     7208,                     6100,                     5357,                     4330 
max values :                    29840,                    30960,                    32595,                    30481 

View a summary of the bands:

summary(yose_l8_rst)
summary is an estimate based on a sample of 1e+05 cells (1.94% of all cells)
        yose_l8_20180822_b2345.1 yose_l8_20180822_b2345.2 yose_l8_20180822_b2345.3 yose_l8_20180822_b2345.4
Min.                        7411                     6366                     5609                     4933
1st Qu.                     8589                     8072                     7749                    12439
Median                      9254                     8908                     8965                    13980
3rd Qu.                    10419                    10456                    10960                    15809
Max.                       26650                    27824                    29578                    27484
NA's                           0                        0                        0                        0

We can tell from the values that Landsat pixel values are 16-bit (0..65536). Remind ourselves of the band combinations for Landsat 8:

Plot it with plotRGB

Plot a Pseudo True Color:

plotRGB(yose_l8_rst, r=3, g=2, b=1, scale = 2 ^ 16)

Isn’t that awful? The problem is the range of brightness values is fairly narrow. The Landsat sensor isn’t like the camera in your phone, which artificially stretches values to make them look pleasing to the eye.

To make it look better, we can pass the stretch argument to have it make a contrast stretch:

plotRGB(yose_l8_rst, r=3, g=2, b=1, scale = 2 ^ 16, stretch = 'lin')


Plot a False Color Composite:

plotRGB(yose_l8_rst, r=4, g=3, b=2, scale = 2 ^ 16, stretch = 'lin')

You can do a lot more with satellite imagery using RStoolbox.

Plot it with tmap

To overlay the park boundary, we’ll use tmap:

library(sf)
Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
library(tmap)
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
epsg_utm11n_wgs84 <- 32611
yose_bnd_utm <- sf::st_read(dsn="./data", layer="yose_boundary") %>% 
  st_transform(epsg_utm11n_wgs84)
Reading layer `yose_boundary' from data source `D:\Workshops\R-Spatial\rspatial_mod\outputs\rspatial_data\data' using driver `ESRI Shapefile'
Simple feature collection with 1 feature and 11 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -119.8864 ymin: 37.4947 xmax: -119.1964 ymax: 38.18515
Geodetic CRS:  North_American_Datum_1983
tm_shape(yose_l8_rst) +
  tm_rgb(r=4, g=3, b=2, interpolate = FALSE, max.value = 2 ^ 16) +
tm_shape(yose_bnd_utm) +
  tm_borders(col="red", lwd=2) +
tm_layout(legend.show = FALSE)
stars object downsampled to 888 by 1126 cells. See tm_shape manual (argument raster.downsample)

End

Congratulations, you’ve completed the Notebook!

To view your Notebook at HTML, save it (again), then click the ‘Preview’ button in the RStudio toolbar.

LS0tDQp0aXRsZTogIkltcG9ydCBSYXN0ZXIgRGF0YSINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KLS0tDQoNClRoaXMgTm90ZWJvb2sgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gaW1wb3J0IHJhc3RlciBHSVMgZGF0YSBpbnRvIFIuDQoNCiMjIEltcG9ydCBhIExhbmRzYXQgOCBJbWFnZQ0KDQpCZWNhdXNlIExhbmRzYXQgaW1hZ2VzIGFyZSBtdWx0aS1iYW5kIHdlIGltcG9ydCB0aGVtIHVzaW5nIHRoZSBgYnJpY2soKWA6DQoNCmBgYHtyIGNodW5rMDF9DQpsaWJyYXJ5KHJhc3RlcikNCnlvc2VfbDhfcnN0IDwtIHJhc3Rlcjo6YnJpY2soIi4vZGF0YS95b3NlX2w4XzIwMTgwODIyX2IyMzQ1LnRpZiIpDQp5b3NlX2w4X3JzdA0KYGBgDQoNClZpZXcgYSBzdW1tYXJ5IG9mIHRoZSBiYW5kczoNCg0KYGBge3IgY2h1bmswMn0NCnN1bW1hcnkoeW9zZV9sOF9yc3QpDQpgYGANCldlIGNhbiB0ZWxsIGZyb20gdGhlIHZhbHVlcyB0aGF0IExhbmRzYXQgcGl4ZWwgdmFsdWVzIGFyZSAxNi1iaXQgKDAuLjY1NTM2KS4gUmVtaW5kIG91cnNlbHZlcyBvZiB0aGUgYmFuZCBjb21iaW5hdGlvbnMgZm9yIExhbmRzYXQgODoNCg0KIVtdKGh0dHBzOi8vdWNhbnItaWdpcy5naXRodWIuaW8vcnNwYXRpYWxfc2NnaXMyMS9zbGlkZXMvaW1hZ2VzL2w4X2JhbmRfY29tYm9zXzc4NngzOTIucG5nKQ0KDQojIyBQbG90IGl0IHdpdGggcGxvdFJHQg0KDQpQbG90IGEgUHNldWRvIFRydWUgQ29sb3I6DQoNCmBgYHtyIGNodW5rMDN9DQpwbG90UkdCKHlvc2VfbDhfcnN0LCByPTMsIGc9MiwgYj0xLCBzY2FsZSA9IDIgXiAxNikNCmBgYA0KDQpJc24ndCB0aGF0IGF3ZnVsPyBUaGUgcHJvYmxlbSBpcyB0aGUgcmFuZ2Ugb2YgYnJpZ2h0bmVzcyB2YWx1ZXMgaXMgZmFpcmx5IG5hcnJvdy4gVGhlIExhbmRzYXQgc2Vuc29yIGlzbid0IGxpa2UgdGhlIGNhbWVyYSBpbiB5b3VyIHBob25lLCB3aGljaCBhcnRpZmljaWFsbHkgc3RyZXRjaGVzIHZhbHVlcyB0byBtYWtlIHRoZW0gbG9vayBwbGVhc2luZyB0byB0aGUgZXllLg0KDQpUbyBtYWtlIGl0IGxvb2sgYmV0dGVyLCB3ZSBjYW4gcGFzcyB0aGUgYHN0cmV0Y2hgIGFyZ3VtZW50IHRvIGhhdmUgaXQgbWFrZSBhIGNvbnRyYXN0IHN0cmV0Y2g6DQoNCmBgYHtyIGNodW5rMDR9DQpwbG90UkdCKHlvc2VfbDhfcnN0LCByPTMsIGc9MiwgYj0xLCBzY2FsZSA9IDIgXiAxNiwgc3RyZXRjaCA9ICdsaW4nKQ0KYGBgDQoNClwNCg0KUGxvdCBhIEZhbHNlIENvbG9yIENvbXBvc2l0ZToNCg0KYGBge3IgY2h1bmswNX0NCnBsb3RSR0IoeW9zZV9sOF9yc3QsIHI9NCwgZz0zLCBiPTIsIHNjYWxlID0gMiBeIDE2LCBzdHJldGNoID0gJ2xpbicpDQpgYGANCg0KWW91IGNhbiBkbyBhIGxvdCBtb3JlIHdpdGggc2F0ZWxsaXRlIGltYWdlcnkgdXNpbmcgW1JTdG9vbGJveF0oaHR0cHM6Ly9ibGV1dG5lci5naXRodWIuaW8vUlN0b29sYm94L3JzdGJ4LWRvY3Uvc3BlY3RyYWxJbmRpY2VzLmh0bWwpLg0KDQojIyBQbG90IGl0IHdpdGggdG1hcA0KDQpUbyBvdmVybGF5IHRoZSBwYXJrIGJvdW5kYXJ5LCB3ZSdsbCB1c2UgdG1hcDoNCg0KYGBge3IgY2h1bmswNn0NCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHRtYXApDQplcHNnX3V0bTExbl93Z3M4NCA8LSAzMjYxMQ0KeW9zZV9ibmRfdXRtIDwtIHNmOjpzdF9yZWFkKGRzbj0iLi9kYXRhIiwgbGF5ZXI9Inlvc2VfYm91bmRhcnkiKSAlPiUgDQogIHN0X3RyYW5zZm9ybShlcHNnX3V0bTExbl93Z3M4NCkNCg0KdG1fc2hhcGUoeW9zZV9sOF9yc3QpICsNCiAgdG1fcmdiKHI9NCwgZz0zLCBiPTIsIGludGVycG9sYXRlID0gRkFMU0UsIG1heC52YWx1ZSA9IDIgXiAxNikgKw0KdG1fc2hhcGUoeW9zZV9ibmRfdXRtKSArDQogIHRtX2JvcmRlcnMoY29sPSJyZWQiLCBsd2Q9MikgKw0KdG1fbGF5b3V0KGxlZ2VuZC5zaG93ID0gRkFMU0UpDQpgYGANCg0KIyMgRW5kDQoNCkNvbmdyYXR1bGF0aW9ucywgeW91J3ZlIGNvbXBsZXRlZCB0aGUgTm90ZWJvb2shIA0KDQpUbyB2aWV3IHlvdXIgTm90ZWJvb2sgYXQgSFRNTCwgc2F2ZSBpdCAoYWdhaW4pLCB0aGVuIGNsaWNrIHRoZSAnUHJldmlldycgYnV0dG9uIGluIHRoZSBSU3R1ZGlvIHRvb2xiYXIuDQoNCg0K