copc
Rust libraries for reading COPC (Cloud-Optimized Point Cloud) files, with support for the COPC Temporal Index Extension.
Crates
copc-streaming
Async streaming COPC reader. Loads octree hierarchy and point data incrementally via a ByteSource trait — works with HTTP range requests, local files, or any random-access byte source.
- LAS header and VLR parsing via the
lascrate - LAZ decompression via the
lazcrate - Incremental hierarchy page loading
- Individual chunk fetch + decompression
ByteSourcetrait withFileSource(local) andVec<u8>(in-memory) implementations- No
Sendrequirement on futures — WASM compatible
copc-temporal
Reader for the COPC Temporal Index Extension. Enables time-range filtering of octree nodes without decompressing point data.
- Parse temporal index EVLR (paged layout for incremental loading)
- Per-node GPS time range queries
- Intra-node point range estimation via binary search
- Incremental page loading via
ByteSource— only fetch index pages relevant to your query - Combined spatial + temporal filtering
Depends on copc-streaming for core COPC types (VoxelKey, Aabb, ByteSource).
Use case
When multiple survey passes cover the same area at different times, a single merged COPC file may contain overlapping data from many collection epochs. A client querying a spatial region often needs only points from a specific time window — not every pass that ever traversed that location. Without the temporal index, all spatially overlapping nodes must be decompressed. With the temporal index, irrelevant epochs are skipped before any decompression.
Quick start
use ;
let mut reader = open.await?;
// Coarse nodes are available immediately. Load finer levels as needed.
let root_bounds = reader.copc_info.root_bounds;
while reader.has_pending_pages
for in reader.entries
With temporal filtering
use ;
if let Some = from_reader.await?
Related
- copc-converter — CLI tool that produces COPC files with optional temporal index
- COPC specification
- Temporal index spec