Short answer

A LiDAR-derived DEM is only as good as the choices made between the point cloud and the raster: which returns you keep, how densely you grid them, and how you handle voids and noise. For terrain analysis you almost always want the DTM (bare-earth, built from ground-classified points), not the DSM (which includes canopy and buildings). Set the cell size to match point density rather than the smallest number the software allows, and expect to apply light smoothing before deriving slope or curvature, because 1 m LiDAR resolves real micro-relief and acquisition noise that downstream algorithms will faithfully amplify.

From point cloud to surface model

Airborne LiDAR returns a cloud of (x, y, z) points, typically stored as LAS/LAZ, where every point carries a classification code. The ASPRS standard codes you care about most are class 2 (ground), class 1 (unclassified), 3–5 (low/medium/high vegetation), and 6 (building). Two distinct surfaces come out of this cloud:

  • DSM (Digital Surface Model): gridded from the highest/first returns. It includes tree canopy, rooftops, bridges. Useful for line-of-sight, viewsheds, and canopy height (DSM minus DTM = nDSM).
  • DTM (Digital Terrain Model): gridded from class-2 ground points only, interpolating across the gaps left where vegetation and structures were removed. This is the bare-earth surface that geomorphology, hydrology, and slope stability work require.

If your slope map shows the outline of every tree and building, you accidentally analysed the DSM.

Choosing resolution to match point density

The most common quality mistake is gridding finer than the data supports. A reasonable rule: the grid cell size should be at or above the average spacing of ground points, not all points. A nominal 8 points/m² survey may only have 2–4 ground points/m² under forest, so a 1 m DTM is honest there while a 0.25 m DTM would be mostly interpolation.

Check density before you grid. PDAL reports it:

pdal info --stats tile.laz

Then build the DTM from ground points. With PDAL:

pdal translate tile.laz dtm.tif \
  --filters.range.limits="Classification[2:2]" \
  --writers.gdal.resolution=1.0 \
  --writers.gdal.output_type=idw

Or, if you already have a higher-resolution source and need a consistent analysis grid, resample with an interpolating resampler, never nearest neighbour:

gdalwarp -tr 2 2 -r bilinear -dstnodata -9999 dtm_1m.tif dtm_2m.tif

Why high resolution can hurt, and how to tame it

Slope, aspect, and curvature are computed from a moving window (usually 3×3) over the DEM. At 1 m, that window spans just 3 m of ground, so it picks up every interpolation seam, scan-line ripple, and tussock. The result is a slope raster that looks like static. This is not a sensor failure; it is the algorithm correctly reporting high-frequency relief and noise.

Two defensible fixes, chosen by purpose:

  • For landform interpretation, smooth the DEM before deriving products, for example a Gaussian or low-pass filter, or compute slope over a larger window. SAGA's terrain tools and GRASS r.slope.aspect expose this directly.
  • For measurement at a fixed scale, resample the DEM to the scale of the process you care about (a 5 m grid for hillslope mapping, finer for micro-topography), and report that scale.

The key is that slope is scale-dependent: the slope of the same hillside measured at 1 m and at 10 m is genuinely different, and neither is "wrong." State the cell size with every derivative.

A worked DTM-to-derivatives workflow

  1. Confirm the vertical datum and units. LiDAR z-values are often orthometric heights (for example NAVD88 via a geoid model) in metres. Mixing ellipsoidal and orthometric heights, or feet and metres, produces slope errors of exactly the unit ratio.
  2. Build the bare-earth DTM from class-2 returns (PDAL command above), choosing IDW or TIN/natural-neighbour interpolation.
  3. Fill small voids under dense canopy or water with gdal_fillnodata.py, but flag the filled extent so it is not over-interpreted.
  4. Reproject to a projected CRS matching the survey (for example a UTM zone or a national grid) so horizontal and vertical units are both metres.
  5. Smooth lightly if the target is interpretation.
  6. Derive products with consistent settings:
    gdaldem slope dtm_5m.tif slope_deg.tif -alg Horn
    gdaldem hillshade dtm_5m.tif hs.tif -z 1 -az 315 -alt 45
    gdaldem TRI dtm_5m.tif tri.tif
    
  7. Generate contours at an interval the resolution supports: gdal_contour -i 5 dtm_5m.tif contours.gpkg.

Common pitfalls and why they happen

  • Slope in the wrong unit. If z is in feet but x/y in metres, gdaldem slope needs the -s scale factor (here -s 0.3048) or every slope value is wrong by that ratio.
  • Hillshade read as a measurement. Hillshade is a shaded-relief visualization driven by an arbitrary sun azimuth/altitude. It reveals structure beautifully but encodes no slope or hazard value; never digitize hazards straight off it.
  • Comparing two DEMs on different grids. Differencing a 1 m and a 2 m DEM, or two grids with offset origins, creates edge artefacts. Resample both to an identical grid first.
  • Trusting interpolated areas. Under dense forest or over water, the "ground" is largely interpolated. Slope there is a model, not an observation.

Validation and QA

Open the DTM and inspect for striping (across-track scan artefacts), pits and spikes (single bad returns), and a too-perfect water surface. Confirm NoData is a sentinel like -9999, not 0, which would otherwise read as a sea-level cliff. Profile a known feature (a road embankment, a survey benchmark) and compare the LiDAR elevation to a trusted control. Verify the derivative honours the CRS by checking that flat areas read near-zero slope. Document source survey, point density, classification used, interpolation method, cell size, and vertical datum alongside the deliverable.

Bathyl perspective

We treat the LiDAR point cloud as the real dataset and the DEM as one of many possible renderings of it. Because the choice of resolution and smoothing materially changes slope and curvature, we fix those parameters to the question being asked and record them with the output, so a reviewer can see exactly which surface a hazard or geomorphology call was made from.

Related reading

Sources