Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

What is this?

LAZperf is an alternative LAZ implementation. It supports compilation to WASM via Emscripten so that LAZ data can be decoded in a browser.

Building LAZperf for Windows/UNIX

Previous versions of LAZperf were header-only C++ libraries, so you could simply include the project header files in your project. Primarily due to licensing issues, this is no longer the case and LAZperf needs to be built as a library that links with your code. LAZperf uses CMake as a build system, though it's probably simple to port to another build system as there are few source files and no dependencies. Assuming you have Git, CMake, make and C++11 compiler installed, here is the process on the Unix command line. The process is similar on Windows.

git clone
cd laz-perf
mkdir build
cd build
cmake ..

This should build the library (or similar). You can install this library along with the supporting header files as follows:

make install

Using LAZperf on Windows/UNIX

Although the LAZperf library is focused on decoding the LAZ data itself, there is support for reading a complete LAS or LAZ file. If you have LAZ-compressed data, you can decompress by creating a decompressor for the right point type and providing a callback that will provide data from the LAZ source as requested by the decompressor. For example, to read point format 0 data, you might do the following:

using namespace lazperf;

void cb(unsigned char *buf, int len)
    static unsigned char my_laz_data[] = {...};
    static int idx = 0;

    std::copy(buf, buf + len, my_laz_data + idx);
    idx += len;

point_decompressor_0 decompressor(cb);

char pointbuf[100];
for (int i = 0; i < num_points; ++i)
    // Do something with the point data in 'pointbuf'

Compression follows a similar pattern -- see the accompanying examples and tests.

You can also use LAZperf to read LAZ data from an entire LAZ or LAS file:

using namespace lazperf;

reader::named_file f(filename);

char pointbuf[100];
for (size_t i = 0; i < f.header().point_count; ++i)

A memory file interface exists If your LAS/LAZ data is internal rather than in a file:

using namespace lazperf;

reader::mem_file f(buf, bufsize);

char pointbuf[100];
for (size_t i = 0; i < f.header().point_count; ++i)

Using LAZperf in JavaScript/TypeScript


LAZperf is available as a UMD module compatible with both NodeJS and browsers, and includes TypeScript definitions.

npm install laz-perf


import { createLazPerf } from 'laz-perf'

const LazPerf = await createLazPerf()

// File reader API.
const laszip = new LazPerf.LASZip(), fileByteLength)
for (let i = 0; i < pointCount; ++i) {
    // Do something with point data.

// Chunk decoder API.
const decoder = new LazPerf.ChunkDecoder(), pointDataRecordLength, chunkPointer)
for (let i = 0; i < pointCount; ++i) {
    // Do something with point data.

See unit tests in js/src/test for further details and how to interact with the Emscripten heap to work with the data.