# /!\/!\/!\ à exécuter si nécessaire
# install.packages("tidyverse", type = "win.binary")

# 0 - Nettoyer son env de travail
rm(list=ls())

# Charger librairies
library(dplyr)
library(sf)
library(leaflet)
library(ggplot2)
library(ggspatial)
library(osmdata)
library(osrm)
library(tidyr)
library(readxl)

# 0 -Fixer le repertoire de travail
setwd("~/git/MASTER_1_R/data")

1 - Creation de donnees (from scratch)

# Recolte des donnees
# Parc de l'Hôtel de Ville 49.44254170087927, 1.1013442922359218
# Square Charles Verdrel 49.44491092198989, 1.0933064445697365
# Esplanade du Champ de Mars 49.43684894602264, 1.1041573107722227
# Parc de la Presqu’île Rollet 49.44214567455017, 1.0630771863412742
# Jardin des Plantes de Rouen 49.42203509935082, 1.0763288491493366

nom <- c("Parc de l'Hôtel de Ville","Square Charles Verdrel","Esplanade du Champ de Mars","Parc de la Presqu’île Rollet", "Jardin des Plantes de Rouen")
lat <- c(49.44254170087927,49.44491092198989,49.43684894602264,49.44214567455017,49.42203509935082)
lon <- c(1.1013442922359218,1.0933064445697365,1.1041573107722227,1.0630771863412742,1.0763288491493366)
id <- seq(1,5)

# Creation du dataframe
df <- data.frame(ID = id,Place = nom, X = lon, Y = lat)

# Creation du spatial dataframe
df_sf <- st_as_sf(df,
                  coords = c("X", "Y"),
                  crs = 4326)

# Cartographie de nos points
map1 <- leaflet() %>% 
  addProviderTiles("Esri.WorldImagery") %>% 
  addCircles(data=df_sf, color="red", radius = 100)
map1

2 - Calcul du plus court chemin entre de deux points (distance + temps de parcours)

# Selectionner le premier point
point_1 <- df_sf[2,]
point_2 <- df_sf[3,]

# Calcul du plus court chemin
trajet_1 <- osrmRoute(src = point_1,
          dst = point_2,
          osrm.profile = "foot", returnclass="sf")

map2 <- leaflet() %>% 
  addProviderTiles("Esri.WorldImagery") %>% 
  addCircles(data=df_sf[2:3,], color="red", radius = 100) %>% 
  addPolylines(data=trajet_1, color = "blue")
map2

3 - Calcul d’itinéraire entre plusieurs points (Travelling salesman problem)

# Calcul d'itineraire 
itineraire_1.list <- osrmTrip(df_sf,osrm.profile = "foot", returnclass="sf")
itineraire_1.df <- itineraire_1.list[[1]]$trip

map3 <- leaflet() %>% 
  addProviderTiles("Esri.WorldImagery") %>% 
  addCircles(data=df_sf, color="red", radius = 100) %>% 
  addPolylines(data=itineraire_1.df, color = "blue")
map3
cat('Distance :', round(sum(itineraire_1.df$distance)),'km\nTemps de parcours à pied : ', round(sum(itineraire_1.df$duration)),'minutes')
Distance : 12 km
Temps de parcours à pied :  164 minutes

4 - Calcul d’isochrone

# Calcul d'isochrone 
iso_1 <- osrmIsochrone(loc = point_1,
              breaks = seq(0,30,10),osrm.profile = "foot")
iso_1$foot_time <- paste(iso_1$min, "to", iso_1$max, "min")
pal <- colorFactor("RdYlBu", iso_1$foot_time)

map4 <- leaflet() %>% 
  addProviderTiles("Esri.WorldImagery") %>% 
  addPolygons(data=iso_1, color = ~pal(iso_1$foot_time)) %>% 
  addCircles(data=point_1, color="red", radius = 100) %>% 
  addLegend(position = "bottomright",
            pal = pal, 
            values = iso_1$foot_time,
            title = "Isochrone - Foot time")
map4