19.2 Point Clouds and Formats
LAZ, COPC, Entwine EPT — storing, streaming, and processing billions of 3D points.
Key takeaways
- Point clouds scale to billions of points; formats optimise for storage, streaming, and processing.
- LAZ is the distribution standard; COPC and EPT are cloud-native variants.
- Streaming point clouds to the web is now practical with Potree, deck.gl, and Cesium.
Introduction
A 10 km² LiDAR survey at 20 points/m² contains 200 million points. A national survey can reach a trillion. Storing, streaming, and analysing this scale requires purpose-built formats. This lesson covers them.
File formats
LAS
ASPRS-standard binary format. Stores header + point records. Well-supported but uncompressed — large on disk.
LAZ
Compressed LAS using LASzip algorithm. Same data, ~10× smaller. No meaningful downside; always use LAZ for storage and distribution unless a tool explicitly requires LAS.
COPC
Cloud Optimised Point Cloud. A LAZ file structured so clients can:
- Stream octree levels from cloud storage.
- Display low-resolution overviews quickly.
- Drill into specific regions on demand.
Modern LiDAR viewers (ept.io, Potree, CesiumJS) support COPC. It's the LAZ equivalent of COG for rasters.
Entwine Point Tile (EPT)
Octree-structured directory of LAS / LAZ files. Predates COPC; still widely used. Similar purpose; different structure.
3D Tiles
OGC standard for streaming 3D assets (buildings, photogrammetry, point clouds) in web clients. Cesium's native format.
Processing with PDAL
PDAL is the open-source swiss-army knife for point clouds:
1# Inspect
2pdal info input.laz --summary
3[object Object]
4[object Object]
5[object Object]
6[object Object]
7[object Object]
8[object Object]
9[object Object]
10PDAL uses pipelines — JSON documents describing a series of filters:
1{
2 "pipeline": [
3 "input.laz",
4 {"type": "filters.smrf"},
5 {"type": "filters.range", "limits": "Classification[2:2]"},
6 {"type": "writers.gdal", "filename": "dtm.tif", "resolution": 1}
7 ]
8}Run with pdal pipeline pipeline.json.
Classification codes
ASPRS-standard classes:
| Code | Meaning |
|---|---|
| 0 | Never classified |
| 1 | Unassigned |
| 2 | Ground |
| 3 | Low vegetation |
| 4 | Medium vegetation |
| 5 | High vegetation |
| 6 | Building |
| 7 | Noise |
| 9 | Water |
| 11 | Road surface |
| 13 | Wire conductor |
Additional codes exist for user-defined classes.
Web visualisation
- Potree — open-source WebGL point-cloud viewer. Serves EPT or Potree-specific format.
- Cesium — 3D globe; supports 3D Tiles.
- deck.gl
PointCloudLayer— GPU-accelerated, integrates with MapLibre. - Itowns — French IGN's open-source 3D viewer.
Streaming billion-point clouds in the browser is now practical with proper octree tiling.
Applications
- Engineering: volume calculations, surface fits, clash detection.
- Forestry: canopy height, individual tree detection, biomass.
- Urban: building extraction, roof analyses, solar potential.
- Archaeology: subtle earthwork detection under vegetation.
- Infrastructure: power-line inspection, bridge surveys, road condition.
- Simulation: digital twins, autonomous-vehicle training.
A small worked example
"Extract individual tree locations from a LiDAR point cloud":
- Classify ground + vegetation.
- Compute canopy height model (CHM) = DSM - DTM.
- Apply a local-maxima filter on the CHM to find tree tops.
- Export points.
1pdal translate input.laz classified.laz \
2 --filters.smrfFollowed by a Python local-max step on the CHM. 15 minutes of code, 100 000 trees identified.
Self-check exercises
1. Why would you choose COPC over Entwine EPT for a new project?
COPC is a single file (vs EPT's directory of many files), which is easier to distribute, version, and cache on CDNs. It also has a cleaner spec and growing tool support. Use EPT when working with existing datasets already in that format; pick COPC for new work.
2. A LAZ file takes 2 GB on disk. Roughly how many points, assuming 20 points/m²?
Compressed LAZ averages ~20 bytes per point. 2 GB / 20 bytes = ~100 M points. At 20 pts/m², that's 5 km² of coverage — a typical airborne LiDAR tile. Uncompressed LAS would be closer to 20 GB. Use LAZ for transfer and storage; decompress only when tools require it.
3. Your Potree viewer shows a point cloud at low resolution even when zoomed in. What's happening?
The octree's leaf level doesn't have enough detail for your zoom, or the client hasn't loaded the deeper octants yet. Fix: (1) re-tile with deeper octree (PotreeConverter has options for this); (2) increase the maximum point budget in the Potree viewer; (3) improve network bandwidth or CDN configuration. Potree performance tuning is documented thoroughly in its wiki.
Summary
- LAZ for storage; COPC or EPT for cloud streaming.
- PDAL handles processing pipelines declaratively.
- Potree, Cesium, deck.gl visualise billions of points in browsers.
- Use ASPRS classifications for interoperability.
Further reading
- PDAL documentation.
- COPC specification (copc.io).
- Potree repository and documentation.
- NOAA Digital Coast point-cloud tutorials.