A consolidated, read-only diagnostic for a single-point-positioning result.
Given an already-computed Orbis.GNSS.Positioning.Solution, an ephemeris
source, and the receive epoch, build/4 assembles one report that explains
the solved position: the per-satellite sky geometry (elevation / azimuth),
the post-fit pseudorange residuals, the RAIM integrity verdict and per-
satellite normalized residuals, and a top-level solution summary including the
dilution-of-precision scalars and the residual RMS.
This module performs no estimation. Every value is read straight from an existing primitive, so each field is traceable to its source:
residual_mis copied fromSolution.residuals_m, paired withSolution.used_satsby index (the same pairingOrbis.GNSS.QC.raim/2uses);normalized_residualis copied fromOrbis.GNSS.QC.raim/2'snormalized_residualsmap;elevation_deg/azimuth_degcome fromOrbis.GNSS.Observables.predict/5evaluated at the solved position, withpredict's defaults (light-time and Sagnac corrections on);dop,geodetic, the ECEF position,metadata, and every integrity scalar are passed through verbatim;residual_rms_mis the only newly derived scalar — the root mean square of the post-fit residuals over the used satellites.
Row ordering
Satellite rows are emitted used satellites first, then rejected
satellites; within each group rows are sorted by elevation_deg
descending, with nil elevation last (a rejected satellite with no ephemeris
cannot be located in the sky).
Example
{:ok, solution} = Orbis.GNSS.Positioning.solve(sp3, observations, epoch)
{:ok, report} = Orbis.GNSS.SolutionReport.build(solution, sp3, epoch)
report.summary.residual_rms_m
report.summary.integrity.fault_detected?
report |> Orbis.GNSS.SolutionReport.format() |> Enum.each(&IO.puts/1)
Summary
Functions
Assemble a %Orbis.GNSS.SolutionReport{} from a solved result, its ephemeris
source, and the receive epoch.
Render an already-built report as a deterministic list of human-readable lines: a summary header followed by one line per satellite row, in the report's row order.
Alias for format/1.
Types
@type summary() :: %{ position: %{ecef: map(), geodetic: map() | nil}, n_used: non_neg_integer(), n_rejected: non_neg_integer(), dop: map() | nil, residual_rms_m: float(), integrity: map(), metadata: map(), status: atom() }
@type t() :: %Orbis.GNSS.SolutionReport{ satellites: [satellite_row()], summary: summary() }
Functions
@spec build( Orbis.GNSS.Positioning.Solution.t(), Orbis.GNSS.SP3.t(), NaiveDateTime.t(), keyword() ) :: {:ok, t()} | {:error, term()}
Assemble a %Orbis.GNSS.SolutionReport{} from a solved result, its ephemeris
source, and the receive epoch.
Returns {:ok, report} on success or a tagged {:error, reason} for a
malformed solution, source, or epoch. Never raises.
Options
:raim- a keyword list forwarded verbatim toOrbis.GNSS.QC.raim/2(supports:p_fa,:weights,:n_systems).:weights,:p_fa- convenience top-level options merged into the:raimoptions. A value given here takes precedence over the same key inside:raim.
The integrity block and per-satellite normalized residuals come from the
single Orbis.GNSS.QC.raim/2 call those options drive, so the report cannot
diverge from RAIM.
Render an already-built report as a deterministic list of human-readable lines: a summary header followed by one line per satellite row, in the report's row order.
Pure formatting — it performs no new computation and calls no primitive.
Alias for format/1.