Skip to content

Add lidar/point cloud integration guide and modernize integration docs - #534

Open
kevankramb wants to merge 12 commits into
masterfrom
kevankramb-lidar-integration-guide
Open

Add lidar/point cloud integration guide and modernize integration docs#534
kevankramb wants to merge 12 commits into
masterfrom
kevankramb-lidar-integration-guide

Conversation

@kevankramb

Copy link
Copy Markdown
Contributor

Integrators converting lidar, point cloud, or other classified survey data into our schema JSON regularly ask "what are the main fields to fill in from the acquisition?" We had no doc answering that, and while auditing for one we found broader gaps: broken links, stale version references, 7.x-era content, and inaccurate claims about ID validation. This PR adds the guide and fixes the surrounding docs.

New documentation

  • doc/lidar_integration.md - a priority-ordered guide mapping point-cloud extractions to schema fields, informed by how the calc engine actually consumes the JSON: what drives analysis (attachment heights, spans, sags, lean), what calc defaults when absent, tension options when field tension is unknown, units/bearing conventions, a validation checklist, and a suggested development path. Linked from the README, doc/calc.md, and doc/data_requirements.md.
  • resources/examples/spidacalc/projects/lidar_measured_project.json - a complete "Measured" design built the way the guide describes (measured AGL/GLC, lean, measuredSag and midspanHeight wires, span points, relative WEP elevations, externalIds throughout). Validates clean against project.schema in strict draft-04 mode.
  • doc/calc.md "Identifiers and Validation" - documents what SPIDAcalc actually enforces on imported JSON, verified against the calc engine source: import-time schema validation always runs and rejects failures; component id format rules and first-match behavior for duplicate ids; connectionId must be lowercase 24-char hex ([a-f0-9]{24}); clientItemVersion/load case version hashes must be lowercase 32-char hex ([a-f0-9]{32}) with clientItem/alias fallback; label restrictions. Replaces the previous inaccurate "ids may be any string" claim.

Docs cleanup

  • Fixed 17 broken or malformed relative links across doc/ and resources/schema/README.md (a link checker now reports zero broken links)
  • Corrected stale README version lines and added doc indexes so orphaned docs (data_requirements.md, clientReferences.md, results.md, cee.md) are discoverable
  • Modernized calc.md: structure fields list now matches structure.schema exactly (adds wireMountedEquipments, trusses, componentBraces; removes a duplicate entry and deprecated sidewalk guys), fixed stale schema paths (v1/calc, calc_project.schema), condensed decade-old 4.4.2/5.3-era known-issue notes into current behavior, and replaced dead JSV tooling references with the repo's validateJson task
  • Normalized SPIDACalc -> SPIDAcalc across markdown docs
  • Replaced the retired Zendesk support link with the ServiceNow support portal

Notes for reviewers

  • The ID validation section and the lidar guide's engine-behavior claims (measured vs nominal precedence, tension resolution order, analysis stoppers) were verified by reading the calc engine source; worth a skim from someone who knows that code.
  • The new example was validated with the same networknt draft-04 validator the repo's Validator class uses, in strict mode, alongside a known-good control example.

kevankramb and others added 12 commits August 30, 2026 01:06
Adds doc/lidar_integration.md outlining the highest-priority schema fields
for integrators converting lidar, point cloud, or other classified survey
datasets into SPIDA project JSON, with field-by-field geometry mapping,
tension options, units/conventions, and validation checklist. Links the
guide from README, calc.md, and data_requirements.md.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- Fix broken schema links in rpc.md, clientAPI.md, stationLinkerAPI.md,
  projectSearches.md, and resources/schema/README.md
- Fix malformed cee-cli link in input_assemblies.md and point rpc.md's
  removed asset.json interface reference to the asset API doc
- Update README released/master version lines (12.0.3 / 13.0.0) and typo
- Link previously undiscoverable integration docs (data_requirements,
  clientReferences, results, cee) from README, calc.md, and doc/README.md
- Add SPIDAcalc doc index to doc/README.md landing page

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Validates against spidacalc/calc/project.schema (draft-04, strict).
Demonstrates a Measured design populated from point cloud extraction:
measured pole agl/glc, lean, measuredSag and midspanHeight wires,
span points, relative WEP elevations, and pc-* externalIds.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
calc.md:
- Correct Supported Structure Fields list to match structure.schema
  (adds wireMountedEquipments, trusses, componentBraces; removes
  duplicate Equipment entry and deprecated Sidewalk Guys)
