Summary
4,448 kmDirectional road length (two-way counted twice)
1.6%Median |gradient|
22.92%above 5% (1,020 km)
8.51%above 10% (379 km)
75,974 mCumulative ascent (directional)
This report uses the Transport Department's official Road Network (2nd Generation) centrelines with the Lands Department 5 m DTM, splitting every road into 100 m segments and computing longitudinal gradients, counted per travel direction (two-way roads once in each direction). All work is in Hong Kong 1980 Grid (EPSG:2326).
Last updated: 2026-09-14 · Road data revision cut-off: 2026-08-27 (Transport Department)
1. Data
| Layer | Source |
| Road centrelines (primary) | Transport Department Road Network (2nd Generation) — CENTERLINE layer, 36,471 features (FGDB). Revision cut-off 2026-08-27 |
| Travel direction | TRAVEL_DIRECTION: 1 = both directions; 3 = only in the digitised direction (one-way); 2 = only against it; 4 = not permitted (per TD rdnet_dataspec.pdf) |
| Elevation | Lands Department DTM 5 m (12,751 × 9,601 cells, ~302 MB) |
| CRS | Hong Kong 1980 Grid (EPSG:2326) — the road data is already in this CRS, so no datum transformation is needed |
| Validation | Tai Mo Shan 958 m, Lantau Peak 933 m, Victoria Peak 552 m — matches official heights |
| Cross-check dataset | OpenStreetMap Hong Kong (Geofabrik), also processed at 100 m segments |
Tunnel handling (important)
The DTM only represents the ground surface, so no valid elevation exists for road inside a tunnel (sampling returns the mountain above it, producing bogus gradients). All in-tunnel segments are therefore removed. Only 277 features in the official data are named "…Tunnel" (e.g. Aberdeen Tunnel, Cross-Harbour Tunnel); Tai Lam Tunnel, Eagle's Nest Tunnel, Lung Shan Tunnel, Tseung Kwan O–Lam Tin Tunnel and Nam Wan Tunnel are stored under the connecting road's name, so a name filter cannot find them.
Solution: extract all 3,808 road tunnel geometries from OpenStreetMap (tunnel=yes, railway tunnels excluded), reproject to EPSG:2326, buffer by 15 m, and drop any segment whose midpoint falls inside the mask — 252 km removed, matching OSM's 255.9 km of tunnelled road (a 30 m buffer would have wrongly removed ~125 km of surface roads beside tunnels).
After this step, zero segments remain inside tunnels.
2. Method
2.1 Segmentation and sampling
Each centreline is resampled into 100 m segments (51,498 in total). Elevations at both ends are read from the DTM by bilinear interpolation; gradient = Δelevation ÷ horizontal length × 100%. The long baseline greatly reduces the effect of the DTM's ±5 m vertical accuracy.
To avoid dropping short links, any road or connector shorter than 100 m is kept as a single segment (minimum 10 m), and each road's tail is retained. Total line length is therefore 3,451 km — about 93% of the official network (~3,887 km); strict truncation would cut coverage to roughly 58%.
2.2 Directional counting (two-way counted twice)
- Two-way (TRAVEL_DIRECTION = 1, 998 km): each segment yields both +g and −g, and its length counts twice.
- One-way (= 3, 2,453 km): counted once, sign along the digitised direction (= direction of travel).
Line length 3,451 km becomes 4,448 km directional. The distribution is symmetric (p05 = -10.13%, p95 = 10.07%), confirming the treatment.
2.3 Smoothing and binning
DTM sampled after 25 m NaN-aware box smoothing. Bins are 1% wide, centred on whole percentages (0 = −0.5% to +0.5%); values beyond ±10% are pooled into the two overflow bins.
2.4 Tooling
No QGIS package exists for this ARM64 host, so the GDAL Python stack is used (pyogrio, rasterio, scipy, pyproj) — the same GDAL algorithms QGIS uses internally.
3. Results
3.1 Territory-wide gradient map
Red = uphill, blue = downhill. Two-way roads are coloured by their uphill (positive) gradient; one-way roads keep the sign of the legal direction of travel. Basemap: hillshade of the Lands Department 5 m DTM; water and coastline from OpenStreetMap.
Download high-resolution version (3000 × 2100 PNG)
3.2 Absolute steepness version (colour scale 0–10%)
Download high-resolution version (3000 × 2100 PNG)
3.3 Signed gradient distribution (100 m segments)
3.4 Full bin table
| Gradient bin | Directional length (km) | Share |
|---|
| < -10% | 170.4 | 3.83% |
| -10 | 39.5 | 0.89% |
| -9 | 43.4 | 0.97% |
| -8 | 55.1 | 1.24% |
| -7 | 65.2 | 1.47% |
| -6 | 83.5 | 1.88% |
| -5 | 103.7 | 2.33% |
| -4 | 125.9 | 2.83% |
| -3 | 167.8 | 3.77% |
| -2 | 259.4 | 5.83% |
| -1 | 492.9 | 11.08% |
| 0 | 1,234.6 | 27.75% |
| +1 | 501.4 | 11.27% |
| +2 | 252.3 | 5.67% |
| +3 | 170.6 | 3.83% |
| +4 | 119.4 | 2.68% |
| +5 | 99.2 | 2.23% |
| +6 | 87.7 | 1.97% |
| +7 | 68.7 | 1.54% |
| +8 | 54.3 | 1.22% |
| +9 | 43.4 | 0.98% |
| +10 | 39.5 | 0.89% |
| > +10% | 170.3 | 3.83% |
Negative = downhill, positive = uphill; x labels are bin centres in whole percent.
3.5 Cross-check: official vs OpenStreetMap (both 100 m)
| Metric | Official (Transport Dept) | OpenStreetMap |
|---|
| Directional samples | 66,653 | 62,240 |
| Directional km | 4,448 | 5,867 |
| Median |grade| | 1.60% | 1.41% |
| p75 | 4.82% | 4.92% |
| p90 | 10.10% | 10.53% |
| p95 | 14.55% | 14.58% |
| p99 | 29.29% | 23.71% |
| |坡道| > 5% | 22.92% (1,020 km) | 23.85% |
| |坡道| > 10% | 8.51% (379 km) | 10.23% |
| 尾部 < −10% / > +10% | 3.83% / 3.83% | 4.71% / 4.69% |
Two independent road datasets give close results (medians differ by 0.14 percentage points), indicating the findings are robust.
3.6 Exceedance
| Threshold | Share | Length (km) |
|---|
| |坡道| > 1% | 58.71% | 2,612 |
| |坡道| > 2% | 43.35% | 1,928 |
| |坡道| > 3% | 34.16% | 1,519 |
| |坡道| > 4% | 27.80% | 1,237 |
| |坡道| > 5% | 22.92% | 1,020 |
| |坡道| > 6% | 18.60% | 827 |
| |坡道| > 7% | 15.19% | 676 |
| |坡道| > 8% | 12.51% | 556 |
| |坡道| > 9% | 10.39% | 462 |
| |坡道| > 10% | 8.51% | 379 |
3.7 Steepest roads (official names)
| Road (official name) | Directional km | Median |grade| | p90 |
|---|
| WAN CHAI GAP ROAD | 1.99 | 24.00% | 36.91% |
| CHUN FAI ROAD | 0.58 | 20.16% | 28.46% |
| GLENEALY | 0.86 | 19.92% | 43.45% |
| YAU ON STREET | 0.55 | 18.39% | 25.39% |
| EASTERN STREET | 0.65 | 16.62% | 29.76% |
| TONG BIN LANE | 0.51 | 16.45% | 22.42% |
| POKFIELD ROAD | 0.71 | 16.12% | 20.86% |
| SHA TIN HEIGHTS ROAD | 0.50 | 15.48% | 30.40% |
| CONSORT RISE | 0.51 | 15.45% | 23.04% |
| LEE CHI ROAD | 0.51 | 15.28% | 21.14% |
| SCENIC VILLA DRIVE | 0.58 | 15.22% | 19.65% |
| LOK MAN ROAD | 0.58 | 14.74% | 42.13% |
| BLUFF PATH | 0.59 | 14.09% | 19.81% |
| PAK SHEK TOI ROAD | 0.54 | 13.98% | 20.20% |
| TAI MO SHAN ROAD | 1.02 | 13.55% | 16.70% |
| SHEUNG SZE WAN ROAD | 1.50 | 13.46% | 15.03% |
| KAI YUEN STREET | 0.55 | 13.18% | 34.59% |
| PAK LOK PATH | 0.72 | 12.93% | 16.26% |
| HONG KIN ROAD | 2.69 | 12.68% | 28.03% |
| BELLEVIEW DRIVE | 0.95 | 12.59% | 21.44% |
4. By road class (OSM supplement — the official data has no class field)
| Road class (OSM) | Directional km | Median |grade| | p90 | >5% | >10% |
|---|
| motorway | 245.0 | 0.95% | 4.36% | 8.1% | 2.0% |
| trunk | 69.2 | 1.68% | 6.77% | 19.1% | 2.2% |
| primary | 188.7 | 1.21% | 6.40% | 16.3% | 3.3% |
| secondary | 544.4 | 1.76% | 9.73% | 26.1% | 9.0% |
| tertiary | 489.6 | 1.48% | 8.74% | 24.7% | 7.1% |
| residential | 690.1 | 1.81% | 11.19% | 28.0% | 11.7% |
| unclassified | 1,060.9 | 1.73% | 11.16% | 27.1% | 11.9% |
| service | 2,452.6 | 1.15% | 11.63% | 23.1% | 11.8% |
| motorway_link | 76.6 | 2.08% | 7.39% | 20.6% | 5.3% |
| primary_link | 22.8 | 1.38% | 6.81% | 14.9% | 3.6% |
| trunk_link | 22.0 | 2.70% | 9.00% | 23.8% | 7.8% |
5. Reference: road speed limit map
For reference, the map below shows the statutory signed speed limits from the Transport Department's Road Network (2nd Generation) SPEED_LIMIT layer:
- Red 30 km/h, orange 70, green 80, blue 100, purple 110 (signed sections)
- Grey = the rest of the network — Hong Kong's statutory default speed limit is 50 km/h for roads without signs, so the layer only covers 860 km (4,338 sections) of signed road
Download high-resolution version (3000 × 2100 PNG)
| Speed limit | Sections | Length (km) | Notes |
|---|
| 30 km/h | 303 | 34.5 | school zones, pedestrian areas, private roads |
| 70 km/h | 2,204 | 337.5 | main urban distributor roads |
| 80 km/h | 1,288 | 340.9 | major New Territories roads, expressways |
| 100 km/h | 465 | 120.1 | expressways (e.g. Tolo Highway) |
| 110 km/h | 78 | 27.1 | highest-limit sections, e.g. North Lantau Highway |
| 50 km/h | — | — | roads without a sign (statutory default) |
Speed limits reflect the 2026-08-27 revision and include in-tunnel sections (speed limits are statutory and apply inside tunnels too — unlike the gradient analysis, which must exclude them). Limits can change under temporary traffic arrangements.
6. Limitations
- Roads and connectors shorter than 100 m are kept whole, so a minority of segments are shorter than 100 m (minimum 10 m); total length 3,451 km is about 93% of the official network.
- DTM vertical accuracy ±5 m: much less influential at a 100 m baseline, though bridges and retaining walls can still produce outliers.
- All in-tunnel segments excluded (252 km, verified against an OSM tunnel mask); bridge decks and elevated roads remain included, because the DTM records them as terrain.
- Gradients are average slopes over 100 m and do not capture very short steep pitches; travel directions reflect the 2026-08-27 revision, so temporary traffic arrangements may not be captured.
7. Reproducibility
grade_gov.py 100 — official FGDB → 100 m segmentation → DTM sampling → directional gradients
plots_100.py — binning, histogram, official vs OSM comparison
make_map.py — gradient maps (hillshade, scale bar, urban detail inset)
make_speed_map.py — speed limit map (SPEED_LIMIT layer)
- Data:
segments_gov_100m.csv, summary_gov_100m.json, summary_compare_100m.json
- Segment-level GeoJSON/CSV (by street or district) available on request
Questions, or want a specific street or district analysed? Contact us.