copc_converter 0.5.0

Fast, memory-efficient converter from LAS/LAZ to COPC (Cloud-Optimized Point Cloud)
Documentation

copc_converter

Crates.io docs.rs

A fast, memory-efficient converter that turns LAS/LAZ point cloud files into COPC (Cloud-Optimized Point Cloud) files.

Features

  • Produces spec-compliant COPC 1.0 files (LAS 1.4, point format 6, 7, or 8 — automatically chosen from input)
  • Merges multiple input files into a single COPC output
  • Out-of-core processing with a configurable memory budget — handles datasets larger than RAM
  • Parallel reading, octree construction, and LAZ compression via rayon
  • Preserves WKT CRS from input files
  • Optional temporal index for GPS-time-based filtering (spec)

Installation

Requires Rust 1.85+.

From crates.io

cargo install copc_converter

From source

git clone https://github.com/360-geo/copc-converter.git
cd copc-converter
cargo install --path .

This installs the copc_converter binary to ~/.cargo/bin/, which should be on your PATH.

Pre-built binaries

Download pre-built binaries from the GitHub releases page. These are built for broad compatibility and run on any machine.

For best performance, prefer installing from source via cargo install — this automatically compiles with target-cpu=native, optimizing for your specific CPU's instruction set (AVX2, NEON, etc.).

Usage

# Single file
copc_converter input.laz output.copc.laz

# Directory of LAZ/LAS files
copc_converter ./tiles/ merged.copc.laz

Options

Flag Description Default
--memory-limit Max memory budget (16G, 4096M, etc.) 16G
--temp-dir Directory for intermediate files system temp
--temporal-index Write a temporal index EVLR for time-based queries off
--temporal-stride Sampling stride for the temporal index (every n-th point) 1000

Examples

copc_converter ./my_survey/ survey.copc.laz --memory-limit 8G

# With temporal index (useful for multi-pass mobile mapping data)
copc_converter ./my_survey/ survey.copc.laz --temporal-index

Library usage

The crate exposes a typestate pipeline API that enforces correct step ordering at compile time:

use copc_converter::{Pipeline, PipelineConfig, collect_input_files};

let files = collect_input_files("./tiles/".into())?;
let config = PipelineConfig {
    memory_budget: 12_884_901_888,
    temp_dir: None,
    temporal_index: false,
    temporal_stride: 1000,
    progress: None, // or Some(Arc::new(your_observer))
};

Pipeline::scan(&files, config)?
    .validate()?
    .distribute()?
    .build()?
    .write("output.copc.laz")?;

How it works

  1. Scan — reads headers from all input files in parallel to determine bounds, CRS, point format, and point count.
  2. Validate — checks that all input files share the same CRS and point format, and selects the appropriate COPC output format (6, 7, or 8).
  3. Distribute — reads every point, assigns it to an octree leaf voxel, and writes it to a temporary file on disk.
  4. Build — constructs the octree bottom-up, thinning points at each level to produce multi-resolution LODs.
  5. Write — encodes and compresses nodes in parallel into a single COPC file with a hierarchy EVLR for spatial indexing.

License

MIT