Les guides des pages d’information — dénivelé, formats de trace et durée — dont les chiffres viennent des règles du moteur et les mesures sont citées avec leur date et leur source.
stableÀ valider
Écran ou section propre à Pathou, pas un composant du design system : à ne pas réutiliser ailleurs. Tous les écrans et sections
// Titre : Guide du dénivelé (DeniveleGuide)
import { DeniveleGuide } from '@pathou/components/Guides';
export default function Exemple() {
return (
<div className="ip-main" style={{ width: 720, maxHeight: 680, overflowY: 'auto' }}>
<DeniveleGuide />
</div>
);
}
Installation
Copie le fichier dans ton projet, ainsi que les tokens qu’il utilise.
import { FLAT_SPEED, LEVELS, LEVEL_LABEL, PRACTICE_LABEL, RIDE_HOURS, SURFACE_SPEED, VAM } from '../lib/difficulty/rules';
import { WAY_CLASS_LABEL } from '../lib/osm/classify';
import { fmt } from '../lib/format';
import { formatHours } from '../lib/time';
import type { Practice, WayClass } from '../lib/types';
/**
* Guides des pages /denivele-trace-gpx, /fichier-trace-gps et /duree-sortie-velo.
* Les chiffres du modèle viennent de ses règles (lib/difficulty/rules.ts) : les pages suivent toute recalibration.
* Les mesures datées (écarts de dénivelé, couchers du soleil) sont citées avec leur date et leur source.
*/
const PRACTICES: Practice[] = ['vtt', 'gravel', 'route'];
const hours = (h: number) => (Number.isInteger(h) ? `${h} h` : formatHours(h).replace(/ /g, ' '));
const pct = (x: number) => `${Math.round(x * 100)} %`;
export function DeniveleGuide() {
return (
<div className="ip-prose">
<p className="modal-lead">
La même trace affiche 1 150 m de dénivelé sur ta montre, 980 m dans une appli et 1 040 m dans une autre. Aucune ne se trompe
vraiment : elles ne prennent pas l’altitude au même endroit, et elles n’additionnent pas les montées de la même façon.
</p>
<section aria-labelledby="d-source">
<h2 id="d-source">D’où vient l’altitude ?</h2>
<p>
<b>L’altimètre barométrique</b> des compteurs et des montres mesure la pression de l’air. Il voit bien les petites bosses, mais la pression change aussi
avec la météo : sur une sortie de plusieurs heures, l’altitude dérive, parfois de plusieurs dizaines de mètres.
</p>
<p>
<b>L’altitude GPS</b>, celle d’un téléphone ou d’un appareil sans baromètre, est la moins précise : elle saute de plusieurs mètres d’un point à
l’autre, même sur le plat.
</p>
<p>
<b>Un modèle numérique de terrain</b> donne l’altitude du sol, mesurée une fois pour toutes par un institut géographique. Il ne dérive pas, mais il
ne vaut que par sa finesse : une maille de 1 m suit le terrain, une maille de 30 m lisse les bosses et peut placer un chemin en
balcon dans la pente. Sur un pont ou dans un tunnel, il donne l’altitude du sol, pas celle de la route.
</p>
</section>
<section aria-labelledby="d-cumul">
<h2 id="d-cumul">Comment on additionne les montées</h2>
<p>
Le dénivelé positif est la somme de toutes les montées. Si l’altitude tremble d’un mètre à chaque point, chaque tremblement compte comme une petite
montée : sur une sortie plate, ce bruit peut ajouter des centaines de mètres qui n’existent pas. Chaque appli lisse donc le profil, et ne compte
une montée qu’au-delà d’un seuil, de quelques mètres. Le lissage et le seuil changent d’une appli à l’autre, et le total avec eux.
</p>
</section>
<section aria-labelledby="d-mesure">
<h2 id="d-mesure">L’écart, mesuré sur des traces réelles</h2>
<p>
Le 13 octobre 2026, Pathou a comparé son dénivelé à celui des altitudes enregistrées, sur ses 12 traces de référence (VTT et gravel, plaine et
montagne) :
</p>
<ul>
<li>
additionnées telles quelles, sans seuil, les altitudes enregistrées donnent 11 % de dénivelé de plus que Pathou en moyenne, et jusqu’à
58 % de plus en plaine, où le bruit pèse le plus ;
</li>
<li>
avec le même seuil de 3 m des deux côtés, Pathou donne 3,6 % de plus que les altitudes enregistrées : de 3 à 13 % de plus en
montagne, de 9 à 12 % de moins en plaine.
</li>
</ul>
<p>Autrement dit, l’essentiel des grands écarts vient de la façon de compter, pas du terrain.</p>
</section>
<section aria-labelledby="d-pathou">
<h2 id="d-pathou">Ce que fait Pathou</h2>
<p>
Pathou n’utilise pas l’altitude de ton fichier quand il peut faire mieux. Il place un point tous les 10 m, le recale sur l’axe du chemin
d’OpenStreetMap quand il le trouve, puis lit l’altitude du modèle de terrain de l’institut national du pays (l’IGN au mètre en France). Il lisse le profil sur environ
70 m, interpole sur les ponts et dans les tunnels, et ne compte une montée qu’au-delà de 3 m. Le résultat ne dépend ni de ton appareil, ni
de la météo du jour de l’enregistrement.
</p>
<p>
Hors des pays couverts, il se rabat sur l’altitude de ton fichier, puis sur un relief mondial plus grossier, et le dit dans la confiance du verdict.{' '}
<a className="hp-link strong" href="/sources">
Les sources d’altitude, pays par pays
</a>
</p>
</section>
<section aria-labelledby="d-croire">
<h2 id="d-croire">Quel chiffre croire ?</h2>
<p>
Pour préparer une sortie, préfère un dénivelé calculé sur un modèle de terrain fin : il est le même pour tout le monde. Pour comparer tes sorties
entre elles, garde le même outil. Un écart de quelques pour cent ne veut rien dire ; un écart de 30 % sur une sortie plate vient presque
toujours du bruit de l’altitude enregistrée.
</p>
<p>
Et le dénivelé total ne dit pas tout : 1 000 m étalés sur 40 km ne se montent pas comme 1 000 m en trois rampes.
Ce qui fait mettre pied à terre, c’est la pente sur une centaine de mètres.{' '}
<a className="hp-link strong" href="/trace-gpx-faisable">
Les pentes à ta portée, niveau par niveau
</a>
</p>
</section>
</div>
);
}
const FORMATS: [format: string, from: string, read: string][] = [
['GPX', 'Le format standard, exporté par toutes les applis (Komoot, Strava, RideWithGPS, Garmin Connect…).', 'Le tracé, l’altitude, le nom et le type d’activité.'],
[
'FIT',
'Le format des compteurs et des montres (Garmin, Wahoo, Hammerhead…), pour les sorties enregistrées comme pour les parcours.',
'Le tracé, l’altitude, le nom du parcours, et le type de vélo (route, gravel, VTT) pour proposer la pratique.',
],
['TCX', 'L’ancien format d’entraînement de Garmin, encore exporté par certaines applis.', 'Le tracé et l’altitude.'],
['KML ou KMZ', 'Google Earth et Google My Maps.', 'Le tracé. Les altitudes toutes nulles de My Maps sont ignorées.'],
['ZIP', '« Exporter l’original » de Garmin Connect, qui emballe le fichier FIT dans une archive.', 'La trace que contient l’archive, sans avoir à la décompresser.'],
];
export function FormatsGuide() {
return (
<div className="ip-prose">
<p className="modal-lead">
Pathou lit les traces GPX, FIT, TCX, KML et KMZ, et les archives zip qui en contiennent une. Le fichier est lu dans ton navigateur : il ne part
sur aucun serveur, quel que soit son format.
</p>
<section aria-labelledby="f-formats">
<h2 id="f-formats">Les formats, et ce que Pathou en lit</h2>
<div className="g-table">
<table>
<thead>
<tr>
<th scope="col">Format</th>
<th scope="col">D’où il vient</th>
<th scope="col">Ce que Pathou en lit</th>
</tr>
</thead>
<tbody>
{FORMATS.map(([f, from, read]) => (
<tr key={f}>
<th scope="row">{f}</th>
<td>{from}</td>
<td>{read}</td>
</tr>
))}
</tbody>
</table>
</div>
<p>
Fréquence cardiaque, puissance, cadence et horaires ne servent pas à l’analyse : Pathou les ignore.
</p>
</section>
<section aria-labelledby="f-trouver">
<h2 id="f-trouver">Où trouver le fichier</h2>
<ul>
<li>
<b>Komoot, Strava, RideWithGPS</b> : l’export GPX se trouve dans le menu de l’itinéraire ou de la sortie, souvent depuis la version web
plutôt que l’appli mobile.
</li>
<li>
<b>Garmin Connect</b> : « Exporter l’original » télécharge un zip qui contient le fichier FIT. Dépose le zip tel quel.
</li>
<li>
<b>Compteur Garmin branché à l’ordinateur</b> : les sorties sont des fichiers FIT, en général dans le dossier « Activities », les
parcours dans « Courses ».
</li>
<li>
<b>Google My Maps</b> : le menu de la carte propose l’export en KML ou KMZ.
</li>
</ul>
</section>
<section aria-labelledby="f-quoi">
<h2 id="f-quoi">Itinéraire préparé ou sortie enregistrée ?</h2>
<p>
Les deux s’analysent. Un itinéraire préparé dans une appli suit les chemins de la carte ; une sortie enregistrée porte le bruit du GPS et les
arrêts. Pathou retire les points immobiles et recale la trace sur l’axe des chemins d’OpenStreetMap, puis prend l’altitude du modèle de terrain du
pays plutôt que celle de ton appareil.{' '}
<a className="hp-link strong" href="/denivele-trace-gpx">
Pourquoi le dénivelé change d’une appli à l’autre
</a>
</p>
<p>
Un fichier qui contient plusieurs traces bout à bout est analysé tant qu’elles se suivent. Si l’une repart ailleurs (un autre jour, un autre
itinéraire), Pathou analyse la première et te signale les autres.
</p>
</section>
<section aria-labelledby="f-gpx">
<h2 id="f-gpx">Repartir avec un GPX</h2>
<p>
Une fois la trace analysée, « Télécharger le GPX » rend un GPX standard, lisible par les GPS et les applis : les positions de ton
fichier, l’altitude du modèle de terrain, et les alternatives que tu as appliquées aux passages trop durs. Sans horaires ni fréquence cardiaque.
C’est aussi une façon de passer d’un FIT à un GPX.
</p>
<p>
Pour montrer la trace et son verdict à quelqu’un, « Partager » crée un lien qui contient la trace elle-même : rien n’est enregistré
chez Pathou, et la personne qui l’ouvre voit le même verdict, recalculé dans son navigateur.
</p>
</section>
</div>
);
}
const SURFACES: WayClass[] = ['route', 'piste_roulante', 'piste_cassante', 'chemin_naturel', 'sentier', 'sentier_technique'];
export function DureeGuide() {
const g = 'gravel';
return (
<div className="ip-prose">
<p className="modal-lead">
Diviser la distance par une vitesse moyenne marche sur une route plate, pas sur une trace de VTT ou de gravel. La durée dépend de trois choses : la
vitesse sur le plat, qui baisse avec le type de chemin, la vitesse de montée, qui se compte en mètres de dénivelé par heure, et les passages à pied.
</p>
<section aria-labelledby="t-plat">
<h2 id="t-plat">Sur le plat, selon le chemin</h2>
<p>
Sur le bitume, Pathou part de ces vitesses, calées sur des sorties réelles en VTT et en gravel. Sur un chemin, il les réduit : en gravel, un intermédiaire roule à{' '}
{FLAT_SPEED[g][1]} km/h sur la route, mais à {pct(SURFACE_SPEED[g].chemin_naturel)} de cette vitesse sur un chemin de terre et à{' '}
{pct(SURFACE_SPEED[g].sentier)} sur un sentier.
</p>
<div className="g-table">
<table>
<caption>Vitesse sur le plat, sur le bitume (km/h)</caption>
<thead>
<tr>
<th scope="col">Pratique</th>
{LEVELS.map((l) => (
<th scope="col" key={l}>
{LEVEL_LABEL[l]}
</th>
))}
</tr>
</thead>
<tbody>
{PRACTICES.map((p) => (
<tr key={p}>
<th scope="row">{PRACTICE_LABEL[p]}</th>
{FLAT_SPEED[p].map((v, i) => (
<td key={i}>{fmt(v, Number.isInteger(v) ? 0 : 1)}</td>
))}
</tr>
))}
</tbody>
</table>
</div>
<div className="g-table">
<table>
<caption>Part de la vitesse sur le bitume, selon le chemin</caption>
<thead>
<tr>
<th scope="col">Chemin</th>
{PRACTICES.map((p) => (
<th scope="col" key={p}>
{PRACTICE_LABEL[p]}
</th>
))}
</tr>
</thead>
<tbody>
{SURFACES.map((c) => (
<tr key={c}>
<th scope="row">{WAY_CLASS_LABEL[c]}</th>
{PRACTICES.map((p) => (
<td key={p}>{pct(SURFACE_SPEED[p][c])}</td>
))}
</tr>
))}
</tbody>
</table>
</div>
</section>
<section aria-labelledby="t-montee">
<h2 id="t-montee">En montée, au dénivelé</h2>
<p>
Dans une montée, le temps se compte surtout au dénivelé : en gravel, un débutant monte environ {fmt(VAM[g][0])} m par heure, un intermédiaire{' '}
{fmt(VAM[g][1])}, un confirmé {fmt(VAM[g][2])} et un expert {fmt(VAM[g][3])}. Pathou y ajoute un peu de temps pour la distance parcourue. En descente, il compte
jusqu’à 1,6 fois plus vite que sur le plat, sauf sur un sentier technique, où l’on ne descend pas plus vite qu’on ne roule.
</p>
<p>
Les montées trop raides pour ton niveau se font à pied : Pathou les compte à 3,5 km/h, ou à 400 m de dénivelé par heure si c’est
plus long. 2 km à pied, c’est plus d’une demi-heure, là où ils se roulent en une dizaine de minutes.
</p>
</section>
<section aria-labelledby="t-pauses">
<h2 id="t-pauses">Les pauses, et la nuit</h2>
<p>
Ce temps est un temps en roulant : les pauses, les crevaisons et les arrêts photo s’y ajoutent. C’est pourquoi Pathou affiche l’heure
d’arrivée sans pause, selon l’heure de départ que tu choisis, et le coucher du soleil à l’arrivée : l’écart entre les deux, c’est le temps qu’il
te reste pour les pauses avant la nuit. Il devient orange sous une heure, rouge quand l’arrivée tombe après le coucher.
</p>
<p>
La différence entre saisons est grande : à Paris, le soleil se couche à 16 h 56 le 21 décembre et à 21 h 57 le 21 juin
(heures de 2026). Une sortie de six heures en roulant qui part à 10 h laisse près de six heures de marge pour les pauses en juin, moins d’une
heure en décembre.
</p>
</section>
<section aria-labelledby="t-niveau">
<h2 id="t-niveau">Quelle durée pour ton niveau ?</h2>
<p>
Une longue sortie n’est pas impossible, puisqu’on peut toujours ralentir, mais elle use. Pathou en tient compte dans son verdict, avec ces repères de
temps en roulant :
</p>
<ul className="g-profiles">
{LEVELS.map((l, i) => (
<li key={l}>
<b>{LEVEL_LABEL[l]}</b> : confortable jusqu’à {hours(RIDE_HOURS[i][0])}, très longue au-delà de {hours(RIDE_HOURS[i][1])}.
</li>
))}
</ul>
<p>
Ces vitesses sont celles d’un cycliste moyen de chaque niveau. Si tu connais ta moyenne, saisis-la dans Pathou : la durée, l’heure d’arrivée et
le verdict suivent.
</p>
</section>
</div>
);
}
Utilisation
import { DeniveleGuide, DureeGuide, FormatsGuide } from './components/Guides';
<DeniveleGuide />Exemples
Guide de la durée (DureeGuide)
// Titre : Guide de la durée (DureeGuide)
import { DureeGuide } from '@pathou/components/Guides';
export default function Exemple() {
return (
<div className="ip-main" style={{ width: 720, maxHeight: 680, overflowY: 'auto' }}>
<DureeGuide />
</div>
);
}
Guide des formats (FormatsGuide)
// Titre : Guide des formats (FormatsGuide)
import { FormatsGuide } from '@pathou/components/Guides';
export default function Exemple() {
return (
<div className="ip-main" style={{ width: 720, maxHeight: 680, overflowY: 'auto' }}>
<FormatsGuide />
</div>
);
}
Guidelines
- MUSTDater et sourcer toute mesure citée (écarts de dénivelé, couchers du soleil).
- MUSTTirer les chiffres du modèle des règles du moteur, pour suivre toute recalibration.
Référence de l’API
DeniveleGuide
Aucune prop.
FormatsGuide
Aucune prop.
DureeGuide
Aucune prop.