Traccar export - conversion au format gpx

Ayant installer l’environnement Traccar Serveur qui permet d’obtenir des relevés d’itinéraires (voiture ou autres), j’ai été surpris qu’il ne soit pas possible de réaliser des exports au format gpx. Le seul format proposé est le format excel xlsx.
Pour palier à cela voici un script python (python3) qui permet d’obtenir un fichier gpx à partir du fichier xlsx de l’export.

Ce script fonctionnement dans un environnement linux et avec python3 . Les modules python nécessaires sont les modules os, pandas et datetime.

Pour utiliser ce script il faut ouvrir le fichier du script et personnaliser son identité (ligne 19) l’identification du portable (ligne 20) et le chemin (informatique) d’accès au répertoire de travail où devront se trouver le script et le fichier export.xlsx obtenu à l’export (respect du nom de fichier nécessaire) .
Le fichier gpx obtenu est le fichier chemin.gpx qui se trouve dans le même répertoire.
Le script s’exécute dans la console par la commande python3 traccar_xslx2gpx.py

Comme je n’arrive pas à joindre le fichier du script à ce post, voici le détail de ce script (utilisable en copier/coller):


#!/usr/bin/env python3
## adapté à python3 sous linux
## programme traccar_xslx2gpx.py
## auteur R CHEYROU
## date janvier 2025
## genere un fichier gpx lisible avec QMapShack par exemple
##

print("###### début du traitement ######")

import os
import pandas as pd
import datetime

## initialisation des variables

now = datetime.datetime.now()
maintenant = now.strftime("%Y-%m-%dT%H:%M:%SZ")
moi = " *** mon nom ou autre *** "
portable = " *** reference du portable *** "
repertoire = ' *** le chemin *** '

#      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
mval=["","","","","","","","","","","","","","",""]

## variable pour le formatage GPX
balise_0_o = "<metadata>"
balise_0_f = "</metadata>"
balise_1_o = "<gpx>"
balise_1_f = "</gpx>"
balise_2_o = "<trk>"
balise_2_f = "</trk>"
balise_3_o = " <trkseg>"
balise_3_f = " </trkseg>"
balise_4_a = "  <trkpt lat='"
balise_4_b = "' lon='"
balise_4_c = "'>"
balise_4_f = "  </trkpt>"
balise_5_o = "   <time>"
balise_5_f = "</time>"
balise_6_o = "   <ele>"
balise_6_f = "</ele>"
balise_7_o = "   <extensions>"
balise_7_f = "   </extensions>"
balise_8_o = "     <speed>"
balise_8_f = "</speed>"
balise_9_o = "     <batterylevel>"
balise_9_f = "</batterylevel>"
balise_10_o = " <name>"
balise_10_f = "</name>"
balise_11_o = " <time>"
balise_11_f = " </time>"
balise_12   = "<?xml version='1.0' encoding='UTF-8' standalone='no' ?>"


## définition des fichiers d'entrée de sortie et intermédiaire
filenamein = repertoire + 'report.xlsx'
filename = repertoire + 'gpx_source.txt'
filenameout = repertoire + "chemin.gpx"


## génération du fichier txt à partir du fichier xlsx
df = pd.read_excel(filenamein, sheet_name='Robert')
with open(filename, 'w') as outfile:
    df.to_string(outfile)

# ouverture  des fichiers
source = open(filename, 'r')
resultat = open(filenameout, 'w')

# initialisation du fichiers .gpx
resultat.write(balise_12)
resultat.write("\n" + balise_1_o)
resultat.write("\n" + balise_0_o)
resultat.write("\n" + balise_11_o + maintenant + balise_11_f)
resultat.write("\n" + balise_10_o + moi + balise_10_f)
resultat.write("\n" + balise_0_f)
resultat.write("\n" + balise_2_o)
resultat.write("\n" + balise_10_o + portable + balise_10_f)



resultat.write("\n" + balise_3_o)
lines = source.readlines()
nl = 0 # num ligne

## boucle de lecture des lignes dans le fichiers txt
for line in lines:
    mligne = line
 #   print(mligne)                          ## à decommenter pour debug

    nc = 0 # numero de caractère
    nm = 0 # numéro de mot
    mtemp = ""
    mt = ""
    mta = ""
    if nl > 6 :
       ## boucle d'analyse de la ligne courante caractère par caractère et extraction des valeurs
       while nc < len(mligne) :
          mt = mligne[nc:nc+1]
 #         print(nc," ",mt)                 ## à decommenter pour debug
          if mt != " " :
             mtemp = mtemp + mt
 #            print(nc," ",mt," > ",mtemp)  ## à decommenter pour debug
          else :
             if mta != " " :
 #               print(mtemp)               ## à decommenter pour debug
                mval[nm] = mtemp
                mtemp = ""
                nm = nm + 1
          mta = mt
          nc = nc + 1
       ## fin boucle d'analyse de la ligne courante
       mjour  = mval[2]
       mheure = mval[3]
       mlat   = mval[4]
       mlong  = mval[5]
       mvit   = mval[7]
       malt   = mval[6]
       mbat   = mval[11]
 #      print("date et heure:",mjour," et ",mheure," | lattitude:",mlat," longit:",mlong," | vitesse:",mvit," - altitude:",malt," | charge:",mbat )   ## à decommenter pour debug

       ## écriture des valeurs dans le fichier gpx au format gpx
       resultat.write("\n" + balise_4_a + mlat + balise_4_b + mlong + balise_4_c )
       resultat.write("\n" + balise_5_o + mjour + "T" + mheure + "Z" + balise_5_f)
       resultat.write("\n" + balise_6_o + malt + balise_6_f)
       resultat.write("\n" + balise_7_o)
       resultat.write("\n" + balise_8_o + mvit + balise_8_f)
       resultat.write("\n" + balise_9_o + mbat[13:17] + balise_9_f)
       resultat.write("\n" + balise_7_f)
       resultat.write("\n" + balise_4_f)

    nl = nl + 1
## fin boucle de lecture des lignes

# cloture du fichiers .gpx
resultat.write("\n" + balise_3_f)
resultat.write("\n" + balise_2_f)
resultat.write("\n" + balise_1_f)

# fermeture des fichiers
source.close()
resultat.close()

print("###### fin du traitement ######")