Pointglass 0.8.48 · alpha

Avenislabs · Windows desktop · early alpha

Open the whole survey.
Cut it anywhere.
Prove what you export.

Pointglass is a viewer and light editor for large classified LiDAR point clouds. It reads LAS and LAZ, indexes them into a spatial store you can actually work in, and writes ASPRS LAS back out with every point record copied byte for byte.

217,521,891 points 845 nodes drawn 5,003,735 at the current budget
A Pointglass profile window: classified treeline in orange against a radar tower and dome, seen in section.
Profile — bearing 260.0° · 1,666,477 points, full density
4.82 B
points in the largest survey on record — opened, picked and reported on one desktop
217.5 M
points in the store shown throughout this page, orbiting on one desktop GPU
3,020
automated tests, every one green before a version is tagged
0
coordinate bytes rewritten on export — records are copied, not regenerated
A ground-level perspective view inside the 4.8-billion-point survey: real terrain in true colour running to a horizon, with 74 control points marked in green, pink and cyan.
Inside the store, at ground level. 20,013,003 points drawn across 4,361 nodes at this camera — the level-of-detail budget is what you see, not what the project holds.
The Pointglass window on a 4.8-billion-point survey coloured by classification, with 74 control point markers, beside a Classes panel listing 4,772,026,452 ground points and 52,920,134 unassigned.
4,772,026,452 ground · 52,920,134 unassigned. The panel counts to the point, and the two sum to the 4,824,946,586 above.
The same 4.8-billion-point survey in true colour, with the same control point markers.
The same store in true colour. Colour mode is a dropdown, not a rebuild — at 4.8 billion points as at 200 million.
Profile tool 6 · , and . to rotate

A cross-section is the fastest way to answer a question about a cloud

Draw a corridor in the map and inspect it side-on in its own window. The extractor descends the whole octree rather than the render budget, so what you are looking at is every point in that corridor — not a sample of it.

Walk the corridor along its axis, or rotate it 20° at a time about its midpoint to square the section up to a feature. The vertical exaggeration is a control, not a guess, and the elevation line reads in the project's own units.

  • Full density. 172,726 points in the section on the right, from a 217-million-point store.
  • Its own window. Pop it out to a second monitor and keep orbiting the map.
  • Measure inside it. The section is a working view, not a preview.
Profile window at bearing 180 degrees showing a radome, the lattice tower beneath it, and the ground surface, with an elevation grid.
Bearing 180.0° — the radome, the lattice beneath it, and ground. The dashed line marks z 458.22; the grid is in project units.
Obstructions 1,113 trees imported

Every tree tip, where it was measured

Import an obstruction CSV and each tip lands in the cloud at its own coordinates. Columns are matched by alias rather than by position, so a file that names a column tip_elev and one that names it Tip Elevation (ft) both load.

Sort by tip elevation, height above ground, tier or zone. Mark rows and they are drawn in the viewport. Set a centrepoint — a radome, a runway end, a proposed structure — and read the horizontal distance to each marked tree, labelled in the project's units.

  • The table pops out. Full-height on a second monitor, sorted numerically — the proxy sorts on the raw value, not the display string.
  • Boundaries overlay the cloud. Parcel and zone vectors project onto the surface at an anchor elevation you set.
  • Distances are ground distances. Not screen distances, whatever the camera is doing.
The Obstructions panel popped out into its own window over a classified plan view, with distance lines drawn to a centrepoint.
Tip elevation, tier, zone and height AGL per tree, with distance lines to the site centrepoint.
Parcel boundary vectors overlaid on the classified point cloud with obstruction distance labels.
Parcel and zone boundaries projected at an anchor elevation, distances live over them.
Measure tools 7–0 · line, rect, square, circle

Ground or roof? Answer it by looking

Measurements are drawn straight onto the cloud with live dimension labels. The first click snaps its elevation to the ground-classified surface beneath it — so a circle centred on a radome sits on the ground under the dome, not on its roof — while keeping its XY exactly under the crosshair.

Picking the circle tool snaps the view to a framed top-down plan and holds it there. While the centre is live, an inset shows a vertical section of the square around the crosshair with the anchor's elevation drawn across it. Arrow keys nudge the centre across the plan; PgUp and PgDn nudge its elevation.

  • Any closed shape is a trim boundary. It replays through the same pipeline a lasso does, so scope, confirmation and undo behave identically.
  • Measurements are saved beside the project. A boundary worked out in one session is there in the next.
The circle measurement tool in plan-locked mode with the elevation probe inset open.
Plan-locked circle with the elevation probe: a vertical section of the square around the crosshair.
Two committed circle measurements over a true-colour point cloud with radius and diameter labels.
Two committed circles, each in the colour it is listed in, with radius and diameter.
Control points residual CSV · client PDF

Accuracy numbers that survive being read closely

Load a delivered checkpoint or GCP file, fit a plane to the cloud around each point, and read the vertical residual. Columns are matched by alias, so the file you were sent loads as it was sent.

