# `Sidereon.GNSS.Positioning.DopplerSolution`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/gnss/positioning.ex#L234)

A receiver position solution paired with an optional Doppler velocity solve.

`receiver` is the normal `Sidereon.GNSS.Positioning.Solution`. When Doppler
rows are supplied and the velocity geometry is solvable, `velocity` contains
the ECEF velocity, speed, receiver clock drift, unit-variance state
covariance, residuals, and used satellites. When no Doppler rows are supplied
or the velocity geometry is not solvable, `velocity` is `nil` and
`velocity_error` carries the typed reason when there was a Doppler attempt.

# `t`

```elixir
@type t() :: %Sidereon.GNSS.Positioning.DopplerSolution{
  receiver: Sidereon.GNSS.Positioning.Solution.t(),
  velocity: velocity() | nil,
  velocity_error: term() | nil
}
```

Pseudorange receiver solution plus optional Doppler velocity result.

# `velocity`

```elixir
@type velocity() :: %{
  velocity_m_s: {float(), float(), float()},
  speed_m_s: float(),
  clock_drift_s_s: float(),
  state_covariance: [[float()]],
  residuals_m_s: %{required(String.t()) =&gt; float()},
  used_sats: [String.t()],
  n_satellites: non_neg_integer()
}
```

Doppler-derived receiver velocity solve result.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
