Ce site a pour but de référencer un ensemble de données spatiales utilisé dans des analyses spatiales.
Nous souhaitons évaluer l’importance des gares. Nous calculons le degré de centralité pour identifier les gares clés dans le réseau, c’est-à-dire celles ayant le plus grand nombre de connexions directes avec d’autres gares. Les données utilisées dans les scripts suivants proviennent du site Open Data SNCF (consulté le 19 et le 20 février 2024).
En utilisant les données GTFS, Nous cartographions le réseau des gares des Hauts-de-France à partir du fichier stops.txt. Ensuite, grâce au fichier stop_times.txt, nous relions les ID des gares à des trips (passages) spécifiques, indiquant tous les passages de véhicules dans une gare sur une journée. Le fichier trips permet ensuite de relier ces trips aux ID des routes. Chaque routes regroupent plusieurs trips sous une même ligne de service. Finalement, le fichier routes fournit les noms réels des lignes (route_long_name) associés à ces ID de route.
Using GTFS data, we are mapping the network of TER stations in Hauts-de-France from the stops.txt file. Then, leveraging stop_times.txt, we connect station IDs to specific trips—indicating all vehicle passes through a station in a day. The trips file then links these trips to route IDs, grouping multiple trips under a single service line. Finally, routes.txt gives you the actual line names (route_long_name) associated with these route IDs, effectively linking station activities to the broader network of regional public transport lines.
A partir des données GTFS je cherche les ID des gares des Hauts-de-France disponibles dans le fichier stops.txt.
pacman::p_load(dplyr, sf, stringr, igraph, tmap)
# TER
# Étape 1 : Identifier les gares
stops <- read.csv('data/GTFS/export-ter-gtfs-last/stops.txt', header = TRUE)
names(stops)## [1] "stop_id" "stop_name" "stop_desc" "stop_lat"
## [5] "stop_lon" "zone_id" "stop_url" "location_type"
## [9] "parent_station"
## [1] 2499 9
stops_sf <- stops %>%
sf::st_as_sf(coords = c("stop_lon", "stop_lat"), crs = 4326) %>%
st_transform(2154)
mapview::mapview(stops_sf)## Reading layer `REGION' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\data\REGION.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 13 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 99040 ymin: 6046546 xmax: 1242443 ymax: 7110479
## Projected CRS: RGF93 Lambert 93
HDF <- regions %>%
filter(INSEE_REG == 32) # filtre sur les Hauts-de-France
stops_sf_hdf <- sf::st_intersection(stops_sf, HDF)## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries
stops <- stops_sf_hdf %>%
st_drop_geometry()
nom_id <- list()
for( i in 1:nrow(stops)) {
gare_nom <- stops[i,'stop_name']
gare_id <- stops %>%
filter(stop_name == gare_nom)
nom_id[i] <- gare_id$stop_id
}
nom_id <- unlist(nom_id)Étape 2 : Identification des noms des trajets
Le fichier stop_times contient les horaires détaillés des passages des véhicules à chaque arrêt pour chaque trajet. Je peux donc connaître tous les trips sr une journée qui passe dans une gare. Grâce à ce fichier on peut relier les noms des arrêts (stops) aux trips. Une gare peut recevoir un ou plusieurs trips ou passages.
Le fichier trips.txt contient des informations sur les passages (ou “trips”) effectués par des véhicules au sein d’un service de transport public (ex : une gare). Grâce à ce fichier on peut relier les trips au ID des routes. Sachant qu’un ID de routes contient plusieurs trips.
Le fichier routes contient les informations concernant les lignes (ou “routes”) opérées par un service de transport public. Dans ce fichier nous pouvons retrouver le nom des lignes (route_long_name) correspond aux ID trouvés dans le fichier trips.
stop_times <- read.csv('data/GTFS/export-ter-gtfs-last/stop_times.txt', header = TRUE)
trips <- read.csv('data/GTFS/export-ter-gtfs-last/trips.txt', header = TRUE)
routes <- read.csv('data/GTFS/export-ter-gtfs-last/routes.txt', header = TRUE)Exemple pour Albert
## stop_id stop_name stop_desc zone_id stop_url
## 1 StopPoint:OCETrain TER-87313072 Albert NA NA NA
## location_type parent_station ID NOM_M
## 1 0 StopArea:OCE87313072 REGION_FXX_0000000000005 HAUTS-DE-FRANCE
## NOM INSEE_REG
## 1 Hauts-de-France 32
# Ici on filtre sur la gare de Lille Centre Hospotalier Régional
trajets_gare <- stop_times %>% filter(stop_id == 'StopPoint:OCETrain TER-87313072')
# On obtient tous les trains qui s'arrêtent dans cette gare
# head(trajets_gare)
# dim(trajets_gare)
# Chaque train dispo d'un trip_id
trajets_gare <- trajets_gare$trip_id
# Trips
# Grâce à la table Trips on peut retrouver les route_id qui nous permettront de retrouver la route_name de chaque trips
trips_gare <- trips %>%
filter(trip_id %in% trajets_gare)
head(trips_gare)## route_id service_id
## 1 FR:Line::E597DAD9-42BF-4927-BEDB-0B05091BCBBE: 2179
## 2 FR:Line::E597DAD9-42BF-4927-BEDB-0B05091BCBBE: 263
## 3 FR:Line::E597DAD9-42BF-4927-BEDB-0B05091BCBBE: 2179
## 4 FR:Line::E597DAD9-42BF-4927-BEDB-0B05091BCBBE: 263
## 5 FR:Line::E597DAD9-42BF-4927-BEDB-0B05091BCBBE: 263
## 6 FR:Line::E597DAD9-42BF-4927-BEDB-0B05091BCBBE: 2179
## trip_id trip_headsign direction_id block_id
## 1 OCESN843008F2645165:2024-02-17T00:32:45Z 843008 1 19324
## 2 OCESN843008F3063349:2024-02-16T00:32:35Z 843008 1 19325
## 3 OCESN843900F2648247:2024-02-17T00:32:45Z 843900 1 19670
## 4 OCESN843900F3063462:2024-02-16T00:32:35Z 843900 1 19671
## 5 OCESN843901F2696761:2024-02-16T00:32:35Z 843901 0 19672
## 6 OCESN843901F3002913:2024-02-17T00:32:45Z 843901 0 19673
## shape_id
## 1 NA
## 2 NA
## 3 NA
## 4 NA
## 5 NA
## 6 NA
trips_gare <- trips_gare$route_id
# trips_gare
# Étape 3 : Identifier les lignes correspondantes
names(routes)## [1] "route_id" "agency_id" "route_short_name" "route_long_name"
## [5] "route_desc" "route_type" "route_url" "route_color"
## [9] "route_text_color"
lignes_gares <- routes %>%
filter(route_id %in% trips_gare)
# Cette gare dispose de 4 lignes de services
lignes_gares## route_id agency_id route_short_name
## 1 FR:Line::7BB51D2B-5268-45E9-AEEE-1F1053DE381C: 1187 P22
## 2 FR:Line::7BDE293E-0D29-48A4-8978-8ADB3FFEA340: 1187 K45
## 3 FR:Line::B2E5B266-DAE7-4C0A-ABA0-B46411FB2CAA: 1187 K45
## 4 FR:Line::D77B2111-D576-48D5-878E-5D6C094D611A: 1187 P21
## 5 FR:Line::E597DAD9-42BF-4927-BEDB-0B05091BCBBE: 1187 K44
## route_long_name route_desc route_type
## 1 Amiens - Arras NA 2
## 2 Rouen - Lille NA 2
## 3 Lille - Amiens - Abancourt - (Rouen Rive-Droite) NA 2
## 4 Abbeville - Amiens - Albert NA 2
## 5 Lille Flandres - Amiens NA 2
## route_url route_color route_text_color
## 1 NA 006600 FFFFFF
## 2 NA BF005F FFFFFF
## 3 NA BF005F FFFFFF
## 4 NA 006600 FFFFFF
## 5 NA BF005F FFFFFF
## [1] 5
Extraction de toutes les lignes
lignes_gares_nb <- list()
for( i in 1:nrow(stops)) {
trajets_gare <- stop_times %>% filter(stop_id %in% nom_id[i])
head(trajets_gare)
dim(trajets_gare)
trajets_gare <- trajets_gare$trip_id
# Trips
trips_gare <- trips %>%
filter(trip_id %in% trajets_gare)
head(trajets_gare)
dim(trajets_gare)
trips_gare <- trips_gare$route_id
trips_gare
# Étape 3 : Identifier les lignes correspondantes
names(routes)
lignes_gares <- routes %>%
filter(route_id %in% trips_gare)
lignes_gares
nrow(lignes_gares)
lignes_gares_nb[i] <- nrow(lignes_gares)
}
lignes_gares_nb_unlist <- unlist(lignes_gares_nb)
lignes_gares_nb_unlist## [1] 4 3 1 1 1 1 1 1 1 1 2 1 2 2 1 2 1 1 1 1 1 1 15 7 3
## [26] 3 7 3 2 5 3 2 1 7 1 1 2 1 1 1 3 4 2 2 3 3 3 3 1 1
## [51] 1 4 2 3 3 3 2 2 21 1 2 2 3 2 3 1 1 2 2 8 2 4 1 4 1
## [76] 2 1 1 2 2 2 4 1 4 2 2 2 1 4 1 1 1 1 1 2 3 1 2 2 5
## [101] 2 1 3 3 3 2 1 1 3 7 1 1 3 1 3 1 1 2 5 7 4 1 1 4 3
## [126] 3 1 2 5 1 2 1 3 1 1 1 1 1 1 1 7 5 2 5 7 1 1 1 1 1
## [151] 2 2 1 2 1 5 1 3 5 1 1 1 1 1 1 5 1 1 1 1 1 1 2 3 1
## [176] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 7 2 1 17 2 2 2 1 1 1
## [201] 1 1 1 2 1 1 2 4 6 1 2 2 1 2 2 2 2 2 2 2 2 2 8 6 1
## [226] 3 4 3 3 4 1 1 6 10 1 4 1 1 1 1 3 1 1 3 1 1 1 1 3 1
## [251] 1 2 3 1 1 1 4 1 1 2 1 1 1 3 3 3 3 3 1 8 4 1 5 1 1
## [276] 1 1 1 1 10 8 1 2 1 1 1 2 2 2 2 1 2 1 1 2 2 2 2 2 2
## [301] 2 1 1 1 4 1 1 3 1 1 1
Le tableau ci-dessous compte le nombre de lignes qui passent par chacune des gares des Hauts-de-France :
Extraction des edges pour iGraph
# Initialisation de la liste pour les noms de lignes des gares
lignes_gares_names <- list()
# Boucle sur chaque identifiant de gare
for( i in 1:nrow(stops)) {
trajets_gare <- stop_times %>%
filter(stop_id %in% nom_id[i])
head(trajets_gare)
dim(trajets_gare)
trajets_gare <- trajets_gare$trip_id
# Filtrer les trajets par trip_id pour obtenir les route_id correspondants
routes_ids <- trips %>%
filter(trip_id %in% trajets_gare)
head(trajets_gare)
dim(trajets_gare)
routes_ids <- routes_ids$route_id
routes_ids
# Filtrer les lignes/routes par route_id
names(routes)
lignes_gares <- routes %>%
filter(route_id %in% routes_ids)
lignes_gares
nrow(lignes_gares)
# Ajouter les noms des lignes à la liste des noms des gares
lignes_gares_names[[i]] <- lignes_gares$route_long_name
}
# Aplatir la liste en un vecteur unique de noms de lignes
lignes_gares_names <- unlist(lignes_gares_names)
lignes_gares_names <- unique(lignes_gares_names)lignes_gares_names <- c(
"Lille Flandres - Don-Sainghin - Béthune",
"Lille Flandres - Don-Sainghin - Lens",
"Lille Flandres - Béthune",
"PARIS - ST DIZIER",
"PARIS - STRASBOURG",
"Château-Thierry - Reims",
"REIMS - LAON",
"Paris Nord - Laon",
"Crépy-En-Valois - Laon",
"Compiègne - Paris", # Ici j'ai ajouté un tiret
"Paris Nord - Beauvais",
"Saint-Quentin - Compiègne",
"Paris Nord - Creil - Longueau - Arras - Douai - Lille Flandres",
"Paris Nord - Amiens",
"Paris Nord - Saint-Quentin",
"Paris Nord - Compiègne",
"Paris Nord - Maubeuge - Cambrai",
"Paris Nord - Longueau-Amiens", # Ici j'ai ajouté un espace juste avant Longueau
"Paris Nord - Creil - Saint-Just-En-Chaussée",
"Beauvais - Creil",
"Amiens - Creil",
"Paris Nord - Creil",
"Calais - Paris", # Ici j'ai ajouté un tiret
"Amiens - Compiègne",
"Arras - Dunkerque Ter Et Tgv Autorisés",
"Lille Flandres - Dunkerque",
"Dunkerque - Hazebrouck",
"Calais Ville - Dunkerque",
"Lille Flandres - Courtrai",
"Lille Flandres - Tourcoing Y Compris Tgv Autorisés",
"Calais Ville - Amiens", # Retrait tiret avant ville
"Calais Ville - Rang-Du-Fliers - Verton - Berck",
"Calais Ville - Hazebrouck",
"Calais Ville - Arras",
"Lille Flandres - Saint-Omer - Calais Ville",
"Lille Flandres - St Quentin",
"Lille Flandres - Hazebrouck",
"Rouen - Lille",
"Charleville - Lille",
"Lille Flandres - Valenciennes",
"Lille - Amiens - Abancourt - (Rouen Rive-Droite)",
"Lille Flandres - Douai",
"Lille Flandres - Hirson - (Charleville- Mézières)",
"Lille Flandres - Amiens",
"Lille Flandres - Maubeuge - Jeumont",
"Lille Flandres - Libercourt - Lens",
"Lille Flandres - Baisieux - (Tournai)",
"Hazebrouck - Arras",
"Valenciennes - Jeumont",
"(Namur) - (Charleroi) - Maubeuge",
"Aulnoye - Aymeries - Saint-Quentin",
"Aulnoye - Aymeries - Hirson",
"Amiens - Saint-Quentin",
"Douai - Saint-Quentin",
"Amiens - Tergnier - Laon",
"Amiens - Arras",
"Abbeville - Amiens - Albert",
"Amiens - Abancourt - (Rouen Rive-Droite)",
"Amiens - Abancourt",
"Rouen - Amiens",
"Beauvais - Abancourt - Le Tréport",
"Arras/Béthune - St-Pol-Sur-Ternoise - Etaples",
"Lens - Béthune - St-Pol-sur Ternoise",
"Arras - Douai",
"Douai - Valenciennes",
"Valenciennes - Cambrai",
"Lens - Douai",
"Serqueux - Gisors") # Ici j'ai ajouté deux esapces entre le tiretlignes_gares_names est composé du nom des lignes dans les Hauts-de-France. Nous constatons qu’il existe des noms de lignes disposant de gares intermédiaires, exemple : “Lille Flandres - Don-Sainghin - Lens”. Nous décidons de supprimer les gares intermédiaires pour ne laisser apparaître que les gares situées en bout de ligne.
# Initialiser un vecteur vide pour stocker les résultats
lignes_simplifiees <- vector("character", length = length(lignes_gares_names))
# Boucle pour traiter chaque nom de ligne
for(i in seq_along(lignes_gares_names)) {
nom <- lignes_gares_names[i]
parties <- str_split(nom, pattern = " - ", simplify = FALSE)[[1]]
debut_fin <- c(parties[1], tail(parties, 1))
lignes_simplifiees[i] <- str_c(debut_fin, collapse = " - ")
}
# Afficher les résultats
print(lignes_simplifiees)## [1] "Lille Flandres - Béthune"
## [2] "Lille Flandres - Lens"
## [3] "Lille Flandres - Béthune"
## [4] "PARIS - ST DIZIER"
## [5] "PARIS - STRASBOURG"
## [6] "Château-Thierry - Reims"
## [7] "REIMS - LAON"
## [8] "Paris Nord - Laon"
## [9] "Crépy-En-Valois - Laon"
## [10] "Compiègne - Paris"
## [11] "Paris Nord - Beauvais"
## [12] "Saint-Quentin - Compiègne"
## [13] "Paris Nord - Lille Flandres"
## [14] "Paris Nord - Amiens"
## [15] "Paris Nord - Saint-Quentin"
## [16] "Paris Nord - Compiègne"
## [17] "Paris Nord - Cambrai"
## [18] "Paris Nord - Longueau-Amiens"
## [19] "Paris Nord - Saint-Just-En-Chaussée"
## [20] "Beauvais - Creil"
## [21] "Amiens - Creil"
## [22] "Paris Nord - Creil"
## [23] "Calais - Paris"
## [24] "Amiens - Compiègne"
## [25] "Arras - Dunkerque Ter Et Tgv Autorisés"
## [26] "Lille Flandres - Dunkerque"
## [27] "Dunkerque - Hazebrouck"
## [28] "Calais Ville - Dunkerque"
## [29] "Lille Flandres - Courtrai"
## [30] "Lille Flandres - Tourcoing Y Compris Tgv Autorisés"
## [31] "Calais Ville - Amiens"
## [32] "Calais Ville - Berck"
## [33] "Calais Ville - Hazebrouck"
## [34] "Calais Ville - Arras"
## [35] "Lille Flandres - Calais Ville"
## [36] "Lille Flandres - St Quentin"
## [37] "Lille Flandres - Hazebrouck"
## [38] "Rouen - Lille"
## [39] "Charleville - Lille"
## [40] "Lille Flandres - Valenciennes"
## [41] "Lille - (Rouen Rive-Droite)"
## [42] "Lille Flandres - Douai"
## [43] "Lille Flandres - (Charleville- Mézières)"
## [44] "Lille Flandres - Amiens"
## [45] "Lille Flandres - Jeumont"
## [46] "Lille Flandres - Lens"
## [47] "Lille Flandres - (Tournai)"
## [48] "Hazebrouck - Arras"
## [49] "Valenciennes - Jeumont"
## [50] "(Namur) - Maubeuge"
## [51] "Aulnoye - Saint-Quentin"
## [52] "Aulnoye - Hirson"
## [53] "Amiens - Saint-Quentin"
## [54] "Douai - Saint-Quentin"
## [55] "Amiens - Laon"
## [56] "Amiens - Arras"
## [57] "Abbeville - Albert"
## [58] "Amiens - (Rouen Rive-Droite)"
## [59] "Amiens - Abancourt"
## [60] "Rouen - Amiens"
## [61] "Beauvais - Le Tréport"
## [62] "Arras/Béthune - Etaples"
## [63] "Lens - St-Pol-sur Ternoise"
## [64] "Arras - Douai"
## [65] "Douai - Valenciennes"
## [66] "Valenciennes - Cambrai"
## [67] "Lens - Douai"
## [68] "Serqueux - Gisors"
# Création du nouveau vecteur simplifié
lignes_simplifiees <- c("Lille Flandres - Béthune",
"Lille Flandres - Lens" ,
"Lille Flandres - Béthune",
"PARIS - ST DIZIER" ,
"PARIS - STRASBOURG" ,
"Château-Thierry - Reims" ,
"REIMS - LAON" ,
"Paris Nord - Laon" ,
"Crépy-En-Valois - Laon" ,
"Compiègne - Paris",
"Paris Nord - Beauvais" ,
"Saint-Quentin - Compiègne" ,
"Paris Nord - Lille Flandres" ,
"Paris Nord - Amiens" ,
"Paris Nord - Saint-Quentin" ,
"Paris Nord - Compiègne" ,
"Paris Nord - Cambrai" ,
"Paris Nord - Longueau-Amiens", # Modification manuelle
"Paris Nord - Saint-Just-En-Chaussée" ,
"Beauvais - Creil" ,
"Amiens - Creil" ,
"Paris Nord - Creil" ,
"Calais - Paris" ,
"Amiens - Compiègne" ,
"Arras - Dunkerque Ter Et Tgv Autorisés",
"Lille Flandres - Dunkerque" ,
"Dunkerque - Hazebrouck" ,
"Calais Ville - Dunkerque" ,
"Lille Flandres - Courtrai" ,
"Lille Flandres - Tourcoing Y Compris Tgv Autorisés" ,
"Calais Ville - Amiens" ,
"Calais Ville - Berck" ,
"Calais Ville - Hazebrouck" ,
"Calais Ville - Arras" ,
"Lille Flandres - Calais Ville" ,
"Lille Flandres - St Quentin" ,
"Lille Flandres - Hazebrouck" ,
"Rouen - Lille" ,
"Charleville - Lille" ,
"Lille Flandres - Valenciennes" ,
"Lille - (Rouen Rive-Droite)" ,
"Lille Flandres - Douai" ,
"Lille Flandres - (Charleville- Mézières)" ,
"Lille Flandres - Amiens" ,
"Lille Flandres - Jeumont" ,
"Lille Flandres - Lens" ,
"Lille Flandres - (Tournai)" ,
"Hazebrouck - Arras" ,
"Valenciennes - Jeumont" ,
"(Namur) - Maubeuge" ,
"Aulnoye - Saint-Quentin" ,
"Aulnoye - Hirson" ,
"Amiens - Saint-Quentin" ,
"Douai - Saint-Quentin" ,
"Amiens - Laon" ,
"Amiens - Arras" ,
"Abbeville - Albert" ,
"Amiens - (Rouen Rive-Droite)" ,
"Amiens - Abancourt" ,
"Rouen - Amiens" ,
"Beauvais - Le Tréport" ,
"Arras/Béthune - Etaples" ,
"Lens - St-Pol-sur Ternoise" ,
"Arras - Douai" ,
"Douai - Valenciennes" ,
"Valenciennes - Cambrai" ,
"Lens - Douai" ,
"Serqueux - Gisors") # modification manuelle
# Créer un data frame à partir du vecteur en séparant les gares de départ et d'arrivée
df_gares <- data.frame(
GareDepart = sapply(lignes_simplifiees, function(x) strsplit(x, " - ")[[1]][1]),
GareArrivee = sapply(lignes_simplifiees, function(x) {
parts <- strsplit(x, " - ")[[1]]
if(length(parts) >= 2) return(tail(parts, n = 1))
else return(parts[1])
})
)
# Afficher le data frame résultant
print(df_gares)## GareDepart GareArrivee
## 1 Lille Flandres Béthune
## 2 Lille Flandres Lens
## 3 Lille Flandres Béthune
## 4 PARIS ST DIZIER
## 5 PARIS STRASBOURG
## 6 Château-Thierry Reims
## 7 REIMS LAON
## 8 Paris Nord Laon
## 9 Crépy-En-Valois Laon
## 10 Compiègne Paris
## 11 Paris Nord Beauvais
## 12 Saint-Quentin Compiègne
## 13 Paris Nord Lille Flandres
## 14 Paris Nord Amiens
## 15 Paris Nord Saint-Quentin
## 16 Paris Nord Compiègne
## 17 Paris Nord Cambrai
## 18 Paris Nord Longueau-Amiens
## 19 Paris Nord Saint-Just-En-Chaussée
## 20 Beauvais Creil
## 21 Amiens Creil
## 22 Paris Nord Creil
## 23 Calais Paris
## 24 Amiens Compiègne
## 25 Arras Dunkerque Ter Et Tgv Autorisés
## 26 Lille Flandres Dunkerque
## 27 Dunkerque Hazebrouck
## 28 Calais Ville Dunkerque
## 29 Lille Flandres Courtrai
## 30 Lille Flandres Tourcoing Y Compris Tgv Autorisés
## 31 Calais Ville Amiens
## 32 Calais Ville Berck
## 33 Calais Ville Hazebrouck
## 34 Calais Ville Arras
## 35 Lille Flandres Calais Ville
## 36 Lille Flandres St Quentin
## 37 Lille Flandres Hazebrouck
## 38 Rouen Lille
## 39 Charleville Lille
## 40 Lille Flandres Valenciennes
## 41 Lille (Rouen Rive-Droite)
## 42 Lille Flandres Douai
## 43 Lille Flandres (Charleville- Mézières)
## 44 Lille Flandres Amiens
## 45 Lille Flandres Jeumont
## 46 Lille Flandres Lens
## 47 Lille Flandres (Tournai)
## 48 Hazebrouck Arras
## 49 Valenciennes Jeumont
## 50 (Namur) Maubeuge
## 51 Aulnoye Saint-Quentin
## 52 Aulnoye Hirson
## 53 Amiens Saint-Quentin
## 54 Douai Saint-Quentin
## 55 Amiens Laon
## 56 Amiens Arras
## 57 Abbeville Albert
## 58 Amiens (Rouen Rive-Droite)
## 59 Amiens Abancourt
## 60 Rouen Amiens
## 61 Beauvais Le Tréport
## 62 Arras/Béthune Etaples
## 63 Lens St-Pol-sur Ternoise
## 64 Arras Douai
## 65 Douai Valenciennes
## 66 Valenciennes Cambrai
## 67 Lens Douai
## 68 Serqueux Gisors
Ensuite, il faut extraire les lignes TGV
pacman::p_load(dplyr, sf, stringr, igraph)
# TGV
# Étape 1 : Identifier la Gare d'Intérêt
stops <- read.csv('data/GTFS/export_gtfs_voyages/stops.txt', header = TRUE)
names(stops)## [1] "stop_id" "stop_name" "stop_desc" "stop_lat"
## [5] "stop_lon" "zone_id" "stop_url" "location_type"
## [9] "parent_station"
stops <- stops %>%
filter(grepl('TGV', stop_id))
# dim(stops)
stops_sf <- stops %>%
sf::st_as_sf(coords = c("stop_lon", "stop_lat"), crs = 4326) %>%
st_transform(2154)
mapview::mapview(stops_sf)## Reading layer `REGION' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\data\REGION.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 13 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 99040 ymin: 6046546 xmax: 1242443 ymax: 7110479
## Projected CRS: RGF93 Lambert 93
HDF <- regions %>%
filter(INSEE_REG == 32) # filtre sur les Hauts-de-France
stops_sf_hdf <- sf::st_intersection(stops_sf, HDF)## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries
stops <- stops_sf_hdf %>%
st_drop_geometry()
nom_id <- list()
for( i in 1:nrow(stops)) {
gare_nom <- stops[i,'stop_name']
gare_id <- stops %>%
filter(stop_name == gare_nom)
nom_id[i] <- gare_id$stop_id
}
nom_id <- unlist(nom_id)
# print(nom_id)# Étape 2 : Trouver les trajets passant par les gares
stop_times <- read.csv('data/GTFS/export_gtfs_voyages/stop_times.txt', header = TRUE)
trips <- read.csv('data/GTFS/export_gtfs_voyages/trips.txt', header = TRUE)
routes <- read.csv('data/GTFS/export_gtfs_voyages/routes.txt', header = TRUE)Extraction de toutes les lignes
lignes_gares_nb <- list()
for( i in 1:nrow(stops)) {
trajets_gare <- stop_times %>% filter(stop_id %in% nom_id[i])
head(trajets_gare)
dim(trajets_gare)
trajets_gare <- trajets_gare$trip_id
# Trips
trips_gare <- trips %>%
filter(trip_id %in% trajets_gare)
head(trajets_gare)
dim(trajets_gare)
trips_gare <- trips_gare$route_id
trips_gare
# Étape 3 : Identifier les lignes correspondantes
names(routes)
lignes_gares <- routes %>%
filter(route_id %in% trips_gare)
lignes_gares
nrow(lignes_gares)
lignes_gares_nb[i] <- nrow(lignes_gares)
}
lignes_gares_nb_unlist <- unlist(lignes_gares_nb)
lignes_gares_nb_unlist## [1] 10 2 2 6 1 1 1 1 6 1 1 1 2 1 8 1 6 2
Le tableau ci-dessous compte le nombre de lignes qui passent par chacune des gares des Hauts-de-France :
## stops.stop_name lignes_gares_nb_unlist
## 1 Lille Europe 10
## 2 Dunkerque 2
## 3 Calais - Fréthun 2
## 4 Lille Flandres 6
## 5 Hazebrouck 1
## 6 Tourcoing 1
## 7 Croix - Wasquehal 1
## 8 Roubaix 1
## 9 TGV Haute Picardie 6
## 10 Rang-du-Fliers - Verton - Berck 1
## 11 Étaples - Le Touquet 1
## 12 Calais Ville 1
## 13 Boulogne sur Mer 2
## 14 Béthune 1
## 15 Arras 8
## 16 Valenciennes 1
## 17 Douai 6
## 18 Lens 2
Extraction des edges pour iGraph
# Initialisation de la liste pour les noms de lignes des gares
lignes_gares_names <- list()
# Boucle sur chaque identifiant de gare
for( i in 1:nrow(stops)) {
trajets_gare <- stop_times %>%
filter(stop_id %in% nom_id[i])
head(trajets_gare)
dim(trajets_gare)
trajets_gare <- trajets_gare$trip_id
# Filtrer les trajets par trip_id pour obtenir les route_id correspondants
routes_ids <- trips %>%
filter(trip_id %in% trajets_gare)
head(trajets_gare)
dim(trajets_gare)
routes_ids <- routes_ids$route_id
routes_ids
# Filtrer les lignes/routes par route_id
names(routes)
lignes_gares <- routes %>%
filter(route_id %in% routes_ids)
lignes_gares
nrow(lignes_gares)
# Ajouter les noms des lignes à la liste des noms des gares
lignes_gares_names[[i]] <- lignes_gares$route_long_name
}
# Aplatir la liste en un vecteur unique de noms de lignes
lignes_gares_names <- unlist(lignes_gares_names)
lignes_gares_names <- unique(lignes_gares_names)
# Afficher les noms uniques des lignes de gare
print(lignes_gares_names)## [1] "Lille - Alpes TGV" "Paris - Dunkerque par Bassin Minier"
## [3] "Nord - Bretagne TGV" "Strasbourg - Bruxelles"
## [5] "Lille Lyon TGV" "Paris - Littoral"
## [7] "Lille - Mediterranee TGV" "Paris - Lille - Dunkerque"
## [9] "Nord - Pays de la Loire TGV" "Nord Aquitaine TGV"
## [11] "Paris - Lille" "Paris - Valenciennes"
df_gares_tgv <- lignes_gares_names
df_gares_tgv <- c("Lille - Alpes TGV", "Paris - Dunkerque par Bassin Minier",
"Nord - Bretagne TGV", "Strasbourg - Bruxelles",
"Lille - Lyon TGV", # ici j'ai ajouté un tiret entre Lille et Lyon TGV
"Paris - Littoral")
# Transformer le vecteur en dataframe avec deux colonnes : GareDepart et GareArrivee
df_gares_tgv_df <- data.frame(
GareDepart = sapply(df_gares_tgv, function(x) strsplit(x, " - ")[[1]][1]),
GareArrivee = sapply(df_gares_tgv, function(x) {
split <- strsplit(x, " - ")
if (length(split[[1]]) > 1) return(split[[1]][2])
else return(NA) # Retourne NA si aucune gare d'arrivée n'est trouvée
})
)
# Afficher le résultat
print(df_gares_tgv_df)## GareDepart GareArrivee
## Lille - Alpes TGV Lille Alpes TGV
## Paris - Dunkerque par Bassin Minier Paris Dunkerque par Bassin Minier
## Nord - Bretagne TGV Nord Bretagne TGV
## Strasbourg - Bruxelles Strasbourg Bruxelles
## Lille - Lyon TGV Lille Lyon TGV
## Paris - Littoral Paris Littoral
Ensuite il faut les lignes OUIGO :
pacman::p_load(dplyr, sf, stringr, igraph)
# TGV
# Étape 1 : Identifier la Gare d'Intérêt
stops <- read.csv('data/GTFS/export_gtfs_voyages/stops.txt', header = TRUE)
names(stops)## [1] "stop_id" "stop_name" "stop_desc" "stop_lat"
## [5] "stop_lon" "zone_id" "stop_url" "location_type"
## [9] "parent_station"
## [1] 49 9
stops_sf <- stops %>%
sf::st_as_sf(coords = c("stop_lon", "stop_lat"), crs = 4326) %>%
st_transform(2154)
mapview::mapview(stops_sf)## Reading layer `REGION' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\data\REGION.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 13 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 99040 ymin: 6046546 xmax: 1242443 ymax: 7110479
## Projected CRS: RGF93 Lambert 93
HDF <- regions %>%
filter(INSEE_REG == 32) # filtre sur les Hauts-de-France
stops_sf_hdf <- sf::st_intersection(stops_sf, HDF)## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries
stops <- stops_sf_hdf %>%
st_drop_geometry()
nom_id <- list()
for( i in 1:nrow(stops)) {
gare_nom <- stops[i,'stop_name']
gare_id <- stops %>%
filter(stop_name == gare_nom)
nom_id[i] <- gare_id$stop_id
}
nom_id <- unlist(nom_id)
print(nom_id)## [1] "StopPoint:OCEOUIGO-87286005" "StopPoint:OCEOUIGO-87286542"
## [3] "StopPoint:OCEOUIGO-87313882"
# Étape 2 : Trouver les trajets passant par les gares
stop_times <- read.csv('data/GTFS/export_gtfs_voyages/stop_times.txt', header = TRUE)
trips <- read.csv('data/GTFS/export_gtfs_voyages/trips.txt', header = TRUE)
routes <- read.csv('data/GTFS/export_gtfs_voyages/routes.txt', header = TRUE)Extraction de toutes les lignes
lignes_gares_nb <- list()
for( i in 1:nrow(stops)) {
trajets_gare <- stop_times %>% filter(stop_id %in% nom_id[i])
head(trajets_gare)
dim(trajets_gare)
trajets_gare <- trajets_gare$trip_id
# Trips
trips_gare <- trips %>%
filter(trip_id %in% trajets_gare)
head(trajets_gare)
dim(trajets_gare)
trips_gare <- trips_gare$route_id
trips_gare
# Étape 3 : Identifier les lignes correspondantes
names(routes)
lignes_gares <- routes %>%
filter(route_id %in% trips_gare)
lignes_gares
nrow(lignes_gares)
lignes_gares_nb[i] <- nrow(lignes_gares)
}
lignes_gares_nb_unlist <- unlist(lignes_gares_nb)
lignes_gares_nb_unlist## [1] 2 2 2
Le tableau ci-dessous compte le nombre de lignes qui passent par chacune des gares des Hauts-de-France :
## stops.stop_name lignes_gares_nb_unlist
## 1 Lille Flandres 2
## 2 Tourcoing 2
## 3 TGV Haute Picardie 2
Extraction des edges pour iGraph
# Initialisation de la liste pour les noms de lignes des gares
lignes_gares_names <- list()
# Boucle sur chaque identifiant de gare
for( i in 1:nrow(stops)) {
trajets_gare <- stop_times %>%
filter(stop_id %in% nom_id[i])
head(trajets_gare)
dim(trajets_gare)
trajets_gare <- trajets_gare$trip_id
# Filtrer les trajets par trip_id pour obtenir les route_id correspondants
routes_ids <- trips %>%
filter(trip_id %in% trajets_gare)
head(trajets_gare)
dim(trajets_gare)
routes_ids <- routes_ids$route_id
routes_ids
# Filtrer les lignes/routes par route_id
names(routes)
lignes_gares <- routes %>%
filter(route_id %in% routes_ids)
lignes_gares
nrow(lignes_gares)
# Ajouter les noms des lignes à la liste des noms des gares
lignes_gares_names[[i]] <- lignes_gares$route_long_name
}
# Aplatir la liste en un vecteur unique de noms de lignes
lignes_gares_names <- unlist(lignes_gares_names)
lignes_gares_names <- unique(lignes_gares_names)
# Afficher les noms uniques des lignes de gare
print(lignes_gares_names)## [1] "Bordeaux - Lille SEA" "IS Nord Sud"
df_gares_ouigo <- lignes_gares_names
df_gares_ouigo <- c('Bordeaux - Lille SEA" "IS Nord Sud')
# Transformer le vecteur en dataframe avec deux colonnes : GareDepart et GareArrivee
df_gares_ouigo <- data.frame(
GareDepart = sapply(df_gares_ouigo, function(x) strsplit(x, " - ")[[1]][1]),
GareArrivee = sapply(df_gares_ouigo, function(x) {
split <- strsplit(x, " - ")
if (length(split[[1]]) > 1) return(split[[1]][2])
else return(NA) # Retourne NA si aucune gare d'arrivée n'est trouvée
})
)
# Afficher le résultat
print(df_gares_ouigo)## GareDepart GareArrivee
## Bordeaux - Lille SEA" "IS Nord Sud Bordeaux Lille SEA" "IS Nord Sud
## GareDepart GareArrivee
## 1 Lille Flandres Béthune
## 2 Lille Flandres Lens
## 3 Lille Flandres Béthune
## 4 PARIS ST DIZIER
## 5 PARIS STRASBOURG
## 6 Château-Thierry Reims
## 7 REIMS LAON
## 8 Paris Nord Laon
## 9 Crépy-En-Valois Laon
## 10 Compiègne Paris
## 11 Paris Nord Beauvais
## 12 Saint-Quentin Compiègne
## 13 Paris Nord Lille Flandres
## 14 Paris Nord Amiens
## 15 Paris Nord Saint-Quentin
## 16 Paris Nord Compiègne
## 17 Paris Nord Cambrai
## 18 Paris Nord Longueau-Amiens
## 19 Paris Nord Saint-Just-En-Chaussée
## 20 Beauvais Creil
## 21 Amiens Creil
## 22 Paris Nord Creil
## 23 Calais Paris
## 24 Amiens Compiègne
## 25 Arras Dunkerque Ter Et Tgv Autorisés
## 26 Lille Flandres Dunkerque
## 27 Dunkerque Hazebrouck
## 28 Calais Ville Dunkerque
## 29 Lille Flandres Courtrai
## 30 Lille Flandres Tourcoing Y Compris Tgv Autorisés
## 31 Calais Ville Amiens
## 32 Calais Ville Berck
## 33 Calais Ville Hazebrouck
## 34 Calais Ville Arras
## 35 Lille Flandres Calais Ville
## 36 Lille Flandres St Quentin
## 37 Lille Flandres Hazebrouck
## 38 Rouen Lille
## 39 Charleville Lille
## 40 Lille Flandres Valenciennes
## 41 Lille (Rouen Rive-Droite)
## 42 Lille Flandres Douai
## 43 Lille Flandres (Charleville- Mézières)
## 44 Lille Flandres Amiens
## 45 Lille Flandres Jeumont
## 46 Lille Flandres Lens
## 47 Lille Flandres (Tournai)
## 48 Hazebrouck Arras
## 49 Valenciennes Jeumont
## 50 (Namur) Maubeuge
## 51 Aulnoye Saint-Quentin
## 52 Aulnoye Hirson
## 53 Amiens Saint-Quentin
## 54 Douai Saint-Quentin
## 55 Amiens Laon
## 56 Amiens Arras
## 57 Abbeville Albert
## 58 Amiens (Rouen Rive-Droite)
## 59 Amiens Abancourt
## 60 Rouen Amiens
## 61 Beauvais Le Tréport
## 62 Arras/Béthune Etaples
## 63 Lens St-Pol-sur Ternoise
## 64 Arras Douai
## 65 Douai Valenciennes
## 66 Valenciennes Cambrai
## 67 Lens Douai
## 68 Serqueux Gisors
## GareDepart GareArrivee
## 1 Lille Alpes TGV
## 2 Paris Dunkerque par Bassin Minier
## 3 Nord Bretagne TGV
## 4 Strasbourg Bruxelles
## 5 Lille Lyon TGV
## 6 Paris Littoral
## GareDepart GareArrivee
## 1 Bordeaux Lille SEA" "IS Nord Sud
df_gares <- rbind(df_gares_ter,
df_gares_tgv_df,
df_gares_ouigo)
# Supprimer les lignes avec des valeurs manquantes dans les colonnes de coordonnées
df_gares <- df_gares %>%
filter(!is.na(GareDepart) & !is.na(GareArrivee))
print(df_gares)## GareDepart GareArrivee
## 1 Lille Flandres Béthune
## 2 Lille Flandres Lens
## 3 Lille Flandres Béthune
## 4 PARIS ST DIZIER
## 5 PARIS STRASBOURG
## 6 Château-Thierry Reims
## 7 REIMS LAON
## 8 Paris Nord Laon
## 9 Crépy-En-Valois Laon
## 10 Compiègne Paris
## 11 Paris Nord Beauvais
## 12 Saint-Quentin Compiègne
## 13 Paris Nord Lille Flandres
## 14 Paris Nord Amiens
## 15 Paris Nord Saint-Quentin
## 16 Paris Nord Compiègne
## 17 Paris Nord Cambrai
## 18 Paris Nord Longueau-Amiens
## 19 Paris Nord Saint-Just-En-Chaussée
## 20 Beauvais Creil
## 21 Amiens Creil
## 22 Paris Nord Creil
## 23 Calais Paris
## 24 Amiens Compiègne
## 25 Arras Dunkerque Ter Et Tgv Autorisés
## 26 Lille Flandres Dunkerque
## 27 Dunkerque Hazebrouck
## 28 Calais Ville Dunkerque
## 29 Lille Flandres Courtrai
## 30 Lille Flandres Tourcoing Y Compris Tgv Autorisés
## 31 Calais Ville Amiens
## 32 Calais Ville Berck
## 33 Calais Ville Hazebrouck
## 34 Calais Ville Arras
## 35 Lille Flandres Calais Ville
## 36 Lille Flandres St Quentin
## 37 Lille Flandres Hazebrouck
## 38 Rouen Lille
## 39 Charleville Lille
## 40 Lille Flandres Valenciennes
## 41 Lille (Rouen Rive-Droite)
## 42 Lille Flandres Douai
## 43 Lille Flandres (Charleville- Mézières)
## 44 Lille Flandres Amiens
## 45 Lille Flandres Jeumont
## 46 Lille Flandres Lens
## 47 Lille Flandres (Tournai)
## 48 Hazebrouck Arras
## 49 Valenciennes Jeumont
## 50 (Namur) Maubeuge
## 51 Aulnoye Saint-Quentin
## 52 Aulnoye Hirson
## 53 Amiens Saint-Quentin
## 54 Douai Saint-Quentin
## 55 Amiens Laon
## 56 Amiens Arras
## 57 Abbeville Albert
## 58 Amiens (Rouen Rive-Droite)
## 59 Amiens Abancourt
## 60 Rouen Amiens
## 61 Beauvais Le Tréport
## 62 Arras/Béthune Etaples
## 63 Lens St-Pol-sur Ternoise
## 64 Arras Douai
## 65 Douai Valenciennes
## 66 Valenciennes Cambrai
## 67 Lens Douai
## 68 Serqueux Gisors
## 69 Lille Alpes TGV
## 70 Paris Dunkerque par Bassin Minier
## 71 Nord Bretagne TGV
## 72 Strasbourg Bruxelles
## 73 Lille Lyon TGV
## 74 Paris Littoral
## 75 Bordeaux Lille SEA" "IS Nord Sud
Enfin on crée un objet qui montre le nombre de connexions directes pour chacune gares situées en bout de ligne.
# Création du graphe
g <- igraph::graph_from_data_frame(df_gares,
directed = FALSE # Cet argument spécifie que le graphe créé est non dirigé. Dans un graphe non dirigé, les arêtes n'ont pas de direction, ce qui signifie que la relation entre deux nœuds est bidirectionnelle.
)On peut donc lire que Lille Flandres possède 17 connexions directes avec d’autres gares de la région Hauts-de-France.
## Lille Flandres Amiens
## 17 11
## Paris Nord Calais Ville
## 10 6
## Saint-Quentin Arras
## 5 5
## Lille Douai
## 5 5
## Compiègne Hazebrouck
## 4 4
## Valenciennes Lens
## 4 4
## Paris Beauvais
## 4 3
## Dunkerque Laon
## 3 3
## Creil PARIS
## 3 2
## Rouen Aulnoye
## 2 2
## Béthune Cambrai
## 2 2
## (Rouen Rive-Droite) Jeumont
## 2 2
## Château-Thierry REIMS
## 1 1
## Crépy-En-Valois Calais
## 1 1
## Charleville (Namur)
## 1 1
## Abbeville Arras/Béthune
## 1 1
## Serqueux Nord
## 1 1
## Strasbourg Bordeaux
## 1 1
## ST DIZIER STRASBOURG
## 1 1
## Reims LAON
## 1 1
## Longueau-Amiens Saint-Just-En-Chaussée
## 1 1
## Dunkerque Ter Et Tgv Autorisés Courtrai
## 1 1
## Tourcoing Y Compris Tgv Autorisés Berck
## 1 1
## St Quentin (Charleville- Mézières)
## 1 1
## (Tournai) Maubeuge
## 1 1
## Hirson Albert
## 1 1
## Abancourt Le Tréport
## 1 1
## Etaples St-Pol-sur Ternoise
## 1 1
## Gisors Alpes TGV
## 1 1
## Dunkerque par Bassin Minier Bretagne TGV
## 1 1
## Bruxelles Lyon TGV
## 1 1
## Littoral Lille SEA" "IS Nord Sud
## 1 1
Ce script fournit donc une méthodologie pour le traitement, la visualisation et l’analyse de données spatiales complexes, en se concentrant sur la compréhension de la structure et de l’importance des composantes d’un réseau ferroviaire.
Objectifs Généraux du Script :
* Analyser la structure du réseau ferroviaire : En fusionnant les
segments de ligne et en extrayant les points terminaux, le script
simplifie la représentation du réseau pour faciliter l’analyse.
* Visualiser les données spatiales : nous utilisons mapview
pour montrer les lignes ferroviaires, leurs points terminaux, et les
gares, aidant à comprendre visuellement la disposition spatiale.
* Évaluer l’importance des gares : Calcule la centralité de degré pour
identifier les gares clés dans le réseau, c’est-à-dire celles ayant le
plus grand nombre de connexions directes avec d’autres gares.
Note : Ici, je ne prends pas en compte l’ensemble des lignes en service sur l’infrastructure ferroviaire. Je me contente de compter les points terminaux de chaque ligne d’un point de vue de l’infrastructure.
if (!requireNamespace("pacman", quietly = TRUE)) install.packages("pacman")
pacman::p_load(sf, igraph, dplyr, mapview)# Chargemnent des données
reseau <- sf::st_read('data/reseau_ferroviaire — reseau_ferroviaire_13062022_17h00 _ HDF.gpkg')## Reading layer `reseau_ferroviaire — reseau_ferroviaire_13062022_17h00 _ HDF' from data source `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\data\reseau_ferroviaire — reseau_ferroviaire_13062022_17h00 _ HDF.gpkg'
## using driver `GPKG'
## Simple feature collection with 141 features and 7 fields
## Geometry type: MULTILINESTRING
## Dimension: XY
## Bounding box: xmin: 584284.5 ymin: 6870453 xmax: 787929.8 ymax: 7109041
## Projected CRS: RGF93 v1 / Lambert-93
## [1] "id" "code_ligne" "rg_troncon" "pk_debut_r"
## [5] "pk_fin_r" "mnemo" "infrastructure" "geom"
## Simple feature collection with 4 features and 7 fields
## Geometry type: MULTILINESTRING
## Dimension: XY
## Bounding box: xmin: 652369.1 ymin: 7031217 xmax: 706423.8 ymax: 7059863
## Projected CRS: RGF93 v1 / Lambert-93
## id code_ligne rg_troncon pk_debut_r pk_fin_r mnemo infrastructure
## 1 252 289000 0 18+710 40+631 DV Double voie électrifiée
## 2 296 289000 0 0+021 18+710 DV Double voie électrifiée
## 3 280 289000 1 44+882 73+480 VU Voie unique électrifiée
## 4 281 289000 1 40+631 44+882 DV Double voie
## geom
## 1 MULTILINESTRING ((674761.5 ...
## 2 MULTILINESTRING ((694102.2 ...
## 3 MULTILINESTRING ((652369.1 ...
## 4 MULTILINESTRING ((670679.6 ...
## [1] 141
# Fusionner les segments ayant le même code_ligne
ligne_fusionnee <- reseau %>%
group_by(code_ligne) %>%
summarise(geom = st_union(geom)) %>%
ungroup()
nrow(ligne_fusionnee)## [1] 92
## Simple feature collection with 1 feature and 1 field
## Geometry type: MULTILINESTRING
## Dimension: XY
## Bounding box: xmin: 652369.1 ymin: 7031217 xmax: 706423.8 ymax: 7059863
## Projected CRS: RGF93 v1 / Lambert-93
## # A tibble: 1 × 2
## code_ligne geom
## <chr> <MULTILINESTRING [m]>
## 1 289000 ((674761.5 7046989, 674904.8 7046911, 674984.5 7046870, 675134.1 7…
## [1] 92
## Reading layer `gares_HDF_2154' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\data\gares_HDF_2154.gpkg'
## using driver `GPKG'
## Simple feature collection with 393 features and 65 fields
## Geometry type: MULTIPOINT
## Dimension: XY
## Bounding box: xmin: 595141.4 ymin: 6874373 xmax: 781232.5 ymax: 7108435
## Projected CRS: RGF93 v1 / Lambert-93
## [1] 393
# =======================
lignes <- ligne_fusionnee
# Extraire la géométrie des lignes
geometries <- st_geometry(lignes)
# Utiliser lapply pour appliquer une fonction à chaque géométrie de ligne
points_terminaux <- lapply(geometries, function(line_geom) {
# Extraire les coordonnées des points terminaux de la géométrie de ligne
coords <- st_coordinates(line_geom)[c(1, nrow(st_coordinates(line_geom))), ]
# Créer un MULTIPOINT à partir des coordonnées des terminaux
st_multipoint(as.matrix(coords), dim = "XY")
})
# Combiner les objets MULTIPOINT en une seule collection de features géométriques (sfc)
points_terminaux_sfc <- do.call(st_sfc, args = list(points_terminaux, crs = st_crs(lignes)))
# Supprimer les dimensions Z (altitude) et M (entité de stockage)
points_terminaux_sfc <- st_zm(points_terminaux_sfc)
# Convertir MULTIPOINT en POINT pour avoir des points individuels
points_terminaux_sfc <- st_cast(points_terminaux_sfc, "POINT")
# Affichage de la carte
mapview(st_as_sf(points_terminaux_sfc)) + mapview(lignes)# Création d'un sf dataframe pour les points terminaux
# Ce code crée un df avec pour chaque ligne les points situés aux extrémités
points_terminaux_df <- st_sf(geometry = points_terminaux_sfc,
line_id = rep(lignes$code_ligne, each = 2))
st_crs(points_terminaux_df) <- 'EPSG:2154'
# Affichage de la carte
mapview(st_as_sf(points_terminaux_df)) + mapview(lignes) + mapview(gares_select, col.region = 'red')# `gares_select` est l'objet sf contenant les gares avec leurs identifiants uniques
# et `points_terminaux_sf` est un objet sf des points terminaux
# Calcul de la gare la plus proche pour chaque point terminal
indices_gares_proches <- st_nearest_feature(points_terminaux_df, gares_select)
# Ajouter l'identifiant de la gare la plus proche à `points_terminaux_df`
points_terminaux_df$gare_id <- gares_select$nom_gare[indices_gares_proches]
head(points_terminaux_df)## Simple feature collection with 6 features and 2 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 713919.1 ymin: 6870453 xmax: 751888.7 ymax: 6897911
## Projected CRS: RGF93 v1 / Lambert-93
## line_id geometry gare_id
## 1 004000 POINT (736117.3 6885328) Crézancy
## 2 004000 POINT (740617.6 6870453) Condé-en-Brie
## 3 005000 POINT (713919.1 6883064) Mareuil sur Ourcq
## 4 005000 POINT (751888.7 6897911) Fère en Tardenois
## 5 070000 POINT (718886.1 6872593) Nogent l'Artaud-Charly
## 6 070000 POINT (742945.8 6884325) Crézancy
# Trier points_terminaux_df par line_id
points_terminaux_df <- points_terminaux_df[order(points_terminaux_df$line_id),]
# Créer le dataframe d'arêtes en associant chaque paire de gares par line_id
edges <- data.frame(
from = points_terminaux_df$gare_id[c(TRUE, FALSE)], # Sélection des gares de départ
to = points_terminaux_df$gare_id[c(FALSE, TRUE)] # Sélection des gares d'arrivée
)
# Supprimer les éventuels doublons ou connexions de gare à elle-même
# Par exemple 306000 qui part d'Arras et qui y arrive
# Ce sont principalement de petit tronçon. 306000 : Voie unique fret
edges <- unique(edges[edges$from != edges$to,])
edges## from to
## 1 Crézancy Condé-en-Brie
## 2 Mareuil sur Ourcq Fère en Tardenois
## 3 Nogent l'Artaud-Charly Crézancy
## 4 Mareuil sur Ourcq Bazoches
## 5 Aguilcourt-Variscourt Laon
## 8 Fretin Calais-Fréthun
## 9 Lesquin Fretin
## 13 Cysoing Le Plessis Belleville
## 15 Courcelles le Comte Arras
## 17 Laon Vervins
## 18 Crépy en Valois Anor
## 19 Estrées Saint-Denis Longueil-Sainte-Marie
## 21 Creil Jeumont
## 26 Hautmont Les Guides
## 29 Somain Busigny
## 32 Valenciennes Sous le Bois
## 33 Lourches Valenciennes
## 37 Cambrai Chaulnes
## 38 Amiens Laon
## 40 Valenciennes Beuvrages
## 41 Beuvrages Valenciennes
## 42 Hellemmes Mont de Terre
## 45 Tressin Orchies
## 46 Baisieux Lezennes
## 47 La Borne Blanche Lille Flandres
## 48 Douai Sin-le-Noble
## 49 Lille Porte de Douai Lesquin
## 50 Tourcoing Lezennes
## 52 Lens Ostricourt
## 53 Sallaumines Pont de Sallaumines
## 55 Dourges Ostricourt
## 56 Sallaumines Don Sainghin
## 58 Haubourdin Santes
## 59 Saint-André Nord Haubourdin
## 61 La Gorgue-Estaires Armentières
## 62 Lille Flandres Les Fontinettes
## 63 Comines France La Madeleine Nord
## 64 Coudekerque Branche Bray-Dunes
## 65 Dunkerque Arras
## 66 Sallaumines Avion
## 68 Grande-Synthe Courghain
## 69 Courghain Gravelines
## 70 Gravelines Bourbourg
## 71 Dunkerque Grande-Synthe
## 72 Dunkerque Les Fontinettes
## 74 Dreuil lès Amiens Saint-Roch
## 76 Saint-Pol sur Ternoise Arras
## 77 Etaples-le Touquet Saint-Pol sur Ternoise
## 78 Blendecques Longfossé
## 79 Saint-Roch Boulogne
## 80 Pont de Briques Boulogne
## 81 Boulogne Tintelleries Boulogne
## 82 Boulogne Calais
## 85 Rochy Condé Soissons
## 87 Formerie Saint-Roch
## 88 Abbeville Woincourt
## 89 Laboissières le Déluge Woincourt
## 90 Boran sur Oise Creil
## 91 La Villetertre Formerie
## 92 Calais-Fréthun Maurois
# Création du graphe
g <- igraph::graph_from_data_frame(edges, directed = FALSE)
# Calcul du nombre de liens connectés à chaque nœud (station)
sort(degree(g), decreasing = T)## Valenciennes Boulogne Laon
## 4 4 3
## Sallaumines Dunkerque Saint-Roch
## 3 3 3
## Arras Crézancy Mareuil sur Ourcq
## 3 2 2
## Fretin Lesquin Creil
## 2 2 2
## Beuvrages Haubourdin Lille Flandres
## 2 2 2
## Grande-Synthe Courghain Gravelines
## 2 2 2
## Saint-Pol sur Ternoise Formerie Calais-Fréthun
## 2 2 2
## Lezennes Ostricourt Les Fontinettes
## 2 2 2
## Woincourt Nogent l'Artaud-Charly Aguilcourt-Variscourt
## 2 1 1
## Cysoing Courcelles le Comte Crépy en Valois
## 1 1 1
## Estrées Saint-Denis Hautmont Somain
## 1 1 1
## Lourches Cambrai Amiens
## 1 1 1
## Hellemmes Tressin Baisieux
## 1 1 1
## La Borne Blanche Douai Lille Porte de Douai
## 1 1 1
## Tourcoing Lens Dourges
## 1 1 1
## Saint-André Nord La Gorgue-Estaires Comines France
## 1 1 1
## Coudekerque Branche Dreuil lès Amiens Etaples-le Touquet
## 1 1 1
## Blendecques Pont de Briques Boulogne Tintelleries
## 1 1 1
## Rochy Condé Abbeville Laboissières le Déluge
## 1 1 1
## Boran sur Oise La Villetertre Condé-en-Brie
## 1 1 1
## Fère en Tardenois Bazoches Le Plessis Belleville
## 1 1 1
## Vervins Anor Longueil-Sainte-Marie
## 1 1 1
## Jeumont Les Guides Busigny
## 1 1 1
## Sous le Bois Chaulnes Mont de Terre
## 1 1 1
## Orchies Sin-le-Noble Pont de Sallaumines
## 1 1 1
## Don Sainghin Santes Armentières
## 1 1 1
## La Madeleine Nord Bray-Dunes Avion
## 1 1 1
## Bourbourg Longfossé Calais
## 1 1 1
## Soissons Maurois
## 1 1
ANALYSE
Centralité de Degré Elevée : Les stations comme Valenciennes, Boulogne, Laon, Sallaumines, Dunkerque, et Saint-Roch ont les centralités de degré les plus élevées dans le réseau, avec des valeurs de 4 ou 3. Cela signifie que ces stations sont connectées directement à 4 ou 3 autres stations. Dans le contexte d’un réseau de transport, une centralité de degré élevée pour une station indique un rôle potentiellement crucial dans le réseau, servant comme un hub ou un point de transfert majeur où de nombreuses lignes ou trajets se croisent.
Stations avec Moins de Connexions : Les stations avec une centralité de degré de 2 sont connectées directement à deux autres stations. Cela suggère qu’elles sont moins centrales que les premières mais jouent toujours un rôle dans la connectivité du réseau.
Stations Périphériques : Les stations avec une centralité de degré de 1, comme Nogent l’Artaud-Charly, Aguilcourt-Variscourt, et Cysoing, sont connectées directement à une seule autre station. Ces stations peuvent être considérées comme périphériques ou terminales dans le réseau, étant à l’extrémité d’une ligne ou ayant moins d’importance dans la structure globale du réseau.
Pour plus de détails sur la théorie des graphs et le degree centrality vous pouvez consulter ce lien.
La closeness centrality (ou centralité de proximité) est une mesure utilisée en théorie des graphes et analyse de réseaux pour évaluer l’importance ou la centralité d’un nœud (par exemple, une gare dans un réseau de transport) par rapport à tous les autres nœuds du réseau. Elle est définie comme l’inverse de la somme des distances les plus courtes entre ce nœud et tous les autres nœuds dans le réseau.
En d’autres termes, un nœud avec une haute closeness centrality est un nœud qui, en moyenne, est plus proche de tous les autres nœuds dans le réseau. Cela signifie que depuis ce nœud, on peut atteindre rapidement tous les autres nœuds, ce qui le rend stratégiquement important pour la diffusion rapide d’informations, la réduction des temps de trajet, ou l’efficacité des échanges au sein du réseau.
Pour calculer la closeness centrality des gares des Hauts-de-France nous utilisons des données GTFS. Les données utilisées dans les scripts suivants proviennent du site Open Data SNCF (consulté le 19 et le 20 février 2024).
Closeness centrality is a measure used in graph theory and network analysis to assess the importance or centrality of a node (for example, a station in a transportation network) in relation to all other nodes in the network. It is defined as the inverse of the sum of the shortest distances between this node and all other nodes in the network.
In other words, a node with high closeness centrality is one that, on average, is closer to all other nodes in the network. This means that from this node, all other nodes can be reached quickly, making it strategically important for the rapid dissemination of information, the reduction of travel times, or the efficiency of exchanges within the network.
To calculate the closeness centrality of stations in the Hauts-de-France region, we use GTFS data. The data used in the following scripts comes from the SNCF Open Data site (consulted on February 19 and 20, 2024).
pacman::p_load(sf, dplyr, mapview, geosphere, igraph, ggplot2)
stops_ter <- read.csv('data/GTFS/export-ter-gtfs-last/stops.txt', header = TRUE)
# names(stops_ter)
stops_ter_select <- stops_ter %>%
dplyr::select(stop_id, stop_name, stop_lat, stop_lon)
rm(stops_ter)
stops_tgv <- read.csv('data/GTFS/export_gtfs_voyages/stops.txt', header = TRUE)
stops_tgv_select <- stops_tgv %>%
dplyr::select(stop_id, stop_name, stop_lat, stop_lon)
rm(stops_tgv)
stops_ouigo <- read.csv('data/GTFS/export_gtfs_voyages/stops.txt', header = TRUE)
stops_ouigo_select <- stops_ouigo %>%
dplyr::select(stop_id, stop_name, stop_lat, stop_lon)
rm(stops_ouigo)
stops <- rbind(
stops_ter_select,
stops_tgv_select,
stops_ouigo_select
)
rm(stops_ter_select,stops_tgv_select, stops_ouigo_select)
stops_select <- stops %>% filter(grepl('Train', stop_id))
# names(stops_select)
rm(stops)
stops_select_sf <- stops_select %>%
sf::st_as_sf(coords = c("stop_lon", "stop_lat"), crs = 4326)
stops_select_sf <- st_transform(stops_select_sf, 2154)
# mapview(stops_select_sf)
# Sélection des arrêts dans les Hauts-de-France
regions <- sf::st_read("data/REGION.shp")## Reading layer `REGION' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\data\REGION.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 13 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 99040 ymin: 6046546 xmax: 1242443 ymax: 7110479
## Projected CRS: RGF93 Lambert 93
HDF <- regions %>%
filter(INSEE_REG == 32) # filtre sur les Hauts-de-France
rm(regions)
stops_select_sf_inter <- sf::st_intersection(stops_select_sf, HDF)## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries
# names(stops_select_sf_inter)
rm(stops_select_sf)
stops_select_sf_inter_select <- stops_select_sf_inter %>%
select(stop_id, stop_name, geometry)
head(stops_select_sf_inter_select)## Simple feature collection with 6 features and 2 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 702417.1 ymin: 6882081 xmax: 770639.6 ymax: 7057502
## Projected CRS: RGF93 v1 / Lambert-93
## stop_id stop_name
## 71 StopPoint:OCETrain TER-87109306 Lille Centre Hospitalier Régional
## 76 StopPoint:OCETrain TER-87116582 Château-Thierry
## 163 StopPoint:OCETrain TER-87171702 Aguilcourt - Variscourt
## 166 StopPoint:OCETrain TER-87171736 Guignicourt
## 167 StopPoint:OCETrain TER-87171744 Amifontaine
## 168 StopPoint:OCETrain TER-87171751 Saint-Erme
## geometry
## 71 POINT (702417.1 7057502)
## 76 POINT (729935.6 6882081)
## 163 POINT (770639.6 6923609)
## 166 POINT (769736 6926581)
## 167 POINT (766004.1 6932094)
## 168 POINT (762121.3 6936705)
stops_select_sf_inter_select <- st_transform(stops_select_sf_inter_select, 4326)
names(stops_select_sf_inter_select)## [1] "stop_id" "stop_name" "geometry"
rm(stops_select_sf_inter)
coords <- st_coordinates(stops_select_sf_inter_select)
stops_select <- data.frame(stop_id = stops_select_sf_inter_select$stop_id,
stop_name = stops_select_sf_inter_select$stop_name,
stop_lat = coords[,2], # Y est généralement la latitude
stop_lon = coords[,1]) # X est généralement la longitude
# Chargement des autres fichiers
stop_times <- read.csv('data/GTFS/export-ter-gtfs-last/stop_times.txt', header = TRUE)
trips <- read.csv('data/GTFS/export-ter-gtfs-last/trips.txt', header = TRUE)
routes <- read.csv('data/GTFS/export-ter-gtfs-last/routes.txt', header = TRUE)
# Joindre les tables pour obtenir une vue complète incluant l'ordre des gares, leurs coordonnées, et la ligne correspondante
stops_ordered <- stop_times %>%
select(trip_id, stop_id, stop_sequence) %>%
left_join(trips, by = "trip_id") %>%
left_join(routes, by = "route_id") %>%
left_join(stops_select, by = "stop_id") %>%
arrange(route_id, trip_id, stop_sequence)
rm(stop_times, trips, routes)
# stops_ordered_filter <- stops_ordered %>%
# filter(route_id == 'FR:Line::DBF3F104-9FF0-48F6-84CE-E49FD6D7F630:')
# À ce stade, stops_ordered contient l'ordre des arrêts pour chaque ligne et trajet, avec les coordonnées géographiques
stops_ordered_clean <- stops_ordered %>%
filter(!is.na(stop_sequence) & !is.na(stop_lat) &
!is.na(stop_lon)) %>%
filter(direction_id == 0)
rm(stops_ordered)
stops_ordered_clean_select <- stops_ordered_clean %>%
select(route_id, route_long_name,stop_name, direction_id, stop_sequence, stop_lat, stop_lon)
rm(stops_ordered_clean)
dim(stops_ordered_clean_select)## [1] 12502 7
## route_id
## 1 FR:Line::0f72eaf9-e37d-4941-9fd4-80e732190386:
## 2 FR:Line::0f72eaf9-e37d-4941-9fd4-80e732190386:
## 3 FR:Line::0f72eaf9-e37d-4941-9fd4-80e732190386:
## 4 FR:Line::0f72eaf9-e37d-4941-9fd4-80e732190386:
## 5 FR:Line::0f72eaf9-e37d-4941-9fd4-80e732190386:
## 6 FR:Line::0f72eaf9-e37d-4941-9fd4-80e732190386:
## route_long_name stop_name
## 1 Paris Nord - Creil - Longueau - Arras - Douai - Lille Flandres Lille Flandres
## 2 Paris Nord - Creil - Longueau - Arras - Douai - Lille Flandres Douai
## 3 Paris Nord - Creil - Longueau - Arras - Douai - Lille Flandres Arras
## 4 Paris Nord - Creil - Longueau - Arras - Douai - Lille Flandres Longueau
## 5 Paris Nord - Creil - Longueau - Arras - Douai - Lille Flandres Creil
## 6 Paris Nord - Creil - Longueau - Arras - Douai - Lille Flandres Lille Flandres
## direction_id stop_sequence stop_lat stop_lon
## 1 0 0 50.63646 3.070840
## 2 0 1 50.37169 3.089969
## 3 0 2 50.28671 2.781895
## 4 0 3 49.86385 2.352591
## 5 0 4 49.26335 2.467837
## 6 0 0 50.63646 3.070840
# Ici je trie par route et stop_sequence puis je calcule la distance avec la gare suivante
stops_ordered_clean_select_dist <- stops_ordered_clean_select %>%
arrange(route_id, stop_sequence) %>% # S'assurer que les données sont triées
group_by(route_id) %>%
mutate(
# Calculer la distance avec la gare suivante dans la séquence
distance_to_next = distHaversine(cbind(stop_lon, stop_lat),
cbind(lead(stop_lon),
lead(stop_lat)))
) %>%
ungroup() # Dégroupement pour manipulations ultérieures
rm(stops_ordered_clean_select)
# Afficher le résultat
dim(stops_ordered_clean_select_dist)## [1] 12502 8
# Préparer le tableau edges V2
edges <- stops_ordered_clean_select_dist %>%
filter(!is.na(distance_to_next)) %>% # suppression des valeurs manquantes
group_by(route_id) %>% # Grouper par itinéraire
mutate(target_stop_name = lead(stop_name),
target_stop_sequence = lead(stop_sequence),
target_stop_lat = lead(stop_lat),
target_stop_lon = lead(stop_lon)) %>%
ungroup() %>% # Enlever le regroupement
select(route_id,
route_long_name,
source_stop_name = stop_name,
target_stop_name,
source_sequence = stop_sequence,
target_sequence = target_stop_sequence,
source_lat = stop_lat, source_lon = stop_lon,
target_lat = target_stop_lat, target_lon = target_stop_lon,
weight = distance_to_next) %>%
filter(!is.na(target_stop_name)) # Filtre pour enlever la dernière ligne de chaque groupe qui n'a pas de 'target'
edges_closeness <- edges %>%
filter(source_stop_name != target_stop_name)
# Afficher le résultat
dim(edges_closeness)## [1] 2758 11
## # A tibble: 6 × 11
## route_id route_long_name source_stop_name target_stop_name source_sequence
## <chr> <chr> <chr> <chr> <int>
## 1 FR:Line::0f… Paris Nord - C… Lille Flandres Douai 0
## 2 FR:Line::0f… Paris Nord - C… Douai Arras 1
## 3 FR:Line::0f… Paris Nord - C… Arras Creil 2
## 4 FR:Line::0f… Paris Nord - C… Creil Arras 2
## 5 FR:Line::0f… Paris Nord - C… Arras Longueau 2
## 6 FR:Line::0f… Paris Nord - C… Longueau Creil 3
## # ℹ 6 more variables: target_sequence <int>, source_lat <dbl>,
## # source_lon <dbl>, target_lat <dbl>, target_lon <dbl>, weight <dbl>
edges_graph_data <- edges_closeness %>%
select(source = source_stop_name, target = target_stop_name, weight)
dim(edges_graph_data)## [1] 2758 3
## # A tibble: 6 × 3
## source target weight
## <chr> <chr> <dbl>
## 1 Lille Flandres Douai 29505.
## 2 Douai Arras 23849.
## 3 Arras Creil 116136.
## 4 Creil Arras 116136.
## 5 Arras Longueau 56183.
## 6 Longueau Creil 67363.
# Préparer les données pour iGraph
g <- graph_from_data_frame(d = edges_graph_data)
# Calcul du score centralité de proximité
closeness_scores <- closeness(g, mode = "all", weights = E(g)$weight)
closeness_df <- data.frame(
stop_name = V(g)$name,
closeness = closeness_scores
)
# Afficher les résultats
head(closeness_df,20)## stop_name closeness
## Lille Flandres Lille Flandres 3.681793e-08
## Douai Douai 3.974791e-08
## Arras Arras 4.099381e-08
## Creil Creil 2.705105e-08
## Longueau Longueau 3.517602e-08
## Hirson Hirson 2.261407e-08
## Hirson Écoles Hirson Écoles 2.266080e-08
## Anor Anor 2.366464e-08
## Fourmies Fourmies 2.441988e-08
## Sains-du-Nord Sains-du-Nord 2.607359e-08
## Avesnes-sur-Helpe Avesnes-sur-Helpe 2.742327e-08
## Avesnelles Avesnelles 2.716073e-08
## Aulnoye-Aymeries Aulnoye-Aymeries 2.985351e-08
## Saint-Hilaire Saint-Hilaire 2.765822e-08
## Dompierre Dompierre 2.820958e-08
## Leval Leval 2.945566e-08
## Le Quesnoy Le Quesnoy 3.065550e-08
## Le Poirier Université Le Poirier Université 3.241083e-08
## Béthune Béthune 3.718357e-08
## Saint-Pol-sur-Ternoise Saint-Pol-sur-Ternoise 3.273661e-08
## stop_name closeness
## Baisieux Baisieux 3.254482e-08
## Ascq Ascq 3.437678e-08
## Pont de bois Pont de bois 3.512468e-08
## Annappes Annappes 3.466833e-08
## Hellemmes Hellemmes 3.546148e-08
## Lezennes Lezennes 3.578599e-08
## Trith-Saint-Léger Trith-Saint-Léger 3.283934e-08
## Prouvy - Thiant Prouvy - Thiant 3.249649e-08
## Denain Denain 3.183329e-08
## Lourches Lourches 3.217624e-08
## Bouchain Bouchain 3.264395e-08
## Iwuy Iwuy 3.400536e-08
## Escaudoeuvres Escaudoeuvres 3.569228e-08
## Pihen Pihen 2.186577e-08
## Caffiers Caffiers 2.055701e-08
## Le Haut Banc Le Haut Banc 2.106342e-08
## Dannes - Camiers Dannes - Camiers 2.538186e-08
## Pont de Briques Pont de Briques 2.309114e-08
## Ormoy-Villers Ormoy-Villers 2.252836e-08
## Bailleul-Sir-Berthoult Bailleul-Sir-Berthoult 3.751580e-08
# Combiner les données de closeness centrality avec les coordonnées des gares
gares_sf <- stops_select_sf_inter_select %>%
left_join(closeness_df, by = "stop_name")
names(gares_sf)## [1] "stop_id" "stop_name" "closeness" "geometry"
# Convertir gares_sf en un objet sf <
gares_sf <- st_as_sf(gares_sf, coords = c("stop_lon", "stop_lat"), crs = 4326)
# Création de la heatmap avec ggplot2
ggplot(data = gares_sf) +
geom_sf(aes(color = closeness), size = 3) +
scale_color_viridis_c(option = "A") +
labs(title = "Heatmap de la Closeness Centrality des Gares",
subtitle = "Chaque gare est colorée selon son score de closeness centrality") +
theme_minimal() +
theme(legend.title = element_text(size = 12),
legend.text = element_text(size = 10))
Lille Flandres est l’arrêt avec le score de proximité le plus élevé, ce qui suggère qu’il est le plus central ou le mieux connecté parmi tous les arrêts listés. C’est dû à sa position stratégique dans le réseau de transport et au nombre élevé de connexions disponibles à partir de cet arrêt.
En observant les scores de proximité les plus bas (par exemple, Prouvy - Thiant, Denain ou Lourches), on note une diminution significative, ce qui pourrait indiquer des arrêts moins centraux ou plus éloignés des principaux axes de transport.
Pour plus de détails sur la théorie des graphs et le closeness centrality vous pouvez consulter ce lien.
pacman::p_load(sf, osrm)
gares_rennes_chateau <- sf::st_read('C:/Users/Othaureau/Documents/BDD/GEOFER/gares_rennes_chateaubriant.gpkg')
gares_rennes_chateau <- gares_rennes_chateau %>%
st_transform(4326)
# Assurez-vous que vos points sont au format sf et en WGS84
points_sf <- st_as_sf(gares_rennes_chateau, coords = c("lon", "lat"), crs = 4326)
# Initialiser une liste pour stocker les résultats des isochrones
list_isochrones <- list()
# Boucle pour calculer les isochrones pour chaque point
for (i in 1:nrow(points_sf)) {
# Extraire le point actuel
point <- points_sf[i, ]
# Calculer l'isochrone de 15 minutes à pied
isochrone <- osrm::osrmIsochrone(loc = point,
returnclass = "sf",
breaks = 15,
osrm.profile = 'foot') # the routing profile to use, e.g. "car", "bike" or "foot"
# Stocker l'isochrone dans la liste
list_isochrones[[i]] <- isochrone
}
##??osrmIsochrone
# Fusionner tous les isochrones dans un seul objet sf si nécessaire
all_isochrones <- do.call(rbind, list_isochrones)
mapview::mapview(all_isochrones)
# Visualisation (optionnel)
# Si vous voulez visualiser les isochrones, vous pouvez utiliser ggplot2 ou une autre librairie graphique
# library(ggplot2)
# ggplot() +
# geom_sf(data = points_sf, color = 'red') +
# geom_sf(data = all_isochrones, fill = 'blue', alpha = 0.5)
# Enregistrer le résultat dans un fichier GeoJSON, par exemple
getwd()
# st_write(all_isochrones, "C:/Users/Othaureau/Documents/BDD/ISOCHRONES_OSRM/isochrones.geojson")Carto de l’isochrone avec le moins bon score
## Reading layer `all_data_standardized_stpol_foot_p15_20240222' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\processed_data\all_data_standardized_stpol_foot_p15_20240222.gpkg'
## using driver `GPKG'
## Simple feature collection with 140 features and 22 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 603303 ymin: 7019253 xmax: 683443.5 ymax: 7048245
## Projected CRS: RGF93 v1 / Lambert-93
isochrones_p15min <- sf::st_read('C:/Users/otheureaux/Documents/OT/6T/R/database_sf/processed_data/isochrones_stpol_foot_15min_20240208.geojson')## Reading layer `isochrones_stpol_foot_15min_20240208' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\processed_data\isochrones_stpol_foot_15min_20240208.geojson'
## using driver `GeoJSON'
## Warning in CPL_read_ogr(dsn, layer, query, as.character(options), quiet, : GDAL
## Message 1: Several features with id = 1 have been found. Altering it to be
## unique. This warning will not be emitted anymore for this layer
## Simple feature collection with 140 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 1.62607 ymin: 50.26405 xmax: 2.777442 ymax: 50.53843
## Geodetic CRS: WGS 84
isochrones_p15min <- isochrones_p15min %>%
st_transform(2154)
pk_min <- pk_avec_data %>%
filter(total_sum == min(pk_avec_data$total_sum))
intersections <- sf::st_intersects(st_buffer(pk_min, 10), isochrones_p15min)
# Extraire les isochrones correspondants
iso_min <- isochrones_p15min[unlist(intersections), ]
iso_min## Simple feature collection with 1 feature and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 658120.8 ymin: 7036632 xmax: 659038.9 ymax: 7037982
## Projected CRS: RGF93 v1 / Lambert-93
## id isomin isomax point.ID_number geometry
## 29 1 0 15 283213 MULTIPOLYGON (((658754.9 70...
## tmap mode set to interactive viewing
tm_basemap(c(leaflet::providers$Esri.WorldTopoMap,
leaflet::providers$OpenStreetMap,
leaflet::providers$Esri.WorldImageryiders,
leaflet::providers$GeoportailFrance.orthos)) +
tm_shape(st_union(iso_min)) + tm_fill(col = '#75a993',
alpha = 0.5) +
tm_shape(pk_min) + tm_dots()Carto de l’isochrone avec le meilleur score
pk_max <- pk_avec_data %>%
filter(total_sum == max(pk_avec_data$total_sum))
intersections <- sf::st_intersects(pk_max, isochrones_p15min)
# Extraire les isochrones correspondants
iso_max <- isochrones_p15min[unlist(intersections), ]
iso_max## Simple feature collection with 2 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 673489.2 ymin: 7045960 xmax: 675356.2 ymax: 7048195
## Projected CRS: RGF93 v1 / Lambert-93
## id isomin isomax point.ID_number geometry
## 1 1 0 15 17132 MULTIPOLYGON (((674436 7048...
## 6 1 0 15 282983 MULTIPOLYGON (((674639.7 70...
# Données OSRMROUTE 1 ----
pacman::p_load(sf, dplyr, mapview, geosphere, igraph, ggplot2, osrm, googlePolylines)
edges_100 <- edges_closeness[1:100,]
depart_gare <- edges_100 %>%
select(source_stop_name, source_lat, source_lon)
source_gare_sf <- sf::st_as_sf(depart_gare, coords=c('source_lon',
'source_lat'))
st_crs(source_gare_sf) <- 'epsg:4326'
mapview(source_gare_sf)depart_lon <- st_coordinates(source_gare_sf)[2, 1]
depart_lat <- st_coordinates(source_gare_sf)[2, 2]
destination_gare <- edges_100 %>%
select(target_stop_name, target_lat, target_lon)
destination_gare_sf <- sf::st_as_sf(destination_gare,
coords=c(
'target_lon',
'target_lat'))
st_crs(destination_gare_sf) <- 'epsg:4326'
destination_lat <- st_coordinates(destination_gare_sf)[2, 1]
destination_lon <- st_coordinates(destination_gare_sf)[2, 2]
mapview(destination_gare_sf)loc <- cbind(source_gare_sf,
destination_gare_sf)
st_crs(loc) <- 'epsg:4326'
# Initialiser une liste pour stocker les résultats des routes
list_routes <- list()
# Boucle pour calculer les isochrones pour chaque point
for (i in 1:nrow(source_gare_sf)) {
depart_lon <- st_coordinates(source_gare_sf)[i, 1]
depart_lat <- st_coordinates(source_gare_sf)[i, 2]
destination_lon <- st_coordinates(destination_gare_sf)[i, 1]
destination_lat <- st_coordinates(destination_gare_sf)[i, 2]
route <- osrmRoute(
src = c(depart_lon, depart_lat),
dst = c(destination_lon, destination_lat),
overview = "simplified",
osrm.server = getOption("osrm.server"),
#default = "https://router.project-osrm.org/"),
osrm.profile = "foot")
# Stocker la route dans la liste
list_routes[[i]] <- route
}
# Fusionner tous les routes dans un seul objet sf si nécessaire
all_routes <- do.call(rbind, list_routes)
mapview::mapview(all_routes) +
mapview(source_gare_sf)## Reading layer `OD_DEP51' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\data\OD_DEP51.csv'
## using driver `CSV'
## Warning: no simple feature geometries present: returning a data.frame or tbl_df
## [1] "field_1" "COMMUNE" "DCLT"
## Reading layer `COMMUNE' from data source
## `C:\Users\otheureaux\Documents\OT\DECOUPAGES_FR\COMMUNE.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 34816 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 99040 ymin: 6046546 xmax: 1242443 ymax: 7110479
## Projected CRS: RGF93 Lambert 93
## [1] "ID" "NOM" "NOM_M" "INSEE_COM" "STATUT"
## [6] "POPULATION" "INSEE_CAN" "INSEE_ARR" "INSEE_DEP" "INSEE_REG"
## [11] "SIREN_EPCI" "geometry"
## [1] "data_OD_DEP51.COMMUNE"
## [1] "INSEE_COM"
source_gare_sf <- right_join(communes,
source_gare,
by = 'INSEE_COM') %>%
st_transform(4326) %>%
st_centroid()## Warning: st_centroid assumes attributes are constant over geometries
## [1] "data_OD_DEP51.DCLT"
destination_gare <- destination_gare %>%
dplyr::rename(INSEE_COM = data_OD_DEP51.DCLT)
names(destination_gare)## [1] "INSEE_COM"
destination_gare_sf <- right_join(communes,
destination_gare,
by = 'INSEE_COM')%>%
st_transform(4326)%>%
st_centroid()## Warning: st_centroid assumes attributes are constant over geometries
# Initialiser une liste pour stocker les résultats des routes
list_routes <- list()
# Boucle pour calculer les routes pour chaque point
# for (i in 1:nrow(source_gare_sf))
for (i in 1:10) {
depart_lon <- st_coordinates(source_gare_sf)[i, 1]
depart_lat <- st_coordinates(source_gare_sf)[i, 2]
destination_lon <- st_coordinates(destination_gare_sf)[i, 1]
destination_lat <- st_coordinates(destination_gare_sf)[i, 2]
route <- osrmRoute(
src = c(depart_lon, depart_lat),
dst = c(destination_lon, destination_lat),
overview = "simplified",
osrm.server = getOption("osrm.server"),
#default = "https://router.project-osrm.org/"),
osrm.profile = "car")
# Stocker la route dans la liste
list_routes[[i]] <- route
}
# Fusionner tous les routes dans un seul objet sf si nécessaire
all_routes <- do.call(rbind, list_routes)
all_route_distinct <- all_routes %>%
distinct(distance, .keep_all = T)
mapview::mapview(all_routes) + mapview(source_gare_sf)Etape 1 : Installer la bonne version de JAVA (version 11)
dans l’environnement Variables systèmes : variable d’environnement JAVA_HOME : C:/Program Files/Java/jdk-11/ (Assurez-vous de ne pas inclure bin à la fin du chemin JAVA_HOME) ET PATH : C:/Program Files/Java/jdk-11/bin (chemin du dossier bin de Java).
dans l’environnement Variables utilisateurs : variable d’environnement PATH : C:/Program Files/Java/jdk-11/bin (chemin du dossier bin de Java).
Etape 2 : La dernière version de R doit être installé
Pour connaître votre version de R : R.home()) Version nécessaire : R version 4.3.2 (2023-10-31 ucrt)
Configurer R_HOME
Installer la dernière version de R
Après avoir installé R, assurez-vous que le chemin d’installation de
R est correctement défini dans la variable
d’environnement R_HOME/
* Sur Windows, R_HOME doit être défini pour pointer vers le répertoire
d’installation de R, comme C:/Program Files/R/R-4.3.2 Pour ce faire
aller dans Système>Informations système>Paramètres avancés du
système>Variables d’environnement>Variables systèmes. Après avoir
défini R_JAVA, redémarrez votre ordinateur.
Après avoir défini JAVA_HOME R_HOME et les bons Path, redémarrez votre ordinateur.
Configurez R Studio
Pour utiliser la dernière version de R avec RStudio sur Windows : Lancez RStudio. Accéder aux Options Globales. Allez dans Tools (Outils) dans la barre de menu. Sélectionnez Global Options (Options Globales). Changer la Version de R : Dans la fenêtre Options, cliquez sur General (Général) dans la liste de gauche. Sous R version, cliquez sur Change (Modifier) pour choisir une version différente de R. Une liste des versions de R installées sur votre système devrait apparaître. Sélectionnez la version que vous venez d’installer. Appliquer et Redémarrer RStudio : Cliquez sur OK pour enregistrer vos modifications. Vous devrez peut-être redémarrer RStudio pour que les changements prennent effet. Vérifier la Version de R dans RStudio : Après avoir redémarré RStudio, vous pouvez vérifier que la bonne version de R est utilisée en exécutant R.version.string ou sessionInfo() dans la console.
Etape 3 : Ouvrez RStudio et installez r5r et rJava
Script d’exemple : Source : https://ipeagit.github.io/intro_access_book/3_calculando_acesso.en.html
options(java.parameters = "-Xmx2G")
pacman::p_load(r5r, rJava)
data_path <- system.file("extdata/poa", package = "r5r")
data_path
fs::dir_tree(data_path)
r5r_core <- setup_r5(data_path, verbose = FALSE)
fs::dir_tree(data_path)
# read data.frame with grid centroids
points <- data.table::fread(file.path(data_path, "poa_hexgrid.csv"))
mapview::mapview(points)
ttm <- travel_time_matrix(
r5r_core,
origins = points,
destinations = points,
mode = c("WALK", "TRANSIT"),
departure_datetime = as.POSIXct(
"13-05-2019 14:00:00",
format = "%d-%m-%Y %H:%M:%S"
),
max_walk_time = 30,
max_trip_duration = 120,
verbose = FALSE,
progress = FALSE
)
head(ttm)Calcul d’isochrones avec r5r sur la ligne Saint-Pol-sur-Ternoise
# Avant tout
options(java.parameters = "-Xmx2G")
pacman::p_load(r5r, sf, data.table, ggplot2, tmap)
# Télécharger les données au format pbf (Protocolbuffer Binary Format)
Un fichier PBF est un format de fichier utilisé pour stocker des données géographiques, notamment celles issues d'OpenStreetMap'.
Ici, vous pouvez trouver des fichiers pbf : https://download.geofabrik.de/
# Configurer le dossier où se trouve les éléments
r5r_core <- setup_r5(data_path = "C:/Users/otheureaux/Documents/OT/RAILENIUM/BDD_TELLI/OSM_PBF", verbose = FALSE)
# data_path est le chemin vers le dossier contenant vos données de réseau.
# Chargement de l'emprise de la zone d'étude ----
zone_etude <- sf::st_read('C:/Users/otheureaux/Documents/OT/RAILENIUM/BDD_TELLI/ISOCHRONES/isochrones_stpol_car_20min_groupe.gpkg')
zone_etude <- sf::st_transform(zone_etude, 2154)
# Chargement de la couche des points kilométriques ----
points_kms <- sf::st_read('C:/Users/otheureaux/Documents/OT/RAILENIUM/BDD_TELLI/PT_KMS/pk_etoile_de_saintpol.gpkg')
# points_kms <- st_transform(points_kms, 2154)
points_kms <- points_kms %>% mutate(ID_number = row_number())
# Convertir les valeurs de 'pk' en numérique
pk_num <- as.numeric(points_kms$pk)
# Créer un vecteur logique pour filtrer les pk entiers et ceux se terminant par ,5
filter_condition <- pk_num %% 1 == 0
# Filtrer la collection de fonctions simples en utilisant la condition
filtered_points_kms <- points_kms[filter_condition, ]
# Découpage de la couche des points kilométriques
points_kms_decoup <- sf::st_intersection(filtered_points_kms,zone_etude)
# Ajouter une colonne 'id' à vos points d'origine
points_kms_decoup$id <- 1:nrow(points_kms_decoup)
# Vérifiez les premières lignes pour confirmer l'ajout de 'id'
head(points_kms_decoup)
# Transformation en WGS84
points_kms_decoup <- st_transform(points_kms_decoup, 4326)
# Extraire les coordonnées et créer des colonnes 'lat' et 'lon'
points_kms_decoup$lat <- st_coordinates(points_kms_decoup)[, "Y"]
points_kms_decoup$lon <- st_coordinates(points_kms_decoup)[, "X"]
# Vérifier le résultat
head(points_kms_decoup)
# sf::st_write(points_kms_decoup_light_wgs84, 'processed_data/points_kms_decoup_light_wgs84_v1.gpkg')
# routing inputs
mode <- c("WALK")
max_trip_duration <- 15 # in minutes
# calculate travel time matrix
iso1 <- r5r::isochrone(r5r_core,
origins = points_kms_decoup,
mode = mode,
sample_size = 1,
max_trip_duration = max_trip_duration,
walk_speed = 5,
progress = FALSE)
iso1_filter <- iso1 %>%
filter(isochrone == 15)
sf::st_write(iso1_filter, 'processed_data/r5r_iso_15min_5km_20240117.gpkg')
# extract OSM network
street_net <- street_network_to_sf(r5r_core)
main_roads <- subset(street_net$edges, street_class %like% 'PRIMARY|SECONDARY')
colors <- c('#ffe0a5','#ffcb69','#ffa600','#ff7c43','#f95d6a',
'#d45087','#a05195','#665191','#2f4b7c','#003f5c')
ggplot() +
geom_sf(data = iso1, aes(fill=factor(isochrone)), color = NA, alpha = .7) +
geom_sf(data = main_roads, color = "gray55", size=0.01, alpha = 0.2) +
# scale_fill_viridis_d(direction = -1, option = 'B') +
scale_fill_manual(values = rev(colors) ) +
scale_color_manual(values=c('Central bus\nstation'='black')) +
labs(fill = "Travel time\n(in minutes)", color='') +
theme_minimal() +
theme(axis.title = element_blank())
# Création de la carte avec tmap
tmap_mode('view')
tm_shape(iso1_select) +
tm_polygons("isochrone", id = "id", palette = rev(colors), border.col = NA, alpha = .7) +
tm_shape(main_roads) +
tm_lines(col = "gray55", lwd = 0.1, alpha = 0.2) +
tm_layout(
legend.title.size = 0.8,
legend.text.size = 0.8,
bg.color = "white",
frame = FALSE,
legend.position = c("left", "bottom")
)# Chargement de la library
pacman::p_load(qgisprocess)
# Permet de créer un vecteur avec tous les algorithmes
qgis_algo <- qgis_algorithms()
# Rechercher un traitement spécifique
grep("intersect", qgis_algo$algorithm, value = T)
grep("grass", qgis_algo$algorithm, value = T)
qgis_algo$provider_title
qgis_configure()
# Montrer l'aide
qgis_show_help("native:slope")
# Exemple avec le calcul de pente de plusieurs isochrones
for(i in 1:nrow(all_isochrones)) {
mnt_intersection <- crop(ras, all_isochrones[i,])
a <- mask(mnt_intersection, all_isochrones[i,])
b <- qgis_run_algorithm("native:slope",
INPUT = a,
OUTPUT = paste('C:/Users/otheureaux/Documents/OT/RAILENIUM/DONNEES_CARTO/raster/mnt_62/', i, ".tif"))
b_ras <- raster(paste('C:/Users/otheureaux/Documents/OT/RAILENIUM/DONNEES_CARTO/raster/mnt_62/', i, ".tif"))
mean <- raster::cellStats(b_ras, stat = "mean", na.rm = TRUE)
sum <- data.frame(pente_moyenne = mean,
ID_number = all_isochrones$point.ID_number[i])
all_sum[[i]] <- sum
} pacman::p_load(sf)
BPE <- read.csv2("C:/Users/otheureaux/Documents/OT/RAILENIUM/BDD_TELLI/BPE/bpe21_ensemble_xy_csv/bpe21_ensemble_xy.csv")
BPE_VARMOD <- read.csv2("C:/Users/otheureaux/Documents/OT/RAILENIUM/BDD_TELLI/BPE/bpe21_ensemble_xy_csv/Varmod_bpe21_ensemble_xy.csv")
BPE_VARMOD_commerces <- BPE_VARMOD %>%
filter(stringr::str_starts(COD_MOD, 'B'))
names(BPE_VARMOD_commerces)
(BPE_VARMOD_commerces$LIB_MOD)
BPE_clean <- BPE %>%
dplyr::filter(LAMBERT_X != "", LAMBERT_Y != "",
!is.na(LAMBERT_X), !is.na(LAMBERT_Y))
BPE_clean_25 <- BPE_clean %>%
filter(DEP == 25)
BPE_clean_25_resto <- BPE_clean_25 %>%
filter(stringr::str_starts(TYPEQU, 'A504')) # RESTAURANT- RESTAURATION RAPIDE
BPE_clean_25_resto_sf <- BPE_clean_25_resto %>%
sf::st_as_sf(coords = c("LAMBERT_X", "LAMBERT_Y"), crs = 2154)
BPE_clean_25_resto_sf_intersection <- st_intersection(BPE_clean_25_resto_sf, zone_etude)
mapview(BPE_clean_25_resto_sf_intersection)
BPE_clean_25_commerces <- BPE_clean_25 %>%
filter(stringr::str_starts(TYPEQU, 'B'))
# "Commerces" "Grandes surfaces"
# "Commerces alimentaires" "Commerces spécialisés non-alimentaires"
# "HYPERMARCHÉ" "SUPERMARCHÉ"
# "GRANDE SURFACE DE BRICOLAGE" "SUPÉRETTE"
# "ÉPICERIE" "BOULANGERIE"
# "BOUCHERIE CHARCUTERIE" "PRODUITS SURGELÉS"
# "POISSONNERIE" "LIBRAIRIE, PAPETERIE, JOURNAUX"
# "MAGASIN DE VÊTEMENTS" "MAGASIN D’ÉQUIPEMENTS DU FOYER"
# "MAGASIN DE CHAUSSURES" "MAGASIN D’ÉLECTROMÉNAGER ET DE MAT. AUDIO-VIDEO"
# "MAGASIN DE MEUBLES" "MAGASIN D’ARTICLES DE SPORTS ET DE LOISIRS"
# "MAGASIN DE REVÊTEMENTS MURS ET SOLS" "DROGUERIE QUINCAILLERIE BRICOLAGE"
# "PARFUMERIE-COSMÉTIQUE" "HORLOGERIE-BIJOUTERIE"
# "FLEURISTE-JARDINERIE-ANIMALERIE" "MAGASIN D’OPTIQUE"
# "MAGASIN DE MATÉRIEL MÉDICAL ET ORTHOPÉDIQUE "STATION-SERVICE"
names(BPE_clean_25_commerces)
table(BPE_clean_25_commerces$TYPEQU)
names(BPE_clean_25_commerces)
table(BPE_clean_25_commerces$TYPEQU)
BPE_clean_25_commerces_sf <- BPE_clean_25_commerces %>%
sf::st_as_sf(coords = c("LAMBERT_X", "LAMBERT_Y"), crs = 2154)
mapview(BPE_clean_25_commerces_sf)## Packages
pacman::p_load(sf, dplyr, httr, purrr)
## Choix du flux: REGION, COMMUNE, EPCI, BATIMENT, ROUTES, RIVIERE, VOIE FERRE
url_bd <- "https://wxs.ign.fr/essentiels/geoportail/wfs?VERSION=2.0.0"
# DEPARTEMENT
# url_bd <- "https://wxs.ign.fr/topographie/geoportail/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetCapabilities"
# IRIS
# url_bd <- "https://wxs.ign.fr/cartovecto/geoportail/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetCapabilities"
## Interroger le contenu du lien, afficher tout le contenu
ign_client <- ows4R::WFSClient$new(url_bd, serviceVersion = "2.0.0")
ign_client$getFeatureTypes(pretty = TRUE)
# options(max.print = 1000)## Chercher une variable par son nom
bd_vrbg <- ign_client$getCapabilities()
a <- bd_vrbg$getFeatureTypes(pretty = TRUE)
b <- a%>%filter(grepl(pattern = "batiment", x = name))
str(b)## Rechercher les métadonnées d'une variable
ign_client$
getCapabilities()$
findFeatureTypeByName("BDTOPO_V3:troncon_de_route")$
getDescription() %>%
purrr::map_chr(function(x){x$getName()})## isoler des données de la BDTOPO avec une bounding box
parse_url <- httr::parse_url(url_bd)
parse_url$query <- list(service = "WFS",
#version = "2.0.0", # optional
request = "GetFeature",
typename = "BDCARTO_BDD_WLD_WGS84G:commune", # type disponible ici : ign_client$getFeatureTypes(pretty = TRUE)
cql_filter = c("insee_com='34172'")) # J'utilise insee_com repéré à l'étape précédente pour charger l'emprise de Montpellier
# cql_filter = paste("code_insee='77316'", "code_insee='77186'", "code_insee='77463'", "code_insee='77419'", "code_insee='77014'", "code_insee='77079'", sep = " OR "))
# bbox = "48.88417,2.34466,48.90956,2.38308") # epsg:2154
request <- st_read(build_url(parse_url))Tour de la Vanoise 2014
N1 : refuge de la Leisse
N2 : refuge du plan sec
N3 : refuge de l’Aiguille Doran
N4 : refuge des Barmettes
N5 : refuge de Vallonbrun
N6 : refuge du fond des fours
## tmap mode set to interactive viewing
## Reading layer `dep_arv' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\data\dep_arv.gpkg'
## using driver `GPKG'
## Simple feature collection with 8 features and 1 field
## Geometry type: MULTIPOINT
## Dimension: XY
## Bounding box: xmin: 988339.2 ymin: 6464848 xmax: 1012218 ymax: 6492680
## Projected CRS: RGF93 v1 / Lambert-93
## Reading layer `trace_vanoise' from data source
## `C:\Users\otheureaux\Documents\OT\6T\R\database_sf\data\trace_vanoise.gpkg'
## using driver `GPKG'
## Simple feature collection with 1 feature and 0 fields
## Geometry type: LINESTRING
## Dimension: XY
## Bounding box: xmin: 986821.2 ymin: 6464837 xmax: 1016253 ymax: 6492562
## Projected CRS: RGF93 v1 / Lambert-93
Pour citer ces travaux :
Olivier Theureaux. n.d. “Tutoriels R dans le cadre d’une mission de géomaticien au sein du LVMT”