What it is actually doing
Classification is the step that turns a cloud of undifferentiated points into something you can measure with: a terrain model needs ground points only, a volume needs the stockpile separated from the pad it sits on, a planning drawing needs the buildings. Most clouds arrive with every point set to class 0, and labelling 50 million points by hand is not work anyone wants.
The hard part is not the labelling. It is deciding where the ground is, because every other decision is made relative to it. This runs in three stages:
- Read the cloud into a raster. Every point is folded into a grid of per-cell summaries — lowest and highest elevation, how much the elevation varies within the cell, and the average colour. Typically a 20 to 25 cm grid, chosen from the point density.
- Extract the ground. A morphological filter opens the lowest-elevation surface at steadily growing window sizes. Anything that disappears faster than terrain plausibly could is cut, and the gaps left behind are interpolated from their edges. That gives a bare earth model under the whole site.
- Label every point. The cloud is read a second time. Each point gets its height above that ground model, its own colour is turned into a greenness value, and the roughness of its neighbourhood says whether it sits on something flat. Those three numbers decide the class, and the labelled point is written straight out — into the LAZ compressor if that is the format you picked, so no uncompressed copy of a large cloud is ever created.
The rules, in plain terms
| Class | What has to be true |
|---|---|
| 2 — Ground | Within 25 cm of the terrain model, and not visibly green. |
| 3, 4, 5 — Vegetation | Green, or rough and high; split into low, medium and high at 0.5 m and 2 m above ground. |
| 6 — Building | At least 2 m above ground, on a smooth surface, part of a contiguous patch of at least 12 m², and not green. Facade points within a metre of a roof are included. |
| 1 — Unclassified | Above the ground and none of the above. |
Where it struggles
- Ground under dense canopy. Photogrammetry cannot see through leaves, so there are no ground points to classify there. The terrain model interpolates across the gap, which is the right answer for the surface but means class 2 is genuinely absent under trees.
- Buildings wider than the largest filter window. A roof the filter cannot span stays in the terrain model, and the whole building then reads as ground rather than as a building. The window spans 100 m, which covers most industrial roofs. Widening it further is not free: it starts removing real terrain as well, so there is no setting that suits every site.
- Green roofs and dark foliage. Colour is doing real work here, so anything that breaks the colour assumption breaks the class — a moss-covered roof reads as vegetation, and deep shadow under a crown reads as neither.
- Vehicles and site clutter. Left unclassified on purpose. ASPRS has no class for them, and guessing would only hide them.
Other ways to do it
- PDAL —
pdal translate in.laz out.laz smrfruns the same family of ground filter, with far more control, and composes with everything else in a pipeline. The right tool for batch work. - CloudCompare — the CSF plugin for ground, then manual segmentation for the rest. Best when you want to see and correct every decision.
- LAStools —
lasgroundandlasclassifyare the long-standing commercial answer, and are better than this on airborne LiDAR with real return information. - This page — when the data cannot leave the machine, nothing can be installed, or a rough classification in a minute is worth more than a perfect one in an afternoon.