# Extract the OSM network from geofabrik
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(sf)
## Linking to GEOS 3.11.1, GDAL 3.6.2, PROJ 9.1.1; sf_use_s2() is TRUE
library(osmextract)
## Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright.
## Check the package website, https://docs.ropensci.org/osmextract/, for more details.
library(stplanr)
library(raster)
## Loading required package: sp
##
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
##
## select
iow_osm = oe_get("Isle of Wight", provider = "geofabrik", stringsAsFactors = FALSE, quiet = FALSE, force_download = TRUE, force_vectortranslate = TRUE)
## The input place was matched with: Isle of Wight
##
|
| | 0%
|
| | 1%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|== | 4%
|
|=== | 4%
|
|=== | 5%
|
|==== | 5%
|
|==== | 6%
|
|===== | 6%
|
|===== | 7%
|
|===== | 8%
|
|====== | 8%
|
|====== | 9%
|
|======= | 9%
|
|======= | 10%
|
|======= | 11%
|
|======== | 11%
|
|======== | 12%
|
|========= | 12%
|
|========= | 13%
|
|========= | 14%
|
|========== | 14%
|
|========== | 15%
|
|=========== | 15%
|
|=========== | 16%
|
|============ | 16%
|
|============ | 17%
|
|============ | 18%
|
|============= | 18%
|
|============= | 19%
|
|============== | 19%
|
|============== | 20%
|
|============== | 21%
|
|=============== | 21%
|
|=============== | 22%
|
|================ | 22%
|
|================ | 23%
|
|================ | 24%
|
|================= | 24%
|
|================= | 25%
|
|================== | 25%
|
|================== | 26%
|
|=================== | 26%
|
|=================== | 27%
|
|=================== | 28%
|
|==================== | 28%
|
|==================== | 29%
|
|===================== | 29%
|
|===================== | 30%
|
|===================== | 31%
|
|====================== | 31%
|
|====================== | 32%
|
|======================= | 32%
|
|======================= | 33%
|
|======================= | 34%
|
|======================== | 34%
|
|======================== | 35%
|
|========================= | 35%
|
|========================= | 36%
|
|========================== | 36%
|
|========================== | 37%
|
|========================== | 38%
|
|=========================== | 38%
|
|=========================== | 39%
|
|============================ | 39%
|
|============================ | 40%
|
|============================ | 41%
|
|============================= | 41%
|
|============================= | 42%
|
|============================== | 42%
|
|============================== | 43%
|
|============================== | 44%
|
|=============================== | 44%
|
|=============================== | 45%
|
|================================ | 45%
|
|================================ | 46%
|
|================================= | 46%
|
|================================= | 47%
|
|================================= | 48%
|
|================================== | 48%
|
|================================== | 49%
|
|=================================== | 49%
|
|=================================== | 50%
|
|=================================== | 51%
|
|==================================== | 51%
|
|==================================== | 52%
|
|===================================== | 52%
|
|===================================== | 53%
|
|====================================== | 54%
|
|====================================== | 55%
|
|======================================= | 55%
|
|======================================= | 56%
|
|======================================== | 56%
|
|======================================== | 57%
|
|======================================== | 58%
|
|========================================= | 58%
|
|========================================= | 59%
|
|========================================== | 59%
|
|========================================== | 60%
|
|========================================== | 61%
|
|=========================================== | 61%
|
|=========================================== | 62%
|
|============================================ | 62%
|
|============================================ | 63%
|
|============================================= | 64%
|
|============================================= | 65%
|
|============================================== | 65%
|
|============================================== | 66%
|
|=============================================== | 66%
|
|=============================================== | 67%
|
|=============================================== | 68%
|
|================================================ | 68%
|
|================================================ | 69%
|
|================================================= | 69%
|
|================================================= | 70%
|
|================================================== | 71%
|
|================================================== | 72%
|
|=================================================== | 73%
|
|=================================================== | 74%
|
|==================================================== | 74%
|
|==================================================== | 75%
|
|===================================================== | 75%
|
|===================================================== | 76%
|
|====================================================== | 76%
|
|====================================================== | 77%
|
|====================================================== | 78%
|
|======================================================= | 78%
|
|======================================================= | 79%
|
|======================================================== | 79%
|
|======================================================== | 80%
|
|======================================================== | 81%
|
|========================================================= | 81%
|
|========================================================= | 82%
|
|========================================================== | 82%
|
|========================================================== | 83%
|
|========================================================== | 84%
|
|=========================================================== | 84%
|
|=========================================================== | 85%
|
|============================================================ | 85%
|
|============================================================ | 86%
|
|============================================================= | 86%
|
|============================================================= | 87%
|
|============================================================== | 88%
|
|================================================================ | 91%
|
|================================================================ | 92%
|
|================================================================= | 92%
|
|================================================================= | 93%
|
|================================================================= | 94%
|
|================================================================== | 94%
|
|================================================================== | 95%
|
|=================================================================== | 95%
|
|=================================================================== | 96%
|
|==================================================================== | 96%
|
|==================================================================== | 97%
|
|==================================================================== | 98%
|
|===================================================================== | 98%
|
|===================================================================== | 99%
|
|======================================================================| 99%
|
|======================================================================| 100%
## File downloaded!
## Start with the vectortranslate operations on the input file!
## 0...10...20...30...40...50...60...70...80...90...100 - done.
## Finished the vectortranslate operations on the input file!
## Reading layer `lines' from data source
## `C:\Users\Tsegaye\AppData\Local\Temp\Rtmp2FtYKa\geofabrik_isle-of-wight-latest.gpkg'
## using driver `GPKG'
## Simple feature collection with 51008 features and 9 fields
## Geometry type: LINESTRING
## Dimension: XY
## Bounding box: xmin: -5.715479 ymin: 43.35489 xmax: 0.2409745 ymax: 50.89601
## Geodetic CRS: WGS 84
#`C:\Users\Tsegaye\AppData\Local\Temp\RtmpGeTUe6\geofabrik_isle-of-wight-latest.gpkg' data stored here
myRoadNetworkPath <- "U:/AfriGeoinformation_RoadNetwork/Road_Network_OSM_Lab_1"
setwd(myRoadNetworkPath)
dir()
## [1] "Road_Network_OSM_Lab_1.Rmd" "SlopesIoW.html"
iow_network = iow_osm %>%
dplyr::filter(highway %in% c('primary', "primary_link", 'secondary',"secondary_link", 'tertiary', "tertiary_link",
"trunk", "trunk_link", "residential", "cycleway", "living_street", "unclassified",
"motorway", "motorway_link", "pedestrian", "steps", "track")) #remove: "service",
table(iow_network$highway)
##
## cycleway living_street pedestrian primary primary_link
## 253 5 38 664 22
## residential secondary secondary_link steps tertiary
## 2972 438 1 459 615
## tertiary_link track unclassified
## 3 4211 876
# Clean the road network
#library(stplanr)
iow_network$group = stplanr::rnet_group(iow_network)
plot(iow_network["group"])
iow_network_clean = iow_network %>% filter(group == 1) #the network with more connected segments
100*nrow(iow_network_clean)/nrow(iow_network) #percentage of the remaining highways
## [1] 87.61959
iow_network_segments = stplanr::rnet_breakup_vertices(iow_network_clean)
nrow(iow_network_segments)/nrow(iow_network_clean) #multiply factor
## [1] 1.540108
# Import DEM (extracted with QGIS SRTM Downloader plugin and clipped)
library(raster)
DEM = raster("https://github.com/U-Shift/Declives-RedeViaria/releases/download/0.2/IsleOfWightNASA_clip.tif")
class(DEM)
## [1] "RasterLayer"
## attr(,"package")
## [1] "raster"
summary(values(DEM))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -18.0 0.0 0.0 21.3 31.0 243.0
res(DEM) #27m of resolution
## [1] 0.0002777778 0.0002777778
network = iow_network_segments
raster::plot(DEM)
plot(sf::st_geometry(network), add = TRUE) #check if they overlay
# install.packages("remotes")
#remotes::install_github("ropensci/slopes") # we used remotes to install the packages "slopes"
# Get the slope value for each segment (abs), using slopes package
library(slopes)
library(geodist)
network$slope = slope_raster(network, dem = DEM) #about 15sec
network$slope = network$slope*100 #percentage
summary(network$slope) #!
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 1.728 3.095 3.892 5.092 152.888
# Classify slopes
network$slope_class = network$slope %>%
cut(
breaks = c(0, 3, 5, 8, 10, 20, Inf),
labels = c("0-3: flat", "3-5: mild", "5-8: medium", "8-10: hard", "10-20: extreme", ">20: impossible"),
right = F
)
round(prop.table(table(network$slope_class))*100,1)
##
## 0-3: flat 3-5: mild 5-8: medium 8-10: hard 10-20: extreme
## 48.4 25.7 16.9 4.2 4.4
## >20: impossible
## 0.4
# make an interactive map
library(tmap)
palredgreen = c("#267300", "#70A800", "#FFAA00", "#E60000", "#A80000", "#730000") #color palette
tmap_mode("view")
## tmap mode set to interactive viewing
tmap_options(basemaps = leaflet::providers$CartoDB.Positron) #mapa base
slopemap =
tm_shape(network) +
tm_lines(
col = "slope_class",
palette = palredgreen,
lwd = 2, #line width
title.col = "Slope [%]",
popup.vars = c("Highway" = "highway",
"Slope: " = "slope",
"Class: " = "slope_class"),
popup.format = list(digits = 1),
# id = "slope"
id = "name" #if it gets too memory consuming, delete this line
)
slopemap