# `Sidereon.GNSS.StaticPositioning`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/gnss/static_positioning.ex#L1)

Multi-epoch static GNSS single-point positioning.

A static solve estimates one shared receiver ECEF position from several
pseudorange epochs while fitting epoch-local receiver clocks. It is useful
when a receiver is known to be stationary and the caller wants the stacked
solution covariance, residuals, and leave-one-out influence diagnostics from
the core solver.

# `epoch_request`

```elixir
@type epoch_request() ::
  %{
    :observations =&gt; [Sidereon.GNSS.Positioning.observation()],
    :epoch =&gt; Sidereon.GNSS.Positioning.epoch(),
    optional(:weights) =&gt; [number()],
    optional(:clock_initial_m) =&gt; number()
  }
  | {[Sidereon.GNSS.Positioning.observation()],
     Sidereon.GNSS.Positioning.epoch()}
  | {[Sidereon.GNSS.Positioning.observation()],
     Sidereon.GNSS.Positioning.epoch(), keyword()}
```

One static epoch request.

# `solve`

```elixir
@spec solve(
  Sidereon.GNSS.SP3.t() | Sidereon.GNSS.Broadcast.t(),
  [epoch_request()],
  keyword()
) ::
  {:ok, Sidereon.GNSS.StaticPositioning.Solution.t()} | {:error, term()}
```

Solve one static receiver position from multiple pseudorange epochs.

`source` is a parsed SP3 precise product or broadcast navigation product.
Each epoch supplies pseudorange observations and a receive epoch. Epoch options
may override the solve-wide atmosphere, weights, clock seed, and GLONASS
channel options for that epoch.

Options:

  * `:initial_position` - shared `{x_m, y_m, z_m}` position seed, default
    `{0.0, 0.0, 0.0}`.
  * `:with_geodetic` - include geodetic output, default `true`.
  * `:ionosphere`, `:troposphere`, `:klobuchar_alpha`, `:klobuchar_beta`,
    `:pressure_hpa`, `:temperature_k`, `:relative_humidity`, and
    `:glonass_channels` match `Sidereon.GNSS.Positioning.solve/4`.
  * `:huber` plus `:huber_k`, `:huber_sigma`, and `:huber_max_iter` enables
    the core static Huber reweighting.

Returns `{:ok, %Solution{}}` or `{:error, reason}` with typed static solve
errors from the core.

---

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