Thème : Localisation, cartographie et mobilité

Exercice 3 : Décoder une trame NMEA avec Python

1. Décoder l'heure affichée dans la trame

On considère la trame suivante : $GPRMC,180522.230,A,4329.127733,N,00128.75845,W,,,290220,000.0,W*64

On souhaite créer un programme sur Python qui donne l'heure, la latitude et la longitude de cette trame.

Sur Python, on définit une trame NMEA comme une chaîne de caractère :

  • Trame = "$GPRMC,180522.230,A,4329.127733,N,00128.75845,W,,,290220,000.0,W*64"

que l'on va convertir en liste avec l'instruction Liste=Trame.split(',') :

  • Liste = ['$GPRMC', '180522.230', 'A', '4329.127733', 'N', '00128.75845', 'W', '', '', '290220', '000.0', 'W*64']

Chaque élément de cette liste est une chaîne de caractères.

On applique la fonction suivante à notre exemple :

1
def heure(liste):
2
    heure=int(liste[1][0:2]) #on affecte à la variable heure (définie en tant qu'entier) les 1er et 2ème caractères de la 2ème chaîne de la liste
3
    minute=int(liste[1][2:4])  #on affecte à la variable minute (définie en tant qu'entier) les 3ème et 4ème caractères de la 2ème chaîne de la liste 
4
    seconde=float(liste[1][4:])  #on affecte à la variable seconde (définie en tant que nombre à virgule) les derniers caractères de la 2ème chaîne à partir du 5ème caractère 
5
    print("heure d'envoi : ",heure,"h",minute,"min",seconde,"s")

Explication détaillée de l'instruction heure=int(liste[1][0 :2]) :

Liste[1] correspond au deuxième élément de la liste : c'est la chaîne '180522.230' indiquant l'heure.

Liste[1][0 :2] correspond aux deux premiers éléments de cette chaîne : ‘18'

Int(liste[1][0 :2]) permet de convertir cette chaîne en nombre entier : 18 qui correspond au nombre d'heures.

La valeur stockée dans la variable heure est donc le nombre 18.

Question

Quelles vont les valeurs stockées dans les variables "minute" et "seconde" ?

Solution

minute = 05 car Liste[1][2 :4] correspond aux 3ème et 4ème éléments de cette chaîne : ‘05'

seconde = 22.23 car Liste[1][4 :] correspond aux éléments à partir du 5ème élément de cette chaîne : ‘22.230'

2. Décoder la latitude et la longitude affichées dans la trame

Ouvrir le fichier trame_NMEA.py à télécharger ci-dessous :

trame_NMEA.py

Question

En vous inspirant de la fonction heure, compléter les lignes 10, 11, 12, 13 de la fonction latitude et les lignes 16, 17, 18, 19 de la fonction longitude permettant d'obtenir la latitude et la longitude de la trame au format DMS.

Indice

la fonction round(x,4) permet d'obtenir un arrondi du nombre x avec 4 décimales.

Solution

Voici la correction du programme :

1
# fonction qui affiche l'heure d'envoi de la trame:
2
def heure(liste):
3
    heure=int(liste[1][0:2])
4
    minute=int(liste[1][2:4])
5
    seconde=float(liste[1][4:])
6
    print("heure d'envoi : ", heure,"h",minute,"min",seconde,"s")
7
8
#fonction qui affiche la lattitude:
9
def latitude(liste):
10
    degre=int(liste[3][0:2])
11
    minute=int(liste[3][2:4])
12
    seconde=round(float(liste[3][4:])*60,4)
13
    print("latitude : ", degre,"°",minute,"'",seconde,"'',",liste[4])
14
15
#fonction qui affiche la longitude:
16
def longitude(liste):
17
    degre=int(liste[5][0:3])
18
    minute=int(liste[5][3:5])
19
    seconde=round(float(liste[5][5:])*60,4)
20
    print("longitude : ", degre,"°",minute,"'",seconde,"'',",liste[6])
21
22
#fonction qui regroupe l'heure, l'altitude et la longitude:
23
def decodage(trame):
24
    liste=trame.split(',') #permet la conversion de la chaîne en liste
25
    heure(liste)
26
    latitude(liste)
27
    longitude(liste)
28

Fichier corrigé :

trame_NMEA_correction.py

3. Décoder une trame complète

La fonction decodage convertit la trame en liste et regroupe les autres fonctions précédentes.

Question

Utiliser cette fonction pour obtenir les informations cherchées de la trame.

Solution

En utilisant, dans la console, la fonction decodage, on trouve les informations demandées :

1
>>> decodage("$GPRMC,180522.230,A,4329.127733,N,00128.75845,W,,,290220,000.0,W*64")
2
heure d'envoi :  18 h 5 min 22.23 s
3
latitude :  43 ° 29 ' 7.664 '', N
4
longitude :  1 ° 28 ' 45.507 '', W

4. Recherche du lieu présentée par la trame

Soit la trame $GPRMC,180522.230,A,4329.127733,N,00128.75845,W,,,290220,000.0,W*64

Question

A quel lieu correspondent ces coordonnées ?

Indice

utiliser le site https://www.coordonnees-gps.fr/ pour obtenir la localisation.

5. Recherche de l'événement correspondant à la trame

Pour aller plus loin : cette trame a été envoyée par le smartphone d'un individu.

Question

A quel événement sportif a-t-il assisté ?

Indice

Repérer le site indiqué et en déduire le sport puis rechercher à l'aide de la date et l'heure de la trame l'événement sportif qui a eu lieu.

Solution

L'adresse correspond au stade Jean Dauger de Bayonne (stade de rugby).

La trame nous indique la date : 29 février 2020 et l'heure : 18h05min22s.

Cette trame nous permet donc de situer la personne au match Aviron Bayonnais – Stade Toulousain du Top 14.

PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimerRéalisé avec Scenari (nouvelle fenêtre) modèle documentaire TechnOpale