Reality capture
The point cloud viewer shows laser scans and photogrammetry surveys in the page - a site, a building, a quarry, a road corridor. It opens LAS and LAZ (the LAZ compression is undone in the browser by the library's own decoder, every LAS 1.4 point format included), PLY, PCD and plain XYZ text, and keeps millions of points moving smoothly: the cloud is cut into levels of detail on background threads, and each frame draws the near part in full and the far part as an even sample, within a point budget you set.
Colour by the file's own colour, intensity, elevation, classification or return; hide classes from a legend; measure distances, heights and areas; cut a profile across the ground and chart it; box in one part of the cloud; pin notes to points; save views and go back to them. Eye-dome lighting shades every point by its depth against its neighbours, so surfaces and edges read without any lights. Survey coordinates keep their millimetres however large they are.
Try it with your own scans in confidence: LAS, LAZ, PLY, PCD and XYZ files are opened by your browser, on your device. Nothing is uploaded, no copy reaches us or anyone else, and nothing is kept once you close this tab.
A quarry survey
A made-up survey of 180,000 points, written in the page: a quarry floor with benches cut into one side, a stockpile, a shed, a few trees and some stray points high up. Drag to turn, right-drag to move, wheel to zoom, and click a point for its coordinates; or open a scan of your own from the toolbar.
// Node 18 or later, from the Gold package: what each new survey holds, before anyone opens it.
import { readdirSync, readFileSync } from 'node:fs';
import { readPointFile, classesPresent, classificationName } from './dist/node/bmx-point-cloud.mjs';
for (const name of readdirSync('incoming').filter(n => /\.(las|laz)$/i.test(n))) {
const cloud = readPointFile({ name, bytes: new Uint8Array(readFileSync(`incoming/${name}`)) });
const classes = classesPresent(cloud).map(c => `${classificationName(c.code)} ${c.count.toLocaleString()}`);
console.log(`${name}: ${cloud.count.toLocaleString()} points, ${cloud.info.crs ?? 'no coordinate system'}; ${classes.join(', ')}`);
}
A road corridor, cut and boxed
A made-up mobile-mapping run along 400 metres of road: the surface with its camber, kerbs, verges cut into the slope, hedges, lamp posts and a bridge across it. Cut a cross-section to see the camber and the kerbs, box in the bridge, and save the view to come back to.
Get the code
<script src="/assets/bmx-components.min.js"></script> <bmx-point-cloud id="pc-r" label="Road corridor" color-mode="classification" style="inline-size: 100%; --bmx-point-cloud-height: 30rem"></bmx-point-cloud>