# `Sidereon.GNSS.ARAIM.Geometry`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/gnss/araim.ex#L88)

ARAIM snapshot geometry.

`:receiver` is `{lat_rad, lon_rad, height_m}`. `:clock_systems` is the
ordered receiver-clock column list, encoded as GNSS system letters.

# `az_el_row`

```elixir
@type az_el_row() ::
  {String.t(), number(), number()}
  | {String.t(), number(), number(), atom() | String.t()}
  | %{
      :id =&gt; String.t(),
      :azimuth_deg =&gt; number(),
      :elevation_deg =&gt; number(),
      optional(:system) =&gt; atom() | String.t()
    }
```

A row as `{id, azimuth_deg, elevation_deg}`, `{id, azimuth_deg, elevation_deg, system}`, or a map.

# `receiver`

```elixir
@type receiver() :: {float(), float(), float()}
```

# `t`

```elixir
@type t() :: %Sidereon.GNSS.ARAIM.Geometry{
  clock_systems: [String.t()],
  receiver: receiver(),
  rows: [Sidereon.GNSS.ARAIM.Row.t()]
}
```

# `from_az_el_deg`

```elixir
@spec from_az_el_deg([az_el_row()], {number(), number(), number()}, [
  atom() | String.t()
]) ::
  {:ok, t()} | {:error, term()}
```

Build ARAIM geometry from per-satellite azimuth and elevation rows.

Rows may be `{id, azimuth_deg, elevation_deg}`,
`{id, azimuth_deg, elevation_deg, system}`, or maps with `:id`,
`:azimuth_deg`, `:elevation_deg`, and optional `:system`.

# `new`

```elixir
@spec new([Sidereon.GNSS.ARAIM.Row.t()], {number(), number(), number()}, [
  atom() | String.t()
]) :: t()
```

Build an ARAIM geometry snapshot.

Receiver latitude and longitude are radians, receiver height is meters, and
clock systems use GNSS letters or supported atoms such as `:gps`.

---

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