Drop a GPX file to score how hilly your route really is.

Drop GPX files here or click to browse
Supports multiple files for comparison
How the Hilliness Score Works

The hilliness score combines three dimensions of what makes a route feel hilly. Each component uses square root scaling, which expands differences between gentle and moderate routes while preserving meaningful separation at the top end — unlike logarithmic scaling, which compresses hard routes into an indistinguishable band near 100.

1. Climb Density (Volume) — 40% weight

Total elevation gained divided by total distance. The most intuitive, universal metric — a marathon with 5,000ft of gain is objectively hillier than one with 1,200ft. Sqrt-scaled with a ceiling of ~264 ft/mi (50 m/km).

score = √(gain_per_km / 50) × 100

2. Gradient-Weighted Intensity — 35% weight

For each climbing segment, the gradient is raised to the power of 1.5 and multiplied by segment distance. The 1.5 exponent captures that steep grades are disproportionately hard without over-penalizing moderate grades. Sqrt-scaled with a ceiling of 8.

raw = Σ(distance_i × gradient_i^1.5) / total_distance  →  score = √(raw / 8) × 100

3. Climb Continuity — 25% weight

Measures how sustained the climbs are. A route with one long 2km climb feels much hillier than one with twenty 100m bumps, even if total climbing distance is the same. Uses a power-sum formula where each climb's length is raised to p=1.3, naturally rewarding longer climbs disproportionately without arbitrary blending of statistics. Sqrt-scaled with a ceiling of 500.

metric = Σ(climb_length^1.3) / total_climb_distance  →  score = √(metric / 500) × 100

Why Square Root Scaling?

Linear scaling compresses gentle-to-moderate routes into a narrow band at the bottom. Logarithmic scaling fixes the bottom but over-compresses the top — routes with 130 and 260 ft/mi gain both hit the ceiling. Square root scaling strikes the right balance: the jump from flat to rolling is still amplified, while genuinely harder routes maintain meaningful separation (210 ft/mi scores 89, not 100).

Pre-processing

GPS elevation data goes through three filtering passes. First, a median filter (window size 7) removes sharp elevation spikes caused by GPS drift during watch pauses. Second, a moving average (window size 5) smooths remaining noise. Third, a 3-meter dead-band threshold eliminates GPS wobble — small oscillations under 3m (~10ft) that aren't real terrain changes but accumulate into significant phantom elevation gain. This approach mirrors Strava's elevation correction and produces gain figures consistent with corrected industry values. Sub-1.5ft segments are discarded as GPS jitter. Only uphill segments (>0.5% grade) contribute to the score.

Score Ranges

0–15 Flat  ·  15–30 Nearly Flat  ·  30–45 Gently Rolling  ·  45–60 Rolling  ·  60–70 Hilly  ·  70–82 Very Hilly  ·  82–100 Mountainous