#data #read-write #format #las #reader #port #laszip

laz

Rust port of Laszip compression. of the LAS format

21 releases

0.9.2 Jul 22, 2024
0.9.1 Mar 26, 2024
0.8.3 Oct 15, 2023
0.8.2 Jul 29, 2023
0.1.0 Jun 23, 2019

#46 in Compression

Download history 3689/week @ 2024-08-08 4075/week @ 2024-08-15 6243/week @ 2024-08-22 3562/week @ 2024-08-29 4902/week @ 2024-09-05 1534/week @ 2024-09-12 1801/week @ 2024-09-19 1484/week @ 2024-09-26 1650/week @ 2024-10-03 1776/week @ 2024-10-10 1646/week @ 2024-10-17 1316/week @ 2024-10-24 1526/week @ 2024-10-31 1259/week @ 2024-11-07 1633/week @ 2024-11-14 1463/week @ 2024-11-21

6,174 downloads per month
Used in 18 crates (5 directly)

Apache-2.0

525KB
11K SLoC

laz-rs

Implementation or rather, translation of LAZ (laszip compression) format in Rust.

The goal of this project is to be a port of the Laszip compression, allowing LAS readers to be able to read / write LAZ data, but not a fully featured LAS reader.

If you want a user friendly Rust LAS reader, las-rs is what you are looking for. las-rs can use laz-rs to manage LAZ data by enabling the laz feature of the las-rs crate.

Original Implementations:

Minimal Rust version: 1.40.0

Running benches

cargo bench --features benchmarks

lib.rs:

Port of the Martin Isenburg's laszip compression to Rust

LasZipCompressor and LasZipDecompressor are the two types that user wishing to compress and / or decompress LAZ data should use.

LasZipCompressor Examples

use laz::{LasZipError, LasZipCompressor, LazItemType, LazItemRecordBuilder};

// Here we use a Cursor but a std::fs::File will work just fine
let mut compressed_output = std::io::Cursor::new(vec![]);

// LazItem may have multiple versions of the compression algorithm
// the builder selects a default one
let items = LazItemRecordBuilder::new()
            .add_item(LazItemType::Point10)
            .add_item(LazItemType::RGB12)
            .build();
let mut compressor = LasZipCompressor::from_laz_items(&mut compressed_output, items)?;

let point = vec![0u8; 26];
compressor.compress_one(&point)?;
compressor.done()?; // don't forget to call done when you are...done compressing

LasZipCompressors can also be contructed from a LazVlr if you need to change the Chunk size or if you have the LazVlr from the orignal LAZ file that you want to write back

use laz::{LasZipError, LasZipCompressor, LazItemType, LazItemRecordBuilder, LazVlrBuilder};


let mut compressed_output = std::io::Cursor::new(vec![]);
let items = LazItemRecordBuilder::new()
            .add_item(LazItemType::Point10)
            .add_item(LazItemType::RGB12)
            .build();
let vlr = LazVlrBuilder::from_laz_items(items)
          .with_chunk_size(5_000)
          .build();

let mut compressor = LasZipCompressor::new(&mut compressed_output, vlr)?;

let point = vec![0u8; 26];
compressor.compress_one(&point)?;
compressor.done()?;

To create a LasZipDecompressor you need to have the record_data found in the LAZ file.

LasZipDecompressor Examples


use laz::{LasZipError, LazVlr, LasZipDecompressor};
use std::fs::File;

let mut laz_file = File::open("tests/data/point10.laz")?;
seek_to_start_of_laszip_record_data(&mut laz_file)?;

let vlr = LazVlr::read_from(&mut laz_file)?;
let mut decompression_output = vec![0u8; vlr.items_size() as usize];
let mut decompressor = LasZipDecompressor::new(&mut laz_file, vlr)?;

let mut ground_truth = vec![0u8; decompression_output.len()];
read_first_point("tests/data/point10.las", &mut ground_truth)?;

decompressor.decompress_one(&mut decompression_output)?;
assert_eq!(&decompression_output, &ground_truth);

Parallelism

This crates has an optional feature 'parallel'. When using this feature, additional Par structs and par_ methods are exposed.

Dependencies

~175–530KB