A single-point-positioning solution at one receive epoch.
position is the converged ITRF/IGS ECEF position in meters. geodetic is
the same point as %{lat_rad, lon_rad, height_m} when geodetic output was
requested (the default), otherwise nil. rx_clock_s is the reference-system
receiver clock bias in seconds; system_clocks_s is a map of GNSS letter
(e.g. "G", "E") to that system's absolute receiver clock in seconds (a
single entry for a one-system solve, one per constellation for a mixed solve).
These are per-system clocks, not biases: the inter-system bias of a system is
its clock minus the reference system's (rx_clock_s). dop carries the
dilution-of-precision scalars for any full-rank geometry — a single-system
solve uses the bit-exact four-state cofactor, a multi-system solve a general
inverse with one clock column per constellation — and is nil only when the
geometry is rank-deficient. residuals_m are the post-fit
pseudorange residuals in meters, in used_sats order. used_sats are the
contributing satellite id strings (e.g. "G01"); rejected_sats pairs each
excluded satellite id with its reason atom (:no_ephemeris or
:low_elevation). metadata reports solver iterations, convergence, and
which corrections were applied.
Summary
Types
@type metadata() :: %{ iterations: non_neg_integer(), converged: boolean(), status: atom(), ionosphere_applied: boolean(), troposphere_applied: boolean() }
@type t() :: %Orbis.GNSS.Positioning.Solution{ dop: dop() | nil, geodetic: geodetic() | nil, metadata: metadata(), position: position(), rejected_sats: [{String.t(), :no_ephemeris | :low_elevation}], residuals_m: [float()], rx_clock_s: float(), system_clocks_s: %{required(String.t()) => float()}, used_sats: [String.t()] }