GCPs and checkpoints are kept separate at every level — in the table, in the chart, in the statistics and in the report. A GCP was used to build the model; a checkpoint was withheld from it. Blending them would invalidate the claim the number appears to make.

The disc the plane is fitted in and the disc vegetation is judged in are two different radii, because they answer two different questions. A tight fit describes the checkpoint's own spot; canopy over a checkpoint is rarely directly above it. Measured on a real survey, judging cover inside the fit radius registered vegetation at only ten checkpoints; widening the footprint to its own default moved that to twenty-nine, against a standard that wants thirty in each group. The footprint is now a separate control with terrain presets — and because no standard defines that radius, the presets are named in the documentation as a house choice rather than dressed up as a citation.

Open ground

NVA95

1.9600 × RMSEz, per the ASPRS Positional Accuracy Standards for Digital Geospatial Data.

Under canopy

VVA95

The 95th percentile of absolute error — because vegetated error is not normally distributed and an RMSE would flatter it.

Below 30 checkpoints

Marked, not hidden

Edition 2 raised the per-group floor from 20 to 30. A group under it is flagged amber and printed with a plain instruction not to read it as a defensible accuracy statement — including on surveys that cleared the old floor.

Horizontal, when you ask for it

Vertical is what a lidar survey is usually judged on, and it is what Pointglass measures by default. Horizontal is a separate switch in the Control panel, off unless you turn it on — because a horizontal error is something this software reports, never something it corrects.

You place the pick yourself. Automatic panel-finding by intensity contrast is deliberately not implemented: it locks onto a road stripe as readily as onto a target, and a confident wrong answer is worse here than no answer. Each pick is written to a .picks.csv beside the survey — never into it, so a re-export from your survey software cannot silently discard your observations.

  • The 95% figure is not one formula, and it does not pretend to be. Equal axes give NSSDA's 2.4477 × RMSEx; comparable axes give the averaged form. Below the standard's own 0.6 axis-ratio floor there is no published expression — so the components and the mean shift are still reported and the 95% claim is withheld, and said to be withheld.
  • The picked elevation is discarded. A pick answers where in plan. The fitted plane already answers the vertical question better, and printing both invites two kinds of measurement to be read as one.
  • Off means absent, not empty. Unticked, the panel is its five vertical columns, the CSV is byte-for-byte what it was, and the PDF has no horizontal section at all.
  • The method states its own floor. A pick cannot resolve finer than the point spacing plus the operator's aim, and the report says so in its lede.
The Control points panel with horizontal checking enabled: dE, dN and dR columns with a clear cell on each picked row, group statistics, a terrain preset with its own vegetation radius, and export buttons.
One switch, and the panel grows dE/dN/dR with a clear cell per picked row. Note what it prints under the vegetated group: fewer than 30 checkpoints; not a defensible accuracy statement. The software says so rather than letting the number stand unqualified.
The horizontal accuracy section of a control point report: four tiles reading RMSE(R) 0.237, a horizontal 95% tile printing an em dash captioned 'no NSSDA figure applies', 11 of 74 points picked, and a mean shift of 0.096.
The withholding, in a delivered report. RMSE(R) and the mean shift are stated; the 95% tile prints an em dash and names its reason — no NSSDA figure applies — because these components fall outside the band the standard's expression covers.

The report is the deliverable

One command produces a client document rather than a screenshot of a table. The same numbers come out as CSV for a spreadsheet.

  • Letterhead and a metadata grid — project, date, what was measured, and the coordinate system on its own row, printed whole with both EPSG codes rather than elided.
  • Per-group KPI tiles — checkpoints and GCPs reported separately, always.
  • A signed residual bar chart with a ±RMSE band, so sign and spread are both visible.
  • The residual table, every point, no truncation.
  • Horizontal accuracy and per-point offsets — only when horizontal was actually measured.
  • Cloud statistics — point total, classification breakdown and returns, read from what the builder already recorded rather than by rescanning billions of points.
  • A Qualifications section that is never empty.
  • A glossary — including why RMSE and standard deviation are not the same number.
  • One full-page crop-marked exhibit per supplied photograph.
Page one of a control point report: letterhead, a metadata grid naming project, client, date, coordinate units and source files, then two rows of KPI tiles for the non-vegetated and vegetated checkpoint groups.
Page one. Cover groups are reported separately and never pooled — 39 non-vegetated against 21 vegetated here, and the vegetated row carries the amber rule because 21 is short of Edition 2's floor of 30.
Integrity what the format guarantees

Editing a cloud should not change the points you did not edit

Export

Copied, not regenerated

Every surviving point record is copied byte for byte from the original source file, with only its classification byte patched. Headers and VLRs come across intact. The one documented exception is the 48-byte header bounding box, which is recomputed — and says so.

CRS gate

Refuses what it cannot prove

Any declared coordinate system is read natively — the CRS and its EPSG codes are carried through from the source file to the viewport badge to the report, and the linear unit travels with them. What is refused is adding or merging a file whose CRS or unit does not provably match the project: byte-identical CRS records, or exact EPSG authority-and-unit equality. Never converted, never overridable.

Projects

Compare without merging

Add LAS or LAZ to a project after its initial build; each addition becomes its own complete sub-store, drawn alongside the others. Exactly one store is active and receives edits. Every store keeps its own history and its own export.

The window dark theme via QPalette, not a stylesheet

Thirteen panels, and none of them lie to you

Panels stack as collapsible sections in a rail down each side. A rail scrolls, so every panel keeps its natural height however many are open. A dot beside a panel's title means that panel is still filtering the cloud — a collapsed filter cannot quietly change what you see.

Any panel pops out into its own window and goes back where it was when you close it. Positions, sizes and visibility survive between sessions. Every command has a key, and every key can be changed.

  • Read in feet or metres, whatever the file is in. Measurements, profiles, obstructions and the readouts all follow one display-unit setting. The store's own units never change; only what you are shown does.
  • The CRS is on screen, not in a dialog. A badge under the orientation gizmo names the project's coordinate system and its unit, so the number you just read can always be attributed.
  • Each store remembers its view. Camera, filters and display state are saved per store and restored when you open it again.
  • The elevation ramp explains its own range. Choose the rule — percentile, median ± MAD, or the full declared box — restrict it to ground, refit it on demand, and read it against a legend drawn from the ramp itself. Noise a thousand feet below ground stops deciding what the colours mean.
The Classes panel listing each classification with its colour and exact point count.
Per-class visibility, colour, and an exact point count — deleted points excluded.
The Display panel: colour mode, point size, detail budget, eye-dome lighting, shading, and a height ramp with a range rule, a ground-only checkbox and a Refit button.
The height ramp names the rule it is using — here the 1–99 percentile — with Ground only and Refit beside it. The range is a stated choice, not a guess.
The Pointglass window with no cloud loaded, showing both panel rails fully expanded across thirteen collapsible panels.
Both rails expanded, nothing loaded. Control points, Edit, Inspector, Measurements, Stores, Tree Segmentation and Overlays down the left; Display, Classes, Sources, Returns, Intensity and Elevation down the right.
The keyboard shortcuts dialog listing File, Selection and Edit commands, each with an editable shortcut cell and a clear button.
Every command, rebindable. Backspace clears one; one button restores the lot.
The Navigation and zoom dialog: zoom speed per notch, Ctrl and Alt multipliers, and checkboxes for orbiting and zooming toward the point under the cursor.
Wheel speed, the Ctrl and Alt multipliers, and what the camera pivots on.
The Settings menu open, listing keyboard shortcuts, navigation and zoom, folders, measurements, performance, display units, debug trace logging and reset interface.
Display units live here too — and Reset interface, which puts every panel back.
The full window showing the point cloud in true colour.
RGB
The same cloud coloured by classification.
Classification
The same cloud shaded by return intensity.
Intensity
How it's built the reasons, not the résumé

A LAS file is stored in the order the sensor fired

That order is useless for interactive work, and a multi-gigabyte LAS cannot be edited in place. So the first thing Pointglass does is rewrite the cloud into a spatially indexed store that separates immutable geometry from a small mutable attribute layer. A node's points are a contiguous slice of one file, which is why drawing one is a direct upload to the GPU and why level-of-detail streaming keeps a multi-billion-point project interactive — the 4.29-billion-point store ceiling came out, and the largest survey on record is 4.82 billion.

The second decision is a boundary. Geometry, statistics, report composition and the click grammars are Qt-free modules; the widgets are reduced to wiring. A test enforces it. That is why a desktop application can carry thousands of tests, and why the command line runs on an interpreter with no Qt installed at all.

LAS / LAZ acquisition order build project.pcs octree · geometry.bin + mutable attributes Qt-free core geometry · statistics · reports · grammars a test refuses any Qt import here command line build · info · export desktop window PySide6 · OpenGL 3.3 export byte-verbatim
Where it stands stated plainly

This is early alpha, and it says so in the title bar

Pointglass is a working application, acceptance-run against real survey deliverables — and it is version 0.8.48. The version scheme is deliberately fine-grained: patch bumps are the norm and a large patch counter is expected. Version 1.0 will be an explicit decision, not somewhere the counter arrives.

There is no public download yet. If your work looks like the work in these screenshots, get in touch and say what you are trying to do with it.

The form below reaches me directly.

Requirements
Operating systemWindows
GraphicsAny GPU and driver supporting OpenGL 3.3 core — roughly 2010 onward. The window says so plainly rather than opening blank.
RuntimePython 3.12+, numpy, laspy. Installed on first run.
Desktop windowPySide6, about 150 MB, installed on first run.
Optionalpyproj for the CRS gate's EPSG fallback; reportlab for the client PDF. Each degrades to a clear message rather than a crash.
Early access goes straight to the developer

Say what you are trying to do with it

There is no public download yet, and access is handled one conversation at a time. The most useful thing you can tell me is the shape of your work: how large the surveys are, what you deliver, and which part of it is currently painful.

Nothing here is stored on the site — the message is relayed straight through and answered by email.

LAS Files.pcs any declared CRS — EPSG carried through, units never assumed 217,521,891 points