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

DTED terrain loading and elevation lookup.

# `interpolation`

```elixir
@type interpolation() :: :bilinear | :nearest_posting
```

# `lookup_options`

```elixir
@type lookup_options() :: keyword() | Sidereon.Terrain.DtedLookupOptions.t()
```

# `dted`

```elixir
@spec dted(String.t()) :: {:ok, Sidereon.Terrain.Dted.t()} | {:error, term()}
```

Open a DTED terrain directory.

The returned handle loads tiles lazily as lookups request them.

# `dted!`

Open a DTED terrain directory or raise.

# `height`

```elixir
@spec height(Sidereon.Terrain.Dted.t(), number(), number(), lookup_options()) ::
  {:ok, float()} | {:error, atom()}
```

Look up terrain height at `{longitude_deg, latitude_deg}`.

Returns `{:ok, height_m}` in meters above the DTED ORTHOMETRIC vertical datum,
or `{:error, reason}`. Points outside cached DTED coverage return `0.0` from
the core terrain model. Longitude is first by design.

# `height!`

Look up one ORTHOMETRIC terrain height in meters or raise.

# `height_batch`

```elixir
@spec height_batch(
  Sidereon.Terrain.Dted.t(),
  [{number(), number()}],
  lookup_options()
) ::
  [ok: float(), error: atom()] | {:error, term()}
```

Look up a batch of terrain heights.

`points` is a list of `{longitude_deg, latitude_deg}` pairs. The returned list
has one `{:ok, height_m}` or `{:error, reason}` entry per input, preserving
order. Heights are meters above the DTED ORTHOMETRIC vertical datum.

# `height_batch!`

Look up a batch of ORTHOMETRIC terrain heights in meters or raise.

# `height_m`

```elixir
@spec height_m(Sidereon.Terrain.Dted.t(), number(), number(), lookup_options()) ::
  {:ok, float()} | {:error, atom()}
```

Alias for `height/4`, matching the Rust/Python/WASM `height_m` name.

# `height_m_with_options`

```elixir
@spec height_m_with_options(
  Sidereon.Terrain.Dted.t(),
  number(),
  number(),
  lookup_options()
) ::
  {:ok, float()} | {:error, atom()}
```

Look up terrain height with explicit lookup options.

# `load_tile`

```elixir
@spec load_tile(String.t()) :: {:ok, Sidereon.Terrain.DtedTile.t()} | {:error, term()}
```

Load one DTED tile from disk.

# `load_tile!`

Load one DTED tile or raise.

# `tile_elevation`

```elixir
@spec tile_elevation(Sidereon.Terrain.DtedTile.t(), number(), number()) ::
  {:ok, integer()} | {:error, atom()}
```

Read the nearest posting elevation from a loaded DTED tile.

Returns an integer height in meters above the DTED ORTHOMETRIC vertical datum.
Longitude is first.

# `tile_elevation!`

Read one ORTHOMETRIC tile posting height in meters or raise.

---

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