Go to file
2026-09-24 23:41:24 +02:00
docs ajout exemple 2026-09-17 10:23:50 +02:00
.gitignore ajout script powershell pour execution sous windows 2026-09-23 18:12:26 +02:00
gpx_video.ps1 splitt de vidéo 2026-09-23 19:01:24 +02:00
gpx_video.py Compteur à 0 si la trace ne bouge pas 2026-09-24 23:41:24 +02:00
README.md Compteur à 0 si la trace ne bouge pas 2026-09-24 23:41:24 +02:00
requirements.txt version initiale 2026-09-17 10:21:28 +02:00

GPX - Compteur de vitesse

Image extraite de la vidéo d'exemple (trajet Brest - Plabennec)

Script Python transformant une trace GPX en vidéo MP4 carrée 1024×1024, prête à être incrustée dans un autre montage.

Trace blanche sur fond noir, cercle blanc qui suit le trajet, compteur de vitesse à aiguille et noms des villes traversées.

Table des matières

Fonctionnalités

  • Lecture GPX 1.0 / 1.1 (points trkpt horodatés).
  • Vitesse issue de l'extension gpxtpx:speed (m/s, ex. GeoRide) si présente, sinon calculée à partir des distances et des temps ; lissage léger. Aux arrêts (trace immobile, moins de 3 km/h en moyenne entre deux points), le compteur retombe à 0, même si le GPS n'a enregistré aucun point pendant la pause.
  • Vidéo accélérée à durée fixe (60 s par défaut) : le trajet complet est parcouru du début à la fin.
  • Compteur analogique 0-200 km/h (paramétrable), aiguille et vitesse numérique, placé automatiquement dans le coin le moins encombré par la trace ; l'aiguille part de 0 et y revient sur la première et la dernière seconde.
  • Villes traversées obtenues par géocodage inverse Nominatim (OpenStreetMap), affichées sur la carte dès le début, avec placement des étiquettes qui évite chevauchements et trace.
  • Option zoom : à l'arrivée du véhicule dans une ville, son nom s'affiche en grand au centre de l'image (moitié de la largeur), avec fondu d'apparition et de disparition.
  • Découpage des longs trajets en plusieurs vidéos (de même durée de trajet ou avec un nombre de villes donné), chacune cadrée sur sa portion et n'affichant que ses villes (évite les noms qui se superposent) ; l'aiguille ne retombe à 0 qu'au vrai début et à la vraie fin du trajet.
  • Cache des villes dans <trace>.villes.json : les exécutions suivantes n'accèdent plus au réseau.
  • Rendu anticrénelé (suréchantillonnage ×2), encodage H.264 yuv420p via ffmpeg, sans fichiers intermédiaires.

Installation

Prérequis : Python 3.10+ et ffmpeg accessible dans le PATH.

python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt

Utilisation

python gpx_video.py Trajet_16-09-2026_15h38.gpx

Produit Trajet_16-09-2026_15h38.mp4 à côté du GPX.

Option Défaut Rôle
-o, --sortie nom du GPX en .mp4 fichier de sortie
--duree 60 durée de la vidéo, de chaque morceau si découpage (s)
--fps 30 images par seconde
--vmax 200 graduation max du compteur (km/h)
--sans-villes — ne pas géocoder ni afficher les villes
--zoom-villes — nom de la ville en grand quand le véhicule y arrive
--duree-zoom 2 durée d'affichage du nom zoomé (secondes de vidéo)
--morceaux N — découpe le trajet en N vidéos de même durée de trajet
--duree-morceau MIN — découpe en morceaux égaux d'au plus MIN minutes de trajet
--villes-par-morceau [N] 20 si N omis découpe en morceaux d'au plus N villes chacun

Exemple : python gpx_video.py trace.gpx -o balade.mp4 --duree 90 --fps 25 --zoom-villes

Notes :

  • Le premier lancement interroge Nominatim (1 requête/s, un point par km de trajet) : compter environ 1 s par km.
  • En cas d'erreurs réseau, la vidéo est générée sans villes et le cache n'est pas écrit. Supprimer <trace>.villes.json pour forcer un nouveau géocodage.
  • Les itinéraires planifiés (ex. export Liberty Rider en <rte>) ne contiennent pas d'horodatage et sont refusés : il faut une trace enregistrée.

Découpage en plusieurs vidéos

Sur un long trajet, la carte entière est trop petite et les noms de villes se superposent. Le trajet peut alors être découpé en plusieurs vidéos, chacune cadrée sur sa portion de trace et n'affichant que les villes de cette portion. Trois modes, exclusifs entre eux :

Mode Coupe Exemple (trajet de 10 h 15, 66 villes)
--morceaux N N morceaux de même durée de trajet --morceaux 3 → 3 × 3 h 25
--duree-morceau MIN morceaux égaux d'au plus MIN minutes de trajet --duree-morceau 120 → 6 × 1 h 42
--villes-par-morceau [N] groupes d'au plus N villes consécutives (20 si N omis) --villes-par-morceau → 4 morceaux de 16-17 villes
python gpx_video.py trace.gpx --villes-par-morceau          # 20 villes max par vidéo
python gpx_video.py trace.gpx --villes-par-morceau 10 --zoom-villes
python gpx_video.py trace.gpx --morceaux 3 -o balade.mp4    # balade_1.mp4 … balade_3.mp4
  • Fichiers produits : <sortie>_1.mp4, <sortie>_2.mp4… (numéros complétés de zéros au-delà de 9 morceaux). Une seule vidéo, sans suffixe, si le découpage ne donne qu'un morceau.
  • --duree fixe la durée de chaque vidéo : les morceaux d'un même trajet n'ont donc pas la même vitesse de défilement si leurs durées de trajet diffèrent (cas de --villes-par-morceau).
  • --villes-par-morceau équilibre les groupes plutôt que de remplir les premiers : 66 villes avec N = 20 donnent 16, 17, 17 et 16 villes, et non 20, 20, 20 et 6. La coupure se place à mi-temps entre la dernière ville d'un morceau et la première du suivant. Sans villes (--sans-villes ou géocodage en échec), ce mode est ignoré avec un avertissement et une seule vidéo est produite.
  • Chaque ville est affectée au morceau où le véhicule passe à son étiquette ; une ville à cheval sur une coupure n'apparaît que dans un des deux morceaux.
  • L'aiguille ne part de 0 qu'au début du premier morceau et n'y revient qu'à la fin du dernier.

Traitement par lot (PowerShell)

gpx_video.ps1 génère les vidéos de chaque fichier *.gpx du répertoire courant, avec zoom sur les villes (--zoom-villes) et découpage en morceaux d'au plus 20 villes (--villes-par-morceau 20), avec le Python du venv .venv placé à côté du script (créé et équipé de requirements.txt automatiquement s'il n'existe pas ; inutile de l'activer).

cd D:\Traces\Septembre
& "H:\...\GPX - Compteur de vitesse\gpx_video.ps1"
& "H:\...\GPX - Compteur de vitesse\gpx_video.ps1" --duree 90
& "H:\...\GPX - Compteur de vitesse\gpx_video.ps1" --morceaux 3

Les arguments sont transmis tels quels à gpx_video.py pour chaque trace (sauf -o, qui écraserait la même sortie). Une autre option de découpage (--morceaux, --duree-morceau, --villes-par-morceau N) ou --sans-villes remplace le découpage par défaut. Les traces en échec sont listées à la fin et le script retourne le code 1. En cas d'erreur, la fenêtre reste ouverte jusqu'à un appui sur Entrée (utile en double-clic / « Exécuter avec PowerShell ») ; pas de pause avec -NonInteractive.

Si la politique d'exécution bloque le script : powershell -ExecutionPolicy Bypass -File gpx_video.ps1.

Structure du projet

gpx_video.py                        script principal (lecture GPX, villes, rendu, encodage)
gpx_video.ps1                       traitement par lot des GPX du répertoire courant
requirements.txt                    dépendances Python (numpy, Pillow)
docs/exemple.png                    image extraite de la vidéo d'exemple (README)
Trajet_16-09-2026_15h38.gpx         trace d'exemple (GeoRide)
Trajet_16-09-2026_15h38.villes.json cache des villes de l'exemple
Trajet_16-09-2026_15h38.mp4         vidéo générée pour l'exemple