Étude d'une trace GPS
On souhaite étudier les données à partir d'une trace GPS.
Le fichier que l'on récupère ici est issue d'une course cylciste : la pyrénéenne 2023.
Le fichier se trouve sur la plateforme kaggle qui permet le stockage de données scientifiques et qui possède une API accessible via un module Python.
Récupération du fichier⚓︎
On éxécute le code suivant pour charger le fichier.
Formule de Haversine⚓︎
On cherche la distance d entre deux points \(P_1(\text{lat}_1, \text{lon}_1)\) et \(P_2(\text{lat}_2, \text{lon}_2)\).
Cette formule ne prend pas en compte les différences d'altitudes. C'est une distance, au niveau de la mer.
\(a = \sin^2\left(\frac{\Delta \varphi}{2}\right) + \cos(\varphi_1) \cdot \cos(\varphi_2) \cdot \sin^2\left(\frac{\Delta \lambda}{2}\right)\)
\(c = 2 \cdot \arcsin(\sqrt{a})\)
\(d = R \cdot c\)
où :
- \(\varphi_1, \varphi_2\) = latitudes en radians
- \(\lambda_1, \lambda_2\) = longitudes en radians
- \(\Delta \varphi = \varphi_2 - \varphi_1\)
- \(\Delta \lambda = \lambda_2 - \lambda_1\)
- \(R\) = rayon de la Terre (en km, généralement \(R = 6371\))
Exemple⚓︎
Si l’on a :
- \(P_1 = (43.3°, -0.4°)\)
- \(P_2 = (43.4°, -0.3°)\)
alors, en convertissant en radians et en appliquant la formule ci-dessus, on obtient \(d \approx 13.75 , \text{km}\).
Complète le code de la fonction distance:
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Création d'une liste⚓︎
On éxéxute le code suivant pour obtenir la trace de la course.
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Lissage des altitudes.⚓︎
Les récepteurs GPS donnent parfois des altitudes non réelles sur certains points isolés. Pour contrer ce phénomène, on eut lisser sur plusieurs valeurs consécutives.
Le lissage d’une liste de longueur \(n\) des altitudes par moyenne glissante de pas \(p\) consiste à remplacer l’altitude au point numéroté \(i\) par la moyenne des altitudes des points numérotés \(i, i + 1,…, i + j\) où \(j = min(p − 1, n − i − 1)\).
Complète le code de la fonction lissage.
Ensuite il est possible de regarder le résultat du lissage en constatant l'évolution de trackDf[0] entre avant et après l'appel de la fonction lissage.
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Statistiques par segment⚓︎
On souhaite établir des statistiques par segment kilométrique.
Complète le code de la fonction suivante qui retourne un couple (altitude minimale, altitude maximale pour un segment kilométrique dont l'indice est donné en paramètre.
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Pente d'un segment⚓︎
On va caluler la pente moyenne de chaque segment. La différence d'altitude est obtenue par la différence entre les altitudes minimales et maximales, puis on divise par la longueur parcourue.
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Les statistiques des segments⚓︎
Enfin on veut obtnir des statistiques pour les 103 segments de cette course.
Plus exactement, on souhaite connaître les parts des segment ayant une valeur absolue de pente, inférieure à 2%, comprise entre 2% et 8% et supérieure à 8%.
Complète le code suivant.
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Questions supplémentaire⚓︎
Pour chacune des questions suivantes, il est possible de trouver les coordonnées des réponses trouvées et de chercher le lieu sur OpenStreetMap.
- Quelle est l'altitude maximale lissée atteinte sur cette course ? Quel est le nom du col de cet endroit ?
- Quel kilomètre de segment contient la pente la plus forte en montée ? Même question pour la descente la plus forte.
- Quel kilomètre de segment est le plus plat ?
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Tracé de la course cycliste⚓︎
En utilisant le module matplotlib.pyplot et les donnés suivantes issues des questions précédentes, tracer un histogramme des altitudes de la course en fonction du kilomètre, la barre est rouge si la valeur absolue de la pente est supérieure à 8%, jaune si elle est comprise entre 2 et 8% verte sinon.

# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)