This function takes an sf
representing routes over geographical space
and a raster dataset representing the terrain as inputs.
It returns the average gradient of each route feature.
Usage
slope_raster(
routes,
dem,
lonlat = sf::st_is_longlat(routes),
method = "bilinear",
fun = slope_matrix_weighted,
terra = has_terra() && methods::is(dem, "SpatRaster"),
directed = FALSE
)
Arguments
- routes
Routes, the gradients of which are to be calculated. The object must be of class
sf
orsfc
withLINESTRING
geometries.- dem
Raster overlapping with
routes
and values representing elevations- lonlat
Are the routes provided in longitude/latitude coordinates? By default, value is from the CRS of the routes (
sf::st_is_longlat(routes)
).- method
The method of estimating elevation at points, passed to the
extract
function for extracting values from raster datasets. Default:"bilinear"
.- fun
The slope function to calculate per route,
slope_matrix_weighted
by default.- terra
Should the
terra
package be used?TRUE
by default if the package is installed and ifdem
is of classSpatRast
- directed
Should the value be directed?
FALSE
by default. IfTRUE
the result will be negative when it represents a downslope (when the end point is lower than the start point).
Value
A vector of slopes equal in length to the number simple features (rows representing linestrings) in the input object.
Details
If calculating slopes associated with OSM data, the results may be better
if the network is first split-up, e.g. using the function
stplanr::rnet_breakup_vertices()
from the
stplanr
package.
Note: The routes
object must have a geometry type of LINESTRING
.
The sf::st_cast()
function can convert from MULTILINESTRING
(and other)
geometries to LINESTRING
s as follows:
r_linestring = sf::st_cast(routes, "LINESTRING")
.
Examples
library(sf)
routes = lisbon_road_network[1:3, ]
dem = dem_lisbon_raster
(s = slope_raster(routes, dem))
#> 1 2 3
#> 0.003074005 0.010870459 0.004998315
cor(routes$Avg_Slope, s)
#> [1] 0.9975107
slope_raster(routes, dem, directed = TRUE)
#> 1 2 3
#> 0.003074005 -0.010870459 0.004998315
# Demonstrate that reverse routes have the opposite directed slope
slope_raster(st_reverse(routes), dem, directed = TRUE)
#> 1 2 3
#> -0.003074005 0.010870459 -0.004998315