Saving and exporting
The source .copc.laz is never rewritten, through any path. Edits and findings stay in a separate file, a sidecar.
Autosave
Edits autosave to localStorage per dataset and restore when you reopen the same data. They survive closing the browser.
That said, this is a local copy tied to that device and browser. To hand it over as a deliverable, or continue on a different device, export it to the sidecar below. The server side of collaboration persists nothing — once everyone leaves, the room is discarded.
The sidecar
"Save (.oniyanma.json)" in the ✎ Edit panel downloads <dataset>.oniyanma.json (command: saveEdits). Loading it back is the same panel's "Load".
The contents are the Command log plus a dataset signature.
{
"format": "oniyanma-edits",
"version": 3,
"datasets": [{ "name": "kasado.copc.laz", "pointCount": 95169313, "bounds": [/* real-coordinate AABB */] }],
"frame": { "offset": [/* x,y,z */], "alignYaw": 0 },
"crs": { "epsg": 6669, "verticalDatum": "orthometric" },
"commands": [/* hide / delete / reclassify / colorOverride … each command carries an actor, and a batch if it has one */],
"entries": { "FindingType": [/* … */], "Finding": [/* … */], "Batch": [/* … */] }
}| Key | Role |
|---|---|
datasets | A lightweight signature (name, point count, real-coordinate AABB) for detecting a version mismatch. No full hash is taken of a huge file |
frame | The definition of what basis the predicates' coordinates use. scene = Rz(-alignYaw)·(real - offset) |
crs | The coordinate reference system's identifier (recorded only — never reprojected) |
commands | The non-destructive-edit log. Each command carries its issuing actor |
entries | Findings, finding types, batches (findings added in version 2, batches in version 3). For batches, see → Non-destructive editing |
When loading is refused
If conditions don't match, the sidecar states the reason and doesn't apply, rather than applying it. Silently applying edits to the wrong points would be worse.
| Message | Meaning |
|---|---|
| These edits may be for different data (signature mismatch) | datasets' signature doesn't match the current data |
| Not applied because the coordinate frame differs | frame differs. Reload the data in the same order |
| Not applied because the coordinate system (CRS) differs | crs differs |
| This sidecar has no coordinate-frame record | An old format. A warning that positions may be off if the frame differs |
| This is a newer-version sidecar | The saved version is newer than this app. Refuses to load, since opening it with an older version would lose edit history |
| The sidecar's format is invalid | The JSON is broken / a different format |
Predicate coordinates are in the aligned frame, so applying a sidecar with a missing or different frame would have the same condition select different points. This is the crux of what gets checked.
An older-version sidecar is migrated before it's loaded (edit/migrate.ts). Only opening a newer version with an older app is impossible.
Exporting selected points
"Export" in the ▚ Select panel, or the command exportSelection. Choose CSV (default) or GeoJSON.
await oniyanma.execute('exportSelection', { format: 'geojson' })- What comes out is real coordinates (m), classification, and RGB
- It's resident-based (the LOD sample currently on screen) — the count grows as you get closer
- Deleted points are excluded, and the count comes back in
excludedDeleted - Besides the file download, the return value also carries the content (the full text if small, or a preview of the first 2000 characters if large). An AI can't see the file dialog, so it can't confirm the result unless it comes back in the response
Exporting findings
exportFindings exports to CSV / GeoJSON. The default is published only (the form you can hand to the client); view: 'draft' includes drafts too. → Filing findings
Sharing view state
To hand over "what it currently looks like" rather than edits, use 📁 Data's "Copy share link". The data URL, camera, color mode, point size, EDL, grid, and section all ride in the URL's hash. → URL parameters