--- title: "Import Vector Data" output: html_notebook: toc: yes toc_float: yes --- This Notebook will demonstrate how to import various types of vector GIS data into R. ## View Layers for Yosemite National Park First let's look at layers in the data folder, by passing the directory to `st_layers()` from the `sf` package. This will show us the Shapefiles but not layers that are in 'containers', like file geodatabases, geojson files, etc. ```{r chunk01} library(sf) ## View spatial layers in the data folder. st_layers("./data") ``` \ ## Import a Shapefile Import the 'yose_boundary' layer (a Shapefile) ```{r chunk03} yose_bnd_ll <- st_read(dsn="./data", layer="yose_boundary") # This also works: # yose_bnd_ll <- st_read(dsn="./data/yose_boundary.shp") ``` Note 1: we don't need to add the .shp extension Note 2: this code is using convention to name variables *yose_bnd_ll*. `yose` - all Yosemite layers start with this `bnd` - tell me this the park boundary `ll` - lat-long coordinates \ ## CHALLENGE: View the Object class Write an expression that returns the class (type) of *yose_bnd_ll*. [Answer](http://bit.ly/39cVjNZ) ```{r chunk04} ## Your answer here ``` We see that `yose_bnd_ll` is both a sf object (simple feature data frame) as well as a data.frame. This means we should be able to use the functions designed for either of those objects. View the properties of *yose_bnd_ll* by simply running it by itself: ```{r chunk05} yose_bnd_ll ``` \ ## CHALLENGE: Which CRS? What coordinate reference system is *yose_bnd_ll* in? [Answer](http://bit.ly/38UY2ve) ## View the Attribute Table The `names()` function returns the column labels of a data frame (in this case the attribute table). ```{r chunk06} ## View column names in the attribute table names(yose_bnd_ll) ``` Take note of the last column - `geometry`. That's where the geometry is saved (we'll come back to that later). View the first few rows of the attribute table with `head()`: ```{r chunk07} head(yose_bnd_ll) ``` ## Plot the Yosemite Boundary To plot just the geometry of a sf object (i.e., no symbology from the attribute table), we can use the `st_geometry()` function. ```{r chunk08} ## Plot the geometry (outline) of the Yosemite boundary plot(yose_bnd_ll %>% st_geometry(), asp=1) ``` \ ## CHALLENGE: Add Axes Add `axes=TRUE` to your plot() statement. [Answer](http://bit.ly/3lwqo48) ```{r chunk09} ``` \ ## CHALLENGE: Import and Plot POIs Import the Yosemite Points-of-Interest (POI) Shapefile and plot them. [Answer](http://bit.ly/3cSAEQi) ```{r chunk10} ``` ## Import a KML kml & kmz files can have more than one layer. Hence the source is the kml file, and you must specify the layer by name. Import a kml containing the National Register of Historic Places in Yosemite in Yosemite. First find the KML file: ```{r chunk11} ## Import KML file kml_fn <- "./data/yose_historic_pts.kml" file.exists(kml_fn) ``` View the layers within this KML: ```{r chunk12} ## View the layers in this kml st_layers(kml_fn) ``` Import: ```{r chunk13} ## Import the 'yosem_historic_places' layer yose_hp_ll <- st_read(kml_fn, layer="yose_historic_places") ``` View its properties: ```{r chunk14} ## View properties yose_hp_ll ``` ## Plot the Historic Places on top of the Park Boundary Remember to overlay more than one layer on a plot: - both layers must have the same CRS - include add=TRUE to the plot statements ```{r chunk15} ## Plot the boundary, then the historic places {plot(yose_bnd_ll %>% st_geometry(), asp=1) plot(yose_hp_ll %>% st_geometry(), add=TRUE)} ``` ## Import a GeoJSON file Import the California county boundaries, which is saved as a GeoJSON file. ```{r chunk16} ## Import a Geojson file counties_fn <- "./data/ca_counties.geojson" file.exists(counties_fn) ``` View the layers in this GeoJSON file: ```{r chunk17} ## View the layers st_layers(counties_fn) ``` Import the 'ca_counties' layer: ```{r chunk18} ## Import the 'ca_counties' layer ca_counties_ll <- st_read(counties_fn) ``` \ ## CHALLENGE: Plot Counties Plot the county boundaries. [Answer](http://bit.ly/38YeWJs) ```{r chunk19} ``` ## Import from a Geodatabase You can import (but not write to) an ESRI file geodatabase using the sf package. In this case, the source is the folder containing the geodatabase. Import the Yosemite’s trails from a geodatabase. First find the gdb file: ```{r chunk20} ## Define the path to the file geodatabase (a folder) gdb_fn <- "./data/yose_trails.gdb" file.exists(gdb_fn) ``` View the layers in this source: ```{r chunk21} st_layers(gdb_fn) ``` Import the 'Trails' layer ```{r chunk22} ## Import the 'Trails' layer (case sensitive!) yose_trails <- st_read(gdb_fn, layer="Trails") ``` Plot Yosemite’s Trails: ```{r chunk23} ## Plot the trails layer plot(st_geometry(yose_trails), axes=TRUE) ``` \ ## CHALLENGE: Diagnose a Bad Plot The following code does **not** work to make a plot of the park boundary and the trails. Can you tell why? [Answer](http://bit.ly/3eSGOlZ) ```{r chunk24} {plot(yose_bnd_ll %>% st_geometry()) plot(yose_trails %>% st_geometry(), add=TRUE)} ``` ## Import from a GeoPackage Let’s import Yosemite’s watersheds from a geopackage file. ```{r chunk25} ## Import watersheds from a geopackage gpkg_watershd_fn <- "./data/yose_watersheds.gpkg" file.exists(gpkg_watershd_fn) st_layers(gpkg_watershd_fn) yose_watersheds <- st_read(gpkg_watershd_fn, layer="calw221") ``` Plot the watersheds: ```{r chunk26} plot(st_geometry(yose_watersheds), axes=TRUE) ``` \ ## CHALLENGE: What CRS? What CRS are the Yosemite watersheds in? [Answer](http://bit.ly/38XePO7) **ANS**. California Equal Albers (a common projection for statewide data in California) ```{r chunk27} ``` \ ## Import a CSV file Import a CSV file containing missing persons records. Step 1 is to import it as a data frame: ```{r chunk28} ## Import missing people csv file missing_df <- read.csv("./data/yosemite_missing_people.csv", stringsAsFactors = FALSE) tibble::glimpse(missing_df) ``` Step 2 is to convert it to a sf data frame. We can surmise from the column names that the coordinates are geographic. We don't know precisely which datum, but passing crs=4326 (WGS84) will be close enough. ```{r chunk29} ## Convert to sf and plot yose_missing_ll <- st_as_sf(missing_df, coords=c("Long", "Lat"), crs=4326) ``` Plot to make sure: ```{r chunk 30} {plot(yose_bnd_ll %>% st_geometry(), col=NA, border="chartreuse4", lwd=3, main = "Missing Persons!") plot(yose_missing_ll %>% st_geometry(), pch=16, cex=0.5, add=TRUE)} ``` \ ## CHALLENGE: Import another Layer Look at the other GIS files in the data folder. Select one, import it, and plot it. ```{r chunk31} ## Your answer here ```