Pour celles et ceux qui disposent d’un compte strava/garmin actif, sachez qu’il vous est tout à fait possible de récupérer rapidement toutes vos données personnelles de tracking, et de les cartographier à souhait. Vous pourrez alors passer des heures à admirer vos traces en spaghettis, vous auto-congratuler pour tous les secteurs déjà explorés, calculer des densités, et localiser facilement toutes les zones vierges qu’il vous reste à parcourir. Le script ci-dessous vous permettra d’y parvenir, et de suggérer quelques pistes d’analyse spatiale complémentaire de ces traces.

Récupération des traces

Il est possible de télécharger toutes ses sorties strava/garmin depuis son compte. Pour strava, il faut suivre ce chemin :

Paramètres > Mon compte > Télécharger ou supprimer le compte > Demande de téléchargement > Demander une archive

Pour garmin, il faut se rendre sur cette page : https://www.garmin.com/fr-FR/account/datamanagement/, puis cliquer sur Exporter vos données pour demander une archive dont le lien vous sera également envoyé par mail (avec un petit délai).

Dans les deux cas, vous allez alors normalement récupérer une série de fichiers .fit, compressés en format .fit.gz (seulement pour strava - les fichiers garmin n’étant pas compressés).

Placez l’ensemble dans votre répertoire de travail, puis exécutez le script suivant :

files <- list.files() 

# Si les données sont compressées (strava), décompressez-les ainsi :
lst <- vector("list", length(files))
files <- files[grep("gz", files)] 
for(i in 1:length(files)) {
  lst[[i]] <- gunzip(files[i])
}

On peut maintenant procéder à leur lecture et leur traitement, mais d’abord, chargez les librairies suivantes :

Chargement des librairies

library(FITfileR) # Ce package peut être préalablement installé ici : remotes::install_github("grimbough/FITfileR")
library(dplyr)
library(sf)
library(tmap)
library(sfheaders)
library(ggplot2)
library(terra)

Lecture et préparation des fichiers .fit

La librairie FITfileR permet de lire directement et aisément des fichiers .fit dans R :

stravaFit <- lapply(files, FITfileR::readFitFile)

L’étape suivante consiste à extraire de ces fichiers les informations qui nous intéressent (ici les coordonnées géographiques et la distance). Pour cela, nous allons créer la fonction suivante :

extrXY <- function(x){
  xy <- records(x) %>% # La fonction records() permet d'extraire les informations (messages) des fichiers .fit
    select(position_long, position_lat, distance) %>% # On pourrait rajouter l'atitude, la vitesse, etc.
    mutate(ID = i) # on rajoute un identifiant par fichier (c'est-à-dire par sortie)
}

On exécute ensuite la fonction sur notre liste de fichiers, puis on transforme la liste résultante en tableau :

# Exécution de la fonction
xy.list <- list()
for(i in 1:length(stravaFit)) {
  xy.list[[i]] <- extrXY(stravaFit[[i]])
}

# De la liste au tableau + ajout de la distance par sortie pour les analyses à venir
stravaRows <- bind_rows(xy.list)
distTot <- stravaRows %>% group_by(ID) %>% summarise(distTot = last(distance))

Le fichier stravaRows est un tableau dont chaque ligne correspond à un point, caractérisé par des coordonnées X et Y (en WGS84, CRS 4326). Il faut maintenant relier ces points entre eux par ID pour en faire des polylignes qui pourront ensuite être cartographiées. Nous allons utiliser pour cela la fonction sf_linestring du package sfheaders, très pratique car elle tranforme directement la table de points en un objet linéaire de classe sf :

dfCarto <- sfheaders::sf_linestring(obj = stravaRows,
                                    x = "position_long",
                                    y = "position_lat",
                                    linestring_id = "ID",
                                    keep = T)

# On ajoute la variable de distance au résultat, et le compte est bon
dfCarto <- left_join(dfCarto,distTot) 

Cartographie des traces

Cet objet dfCarto peut maintenant être cartographié avec le package de votre choix, ici tmap pour profiter de la dimension interactive (notez que les traces utilisées ici sont personnelles) :

tmap_mode("view")
## tmap mode set to interactive viewing
tm_basemap(leaflet::providers$OpenStreetMap) +
  tm_shape(dfCarto) + tm_lines(col="red")