# `Sidereon.GeodeticTimeSeries`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/geodetic_time_series.ex#L1)

Geodetic position time-series velocity, trajectory, step, and network tools.

Epochs are decimal years. Positions are metres in the selected frame.

# `error_reason`

```elixir
@type error_reason() ::
  :invalid_input
  | :too_few_samples
  | :insufficient_pairs
  | :singular_trajectory
  | :did_not_converge
  | :solver
  | term()
```

# `frame`

```elixir
@type frame() :: :enu | {:ecef, {number(), number(), number()}}
```

# `sample`

```elixir
@type sample() ::
  Sidereon.GeodeticTimeSeries.PositionSample.t()
  | {number(), {number(), number(), number()}}
```

# `detect_steps`

```elixir
@spec detect_steps(
  [sample()],
  keyword() | Sidereon.GeodeticTimeSeries.StepDetectionOptions.t()
) ::
  {:ok, [Sidereon.GeodeticTimeSeries.StepCandidate.t()]}
  | {:error, error_reason()}
```

Detect displacement step candidates.

# `fit_trajectory`

```elixir
@spec fit_trajectory(
  [sample()],
  Sidereon.GeodeticTimeSeries.TrajectoryModel.t(),
  keyword() | Sidereon.GeodeticTimeSeries.TrajectoryFitOptions.t()
) ::
  {:ok, Sidereon.GeodeticTimeSeries.Trajectory.t()} | {:error, error_reason()}
```

Fit a linear geodetic trajectory model.

Pass a `TrajectoryModel` as the second argument and fit options as the third.
The `:frame` option selects `:enu` or `{:ecef, reference}` input positions.

# `network_field`

```elixir
@spec network_field(
  [Sidereon.GeodeticTimeSeries.NetworkStation.t()],
  {number(), number(), number()},
  keyword()
) ::
  {:ok, Sidereon.GeodeticTimeSeries.MotionField.t()} | {:error, error_reason()}
```

Estimate a network motion field in one output frame.

`origin` is `{lat_rad, lon_rad, height_m}` for the output local ENU frame.

# `velocity_midas`

```elixir
@spec velocity_midas(
  [sample()],
  keyword() | Sidereon.GeodeticTimeSeries.MidasOptions.t()
) ::
  {:ok, Sidereon.GeodeticTimeSeries.Velocity.t()} | {:error, error_reason()}
```

Estimate station velocity with MIDAS.

Options accept the `MidasOptions` fields plus `:frame`, which defaults to
`:enu`.

---

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