TP C — Analyse d'un fichier GPX
Objectifs
Ce TP a pour objectifs de vous apprendre à :
- lire un fichier texte en C ;
- parcourir une chaîne de caractères à l'aide d'un tableau et de pointeurs ;
- rechercher une information dans un texte ;
- extraire une valeur numérique d'une chaîne ;
- calculer des statistiques à partir de données lues dans un fichier.
1. Présentation du fichier GPX
Le format GPX permet d'enregistrer un parcours GPS. Il contient notamment les coordonnées géographiques, l'altitude et, selon les appareils, des mesures complémentaires telles que la fréquence cardiaque.
Un point du parcours peut être décrit ainsi :
<trkpt lat="48.2810853" lon="6.9708714">
<ele>347.16104</ele>
<time>2026-09-16T16:26:51Z</time>
<extensions>
<gpxtpx:TrackPointExtension>
<gpxtpx:hr>93</gpxtpx:hr>
<gpxtpx:cad>123</gpxtpx:cad>
</gpxtpx:TrackPointExtension>
</extensions>
</trkpt>
Dans cet exemple, l'altitude est de 347,16104 mètres et la fréquence cardiaque est de 93 battements par minute.
Le fichier fourni contient de nombreux points successifs. Vous allez écrire un programme capable d'en extraire certaines informations.
Pour ce TP, vous travaillerez sur le fichier GPX fourni et sur la structure présentée ci-dessus. Vous n'avez pas à développer un parseur XML généraliste.
2. Lire le fichier
Écrivez un programme C qui ouvre le fichier GPX en lecture et lit son contenu ligne par ligne.
Vous utiliserez la fonction fgets() pour effectuer la lecture.
Votre programme devra :
- vérifier que le fichier a bien été ouvert ;
- afficher les lignes lues ;
- détecter la fin du fichier ;
- fermer le fichier après la lecture.
Vérifiez le fonctionnement du programme avant de poursuivre.
Voir le TD 3.
3. Extraire l'altitude
L'altitude est contenue entre les balises <ele> et </ele>.
Par exemple :
<ele>347.16104</ele>
Écrivez une fonction qui recherche une balise d'altitude dans une chaîne et extrait la valeur située entre les deux balises.
La fonction devra renvoyer la valeur sous forme de chaîne de caractères. Vous convertirez ensuite cette chaîne en nombre à l'aide de strtof().
Vous pourrez utiliser le prototype suivant :
int extraire_altitude(const char *ligne,
char *resultat,
int taille);
La fonction renvoie 1 si une altitude a été extraite et 0 sinon.
Attention : une altitude peut être absente de certaines lignes. Votre programme ne doit pas tenter de convertir une valeur qui n'a pas été trouvée.
4. Calculer l'altitude minimale et maximale
Modifiez votre programme pour parcourir l'ensemble du fichier GPX.
Chaque fois qu'une altitude est trouvée, convertissez-la en nombre et mettez à jour les deux variables contenant l'altitude minimale et l'altitude maximale.
Vous devrez :
- initialiser correctement ces deux variables ;
- compter le nombre d'altitudes extraites ;
- ne mettre à jour les résultats que lorsqu'une altitude valide a été trouvée.
À la fin du traitement, affichez :
- le nombre d'altitudes lues ;
- l'altitude minimale ;
- l'altitude maximale.
Si aucune altitude n'a été trouvée, affichez un message approprié.
5. Extraire la fréquence cardiaque
La fréquence cardiaque se trouve entre les balises <gpxtpx:hr> et </gpxtpx:hr> dans l'exemple fourni.
<gpxtpx:hr>93</gpxtpx:hr>
Écrivez une fonction qui extrait cette valeur sous forme de chaîne de caractères, puis convertissez-la en entier avec strtol().
Certaines lignes du fichier ne contiennent pas de fréquence cardiaque. Vous devrez donc ignorer les lignes qui ne contiennent pas cette information.
Vous pourrez reprendre le principe de la fonction d'extraction de l'altitude en l'adaptant à la balise recherchée.
6. Calculer la fréquence cardiaque moyenne
Modifiez votre programme pour calculer la fréquence cardiaque moyenne sur l'ensemble du parcours.
Pour cela, vous maintiendrez deux variables :
- la somme des fréquences cardiaques extraites ;
- le nombre de fréquences cardiaques extraites.
À la fin du traitement, calculez la moyenne en divisant la somme par le nombre de valeurs.
Le résultat devra être affiché avec une précision d'une décimale.
Attention : vous ne devez pas diviser par zéro si aucune fréquence cardiaque n'a été trouvée.
7. Résultats attendus
À la fin du programme, affichez un bilan comprenant :
- le nombre d'altitudes extraites ;
- l'altitude minimale et l'altitude maximale ;
- le nombre de fréquences cardiaques extraites ;
- la fréquence cardiaque moyenne.
Les valeurs numériques obtenues dépendront du fichier GPX fourni.
8. Travail complémentaire
Pour ceux qui ont terminé et qui veulent aller plus loin :
- Extrayez également la cadence (
<gpxtpx:cad>). - Calculez la cadence moyenne.
- Comparez le nombre de points contenant une altitude au nombre de points contenant une fréquence cardiaque.
- Modifiez vos fonctions pour qu'elles puissent extraire le contenu de n'importe quelle balise simple, à condition de connaître son nom.
2e partie
TP C — Analyse d'un parcours GPS (partie 2)
Durée : 2 heures
Objectifs
Dans la première partie du TP, vous avez appris à lire un fichier GPX, à extraire des valeurs numériques et à calculer des statistiques simples.
Vous allez maintenant exploiter les coordonnées GPS et les horodatages pour analyser un parcours de course à pied ou de randonnée.
À la fin de cette séance, vous serez capable de :
- calculer la vitesse moyenne d'un parcours ;
- calculer une vitesse moyenne par tronçon temporel ;
- calculer la distance parcourue à partir de coordonnées GPS ;
- calculer une vitesse moyenne par tronçon de distance ;
- calculer le dénivelé positif et négatif par tronçon.
Vous conserverez le principe du traitement séquentiel : le fichier GPX est parcouru progressivement et chaque point est traité dès que ses informations sont extraites.
1. Calculer la vitesse moyenne du parcours
Un fichier GPX contient des points GPS successifs. Chaque point possède notamment une heure d'enregistrement.
La vitesse moyenne est obtenue en divisant la distance parcourue par la durée du parcours.
Travail demandé
- Reprenez le programme de la première partie et extrayez l'heure de chaque point GPS.
- Déterminez l'heure du premier point et celle du dernier point.
- Calculez la durée totale du parcours en secondes.
- Lorsque la distance totale sera disponible, calculez la vitesse moyenne en kilomètres par heure.
Pour calculer une durée, vous pouvez convertir une heure en secondes :
où (h), (m) et (s) représentent respectivement les heures, les minutes et les secondes.
Par exemple, 16 h 26 min 51 s correspondent à :
Attention : la vitesse moyenne du parcours inclut les éventuelles pauses si celles-ci sont comprises entre le premier et le dernier point. Il n'y a pas de pause dans ce fichier.
2. Calculer la distance parcourue à partir des coordonnées GPS
Vous disposez désormais des latitudes et longitudes de chaque point. Cependant, ces coordonnées ne sont pas des distances exprimées en mètres.
Vous devez donc déterminer la distance entre deux points GPS successifs.
2.1. Comprendre les coordonnées géographiques
La latitude indique la position nord-sud et la longitude indique la position est-ouest.
Les coordonnées de votre fichier sont exprimées en degrés. Un degré de latitude représente approximativement 111 kilomètres, tandis que la distance correspondant à un degré de longitude dépend de la latitude.
Il n'est donc pas correct de calculer directement une distance en mètres en soustrayant les coordonnées.
2.2. Convertir les degrés en radians
Les formules trigonométriques utilisées en C attendent des angles exprimés en radians.
La conversion s'effectue avec :
Vous pouvez utiliser la constante :
#define PI 3.14159265358979323846
2.3. Calculer la distance entre deux points
Pour un parcours de proximité, on peut utiliser une approximation adaptée à de courtes distances.
Soient deux points GPS successifs, de coordonnées ((lat_1, lon_1)) et ((lat_2, lon_2)).
Convertissez d'abord leurs coordonnées en radians, puis calculez :
On assimile ensuite la portion de surface terrestre à un plan local :
La distance approximative entre les deux points est :
On prendra (R=6,371,000) mètres, qui correspond au rayon moyen de la Terre.
Les fonctions cos() et sqrt() sont disponibles dans la bibliothèque mathématique standard de C.
2.4. Travail demandé
Écrivez une fonction qui reçoit les coordonnées de deux points et renvoie la distance qui les sépare, en mètres.
Vous pouvez utiliser le prototype suivant :
double distance_gps(double lat1, double lon1,
double lat2, double lon2);
La fonction devra effectuer la conversion en radians avant les calculs trigonométriques.
Parcourez ensuite le fichier GPX et additionnez les distances entre les points successifs pour obtenir la distance totale parcourue.
Important : cette méthode est une approximation locale. Elle convient à cet exercice sur un parcours de course à pied ou de randonnée, mais elle ne constitue pas une méthode universelle pour toutes les distances géographiques.
3. Calculer la vitesse moyenne par tronçon d'une minute
La vitesse moyenne globale ne permet pas de savoir si le coureur a maintenu une allure régulière ou s'il a alterné des phases rapides et lentes.
Vous allez donc calculer une vitesse moyenne pour chaque minute du parcours.
Travail demandé
- Déterminez le temps écoulé depuis le premier point GPS.
- Associez chaque point à un intervalle d'une minute : de 0 à 60 secondes, de 60 à 120 secondes, etc.
- Cumulez la distance parcourue dans chaque intervalle.
- Calculez la vitesse moyenne de chaque intervalle.
- Affichez les résultats sous la forme suivante :
| Minute | Distance parcourue | Vitesse moyenne |
|---|---|---|
| 1 | ... m | ... km/h |
| 2 | ... m | ... km/h |
| 3 | ... m | ... km/h |
Pour simplifier cet exercice, attribuez chaque distance entre deux points successifs à la minute correspondant à l'heure du second point.
Une minute incomplète à la fin du parcours devra être traitée séparément, en utilisant sa durée réelle.
4. Calculer la vitesse moyenne par tronçon d'un kilomètre
Vous savez maintenant calculer la distance entre deux points et la distance cumulée du parcours.
Vous allez utiliser cette information pour découper le parcours en tronçons d'environ un kilomètre.
Travail demandé
- Maintenez une variable contenant la distance cumulée depuis le départ.
- Ajoutez à cette variable la distance entre chaque nouveau point et le point précédent.
- Lorsqu'un kilomètre supplémentaire est atteint, terminez le tronçon en cours.
- Calculez la durée du tronçon à partir des horodatages de ses points de début et de fin.
- Calculez sa vitesse moyenne et affichez le résultat.
Présentez les résultats sous la forme suivante :
| Tronçon | Distance | Durée | Vitesse moyenne |
|---|---|---|---|
| 1 | environ 1 km | ... | ... km/h |
| 2 | environ 1 km | ... | ... km/h |
| 3 | environ 1 km | ... | ... km/h |
Pour cette première version, vous pouvez terminer chaque tronçon au premier point GPS qui atteint ou dépasse le kilomètre visé. La distance réelle du tronçon peut donc être légèrement supérieure à un kilomètre.
La vitesse devra être calculée à partir de la distance réelle du tronçon, et non en supposant systématiquement que celle-ci est exactement égale à un kilomètre.
5. Calculer le dénivelé positif et négatif par kilomètre
L'altitude des points GPS permet d'estimer les montées et les descentes du parcours.
Pour chaque tronçon, vous allez calculer deux valeurs :
- Dénivelé positif (D+) : somme des augmentations d'altitude.
- Dénivelé négatif (D−) : somme des diminutions d'altitude, exprimée comme une valeur positive.
Exemple
Considérons les altitudes successives suivantes :
| Point | Altitude |
|---|---|
| 1 | 350 m |
| 2 | 355 m |
| 3 | 353 m |
| 4 | 360 m |
| 5 | 357 m |
Entre deux points successifs, calculez la variation d'altitude :
- Si (\Delta h>0), ajoutez cette variation au dénivelé positif.
- Si (\Delta h<0), ajoutez sa valeur absolue au dénivelé négatif.
- Si (\Delta h=0), aucune modification n'est nécessaire.
Dans cet exemple :
- D+ = (5+7=12) mètres ;
- D− = (2+3=5) mètres.
Travail demandé
Modifiez votre programme pour calculer, pour chaque tronçon d'environ un kilomètre :
- le dénivelé positif ;
- le dénivelé négatif ;
- la vitesse moyenne ;
- la durée du tronçon.
Affichez un bilan du parcours présentant ces informations pour chaque kilomètre.
Lorsqu'un nouveau tronçon commence, réinitialisez les compteurs de dénivelé tout en conservant l'altitude du point précédent afin de calculer correctement la variation entre deux points successifs.
6. Bilan final
Votre programme devra finalement afficher :
- la distance totale parcourue ;
- la durée totale du parcours ;
- la vitesse moyenne globale ;
- la vitesse moyenne par minute ;
- la vitesse moyenne par tronçon d'environ un kilomètre ;
- le dénivelé positif et négatif de chaque tronçon.
Travail complémentaire
Pour aller plus loin, vous pourrez améliorer le découpage des tronçons afin qu'ils correspondent à des kilomètres exactement mesurés, en estimant la position temporelle et l'altitude au passage de chaque seuil de distance.