Nouvelles options exclusives --morceaux N et --duree-morceau MIN : le trajet est découpé en morceaux de même durée de trajet, rendus chacun dans sa propre vidéo (sortie_1.mp4, sortie_2.mp4, ...) avec un cadrage sur la portion et uniquement les villes qui s'y trouvent. L'aiguille ne retombe à 0 qu'aux extrémités réelles du trajet. Closes #1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
99 lines
5.8 KiB
Markdown
99 lines
5.8 KiB
Markdown
# GPX - Compteur de vitesse
|
||
|
||
<table>
|
||
<tr>
|
||
<td width="50%">
|
||
<img src="docs/exemple.png" alt="Image extraite de la vidéo d'exemple (trajet Brest - Plabennec)" width="100%">
|
||
</td>
|
||
<td width="50%" valign="top">
|
||
<p>Script Python transformant une trace GPX en vidéo MP4 carrée 1024×1024, prête à être incrustée dans un autre montage.</p>
|
||
<p>Trace blanche sur fond noir, cercle blanc qui suit le trajet, compteur de vitesse à aiguille et noms des villes traversées.</p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
|
||
## Table des matières
|
||
|
||
- [Fonctionnalités](#fonctionnalités)
|
||
- [Installation](#installation)
|
||
- [Utilisation](#utilisation)
|
||
- [Structure du projet](#structure-du-projet)
|
||
|
||
## 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.
|
||
- 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](https://nominatim.org/) (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, 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](https://ffmpeg.org/) accessible dans le `PATH`.
|
||
|
||
```powershell
|
||
python -m venv .venv
|
||
.venv\Scripts\Activate.ps1
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
## Utilisation
|
||
|
||
```powershell
|
||
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` | — | découpe le trajet en N vidéos de même durée de trajet |
|
||
| `--duree-morceau`| — | découpe en morceaux égaux d'au plus N minutes de trajet |
|
||
|
||
Exemple : `python gpx_video.py trace.gpx -o balade.mp4 --duree 90 --fps 25 --zoom-villes`
|
||
|
||
Découpage : `python gpx_video.py trace.gpx --morceaux 3` produit `trace_1.mp4`, `trace_2.mp4`, `trace_3.mp4` (avec `-o balade.mp4` : `balade_1.mp4`, ...). `--duree-morceau 120` sur un trajet de 10 h 15 donne 6 morceaux d'environ 1 h 42. Les deux options sont exclusives. Chaque ville est affectée au morceau où le véhicule passe à son étiquette.
|
||
|
||
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.
|
||
|
||
### Traitement par lot (PowerShell)
|
||
|
||
`gpx_video.ps1` génère une vidéo pour chaque fichier `*.gpx` du **répertoire courant**, 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).
|
||
|
||
```powershell
|
||
cd D:\Traces\Septembre
|
||
& "H:\...\GPX - Compteur de vitesse\gpx_video.ps1"
|
||
& "H:\...\GPX - Compteur de vitesse\gpx_video.ps1" --duree 90 --zoom-villes
|
||
```
|
||
|
||
Les arguments sont transmis tels quels à `gpx_video.py` pour chaque trace (sauf `-o`, qui écraserait la même sortie). 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
|
||
```
|