LiDAR Terrain Lab
Before a cedar-removal job on Heart 7, I needed two answers: how many acres the brush and young trees had taken over, and where water goes when it rains. Airborne LiDAR answers both, because every laser return records the height of whatever it hit.
This separates ground returns from vegetation, builds bare-earth and canopy-height models on a 1 meter grid, routes water across the terrain to find drainage lines, and totals acreage by vegetation height and by management zone.

View the code (opens in a new tab)Read the README (opens in a new tab)Open the live report (opens in a new tab)
The problem
Size a brush-removal job and map drainage before spending money in the field.
What I built
A package that classifies ground returns, builds bare-earth, surface and canopy-height models, fills depressions, routes surface flow, and totals vegetation acreage by height class and zone.
What it produces
Map images, a GeoTIFF bundle, GeoJSON, a Google Earth file and a report, each scored against a synthetic landscape with known answers.
Grew out of scoping a $130K cedar-removal program on Heart 7 Ranch. The demo runs on a synthetic landscape; real runs use public USGS data.
The demo landscape is synthetic. Real runs read public USGS 3DEP point clouds, downloaded at run time and never committed.
In pictures
How it works
- Read. LAS or LAZ tiles, cropped to a study box, with flagged noise dropped.
- Ground. Labels ground returns, using the provider's class or re-deriving it.
- Rasterize. Bare-earth, surface and canopy-height models on one 1 m grid.
- Terrain. Slope, aspect and shaded relief from the bare earth.
- Hydrology. Fills depressions, routes flow and extracts drainage lines.
- Vegetation. Classes canopy height and totals acreage by class and zone.
- Export. Maps, GeoTIFFs, GeoJSON, a KMZ for Google Earth and a report.
Where to look in the code
README sections
- Overview (opens in a new tab) The problem and what the package does
- Ground classification (opens in a new tab) Separating bare earth from vegetation
- Flow direction and accumulation (opens in a new tab) How water is routed across the terrain
- Vegetation classes and acreage (opens in a new tab) How brush acreage is totaled
- Validation against synthetic truth (opens in a new tab) How each product is scored
- Limitations (opens in a new tab) What it does not do
Files
- src/lidar_terrain_lab/ground.py (opens in a new tab) Ground classification
- src/lidar_terrain_lab/hydrology.py (opens in a new tab) Flow routing and drainage
- src/lidar_terrain_lab/validation.py (opens in a new tab) Scoring against the truth
- tests (opens in a new tab) Test suite
- Automated checks (opens in a new tab) lint, type checks and tests on every push