Short answer

Slope in degrees is the angle of the surface measured from horizontal, ranging 0–90 and computed as arctan(rise/run). Percent slope is the same rise/run ratio expressed as a percentage, with no upper limit. They are two encodings of the same gradient, and they diverge sharply at steep angles: 45° equals 100%, but a near-vertical face approaches 90° while percent races toward infinity. Mixing them up — labelling a percent raster as degrees, or applying a degree threshold to a percent layer — produces results that are quietly, badly wrong.

The two formulas

Slope is derived from the maximum rate of elevation change across a DEM cell and its neighbours. Once you have that rate as a rise/run (the tangent of the angle):

  • Degrees: slope_deg = arctan(rise / run) × (180 / π)
  • Percent: slope_pct = (rise / run) × 100 = tan(slope_deg) × 100

The relationship between them is the tangent function, which is why it is non-linear:

DegreesPercent
0%
5.71°10%
10°17.6%
26.57°50%
30°57.7%
45°100%
60°173%
80°567%
90°

The key intuition: in the gentle range the two scales track roughly together, but past 45° percent values explode. A "200% slope" sounds alarming until you realise it is about 63° — steep, but finite. Conversely, equal intervals mean different things: 0–10° spans 0–17.6%, while 80–90° spans 567% to infinity.

Converting

degrees = atan(percent / 100) in radians, then × 180/π
percent = tan(degrees in radians) × 100

In a QGIS raster calculator (input slope_pct in percent, output degrees):

atan("slope_pct@1" / 100) * 180 / 3.14159265

Which unit each field expects

Neither unit is "correct" in general; each discipline has a convention, and using the wrong one breaks comparison against published thresholds:

  • Civil engineering, roads, rail, drainage: almost always percent (or its cousin, the ratio like 1:20). Road maximum grades, ramp standards, and pipe falls are specified in percent. Accessibility ramps (e.g. common building codes) cap at small percentages.
  • Geotechnics and slope stability: degrees, because the angle of repose, friction angle, and failure-plane analysis are all angular. A talus angle of repose around 34–37° has no natural percent expression.
  • Agriculture and soil erosion (e.g. USLE-family models): historically percent, as their slope-factor equations were calibrated on percent.
  • Cartography and general terrain visualisation: degrees is the common default in most GIS slope tools.
  • Skiing, trails, accessibility communication: percent for gradient signage, degrees for technical difficulty.

The practical rule: find out which unit the downstream threshold is written in, and produce slope in that unit. Never compare a slope layer against a threshold without confirming both are in the same units.

Computing slope, with the units controlled

All slope algorithms need the horizontal units and vertical units to match (both metres, or both feet). If your DEM is in a geographic CRS (degrees of lat/lon) the horizontal "run" is in degrees while the "rise" is in metres — the result is meaningless. Reproject to a projected CRS first, or use a tool's scale factor.

GDAL. gdaldem slope defaults to degrees; add -p for percent:

# degrees
gdaldem slope dem.tif slope_deg.tif -compute_edges
# percent
gdaldem slope dem.tif slope_pct.tif -p -compute_edges

If the DEM is geographic (EPSG:4326) but elevation is in metres, add -s 111120 as an approximate scale (degrees-to-metres) — but reprojecting to UTM with gdalwarp -t_srs EPSG:32630 first is more reliable.

QGIS. The Raster ▸ Analysis ▸ Slope and Processing "Slope" algorithms output degrees. For percent, run the degrees output through the raster calculator with tan(...), or call gdaldem slope -p via the GDAL provider in the toolbox.

ArcGIS Pro. Spatial Analyst Slope has an output_measurement parameter: set it explicitly to DEGREE or PERCENT_RISE. There is also a z_unit parameter so the tool can reconcile vertical units against the horizontal CRS — set it correctly or the magnitudes will be off.

All three commonly use Horn's method (a 3×3 weighted neighbourhood), so results are comparable across tools if cell size, CRS, and the edge-handling option are matched.

Why resolution and method change the numbers

Slope is a derivative, so it is sensitive to cell size. A 1 m LiDAR DEM resolves individual boulders and micro-channels and reports steeper local maxima; a 30 m DEM smooths the same terrain and reports gentler slopes. Neither is "wrong" — they answer different questions. The lesson for the percent-vs-degrees discussion: when you compare two slope layers, hold cell size, neighbourhood method, and units constant, or the comparison conflates three variables at once.

Validation

  • Spot-check the conversion. Pick a cell, read its rise/run, and confirm the reported value matches arctan (degrees) or ×100 (percent).
  • Check the range. A degree layer should never exceed 90; if it does, the unit label is wrong. A percent layer over 100 is plausible (just steeper than 45°).
  • Confirm units in metadata. Record DEGREE or PERCENT_RISE in the layer name and metadata so the next person does not guess.
  • Verify CRS units match. Open the DEM's CRS; if horizontal is degrees, reproject before trusting any slope output.
  • Compare against a known feature. A surveyed road grade or a mapped scree slope gives a ground-truth value to test against.

Common pitfalls and why they happen

  • Applying a degree threshold to a percent raster. A 30 "unit" cutoff means 30° (≈58%) or 30% (≈16.7°) — wildly different areas flagged. It happens because the layer was never labelled with its unit.
  • Running slope on a geographic-CRS DEM. Degrees horizontal against metres vertical yields nonsense. It happens when the DEM is left in EPSG:4326 instead of a projected CRS.
  • Assuming percent and degrees are linearly related. People estimate "50% ≈ 50°," but 50% is only 26.6°. The tangent relationship is the cause.
  • Comparing slopes from different-resolution DEMs. A 1 m and a 30 m slope layer disagree systematically because resolution smooths gradient, not because either is faulty.

Bathyl perspective

We label every slope derivative with its unit and the DEM resolution it came from, and we choose the unit to match the decision it feeds — percent when an engineering grade standard is in play, degrees when a stability or angle-of-repose threshold is. The conversion is trivial; the discipline that prevents costly errors is stating which scale a layer uses and never comparing across units without converting first.

Related reading

Sources