- Fix stale schema paths (v1/calc -> resources/schema/spidacalc/calc)
  and calc_project.schema -> project.schema
- Condense long-resolved 4.4.2/5.3-era known issues and strikethrough
  history into current behavior statements
- Fix broken/bare dev-tool links; point schema validation at the
  repo's validateJson gradle task
- Fix demo script path and typos (Unknwn, CROSS_CONNEC T,
  'another programming', coffescript)
- Replace absolute GitHub links with relative doc links

All docs: normalize SPIDACalc -> SPIDAcalc casing.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Replaces the inaccurate 'Component ids may be any string' claim with
an Identifiers and Validation section covering what SPIDAcalc actually
enforces on import:

- Import-time schema validation always runs; failures reject the file
  (strict mode only changes additionalProperties handling)
- Component ids: letters/numbers/underscores/spaces/#, min 2 chars,
  no leading/trailing space; uniqueness required but only enforced in
  the UI - duplicates on import resolve to the first match
- connectionId: lowercase 24-char hex ([a-f0-9]{24}, schema-enforced);
  pairing rules and silent-disconnect behavior documented
- clientItemVersion / load case version / analysisCaseVersion:
  lowercase 32-char hex hash ([a-f0-9]{32}, schema-enforced) with
  clientItem/clientItemAlias fallback
- externalId free-form; project/location/design ids calc-managed;
  label character and length limits

Also links the lidar guide's ID note to the new section.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Three-pole example project demonstrating cross-design connectivity
(connectionIds on wire end points and wires), connectedWire pairs
through the middle pole, and measuredSag on all spans. Validated
against project.schema (strict draft-04). Linked from the lidar
integration guide and calc.md connectivity section, and refreshed
the stale projects example README index.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Capstone example project integrating all lidar-extraction features in a
semi-realistic feeder: five connected locations (connectionIds), connected
wires through the middle poles (connectedWire), field-measured sags for
tension data on every span, and terrainPoints under every span including
a creek crossing, plus deadend guys/anchors and a transformer. Terrain
profiles are reciprocal across connected WEPs and validated against
project.schema (strict draft-04). Linked from the lidar guide, calc.md
connectivity section, and the projects README.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Five-pole connected example that delivers ground as a project-level
terrain layer (terrainLayers points with lat/lon/absolute elevations,
assigned to the Measured Design layer via appliedTerrainLayers) instead
of per-span wireEndPoints[].terrainPoints. Terrain elevations at the
pole locations are consistent with the WEP relative elevations, and
connectivity/measured sags follow the other lidar examples. Documented
appliedTerrainLayers in the calc.md Terrain Layers section and updated
the guide's terrain row and example indexes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Investigated why the terrain layer example was not applied to spans in
SPIDAcalc. Root cause: Design.hasTerrain() requires the design
mapLocation to include an absolute altitude; on JSON import calc wires
the layer but never back-fills pole elevations (that only happens via
the UI settings dialog), so 2D coordinates cause a silent fallback to
per-span terrainPoints. Point proximity was not an issue - points need
only be within profileViewWidth of the span centerline, which held.

- Add third GeoJSON coordinate (pole base elevation, meters ASL) to
  every location geographicCoordinate and design mapLocation in
  lidar_terrain_layer_project.json, exactly matching the terrain layer
  elevation at each pole and the wire end point relativeElevation chain
- Document both requirements in the calc.md Terrain Layers section and
  the lidar integration guide terrain row

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The terrain layer elevations were unit-tagged FOOT values around 780
while the GeoJSON mapLocation altitudes are bare meters around 238 -
functionally identical to calc (which normalizes both to meters), but
the raw file read as a ~550 ft separation between ground and poles and
invited real datum mistakes. Convert all 13 terrain layer point
elevations to METRE with values identical to the pole z coordinates,
and note the GeoJSON meters convention pitfall in the calc.md Terrain
Layers section.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
SPIDAcalc keeps a terrain layer point on a span only if its along-track
projection (computed on a spherical earth from the GPS coordinates) is
within the wire end point's horizontal distance. The example's span
distances were derived with flat-earth approximations and came up
0.1-0.4 ft short of the geodesic pole separations, so the point at the
far pole of every span was silently culled - visible at distance 0 from
its own pole but missing when the same span was viewed from the other
end. Bump each span's distance (both paired wire end points) to cover
the geodesic separation, and document the pitfall in calc.md and the
lidar integration guide.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant