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 ######")