# Leveller --- Daylon Leveller Heightfield

Leveller heightfields store 32-bit elevation values. Format versions 4 through 7 are supported with various caveats (see below). The file extension for Leveller heightfields is "TER" (which is the same as Terragen, but the driver only recognizes Leveller files).

Blocks are organized as pixel-high scanlines (rows), with the first scanline at the top (north) edge of the DEM, and adjacent pixels on each line increasing from left to right (west to east).

The band type is always Float32, even though format versions 4 and 5 physically use 16.16 fixed-point. The driver autoconverts them to floating-point.

## Reading

`dataset::GetProjectionRef()` will return only a local coordinate system for file versions 4 through 6.

`dataset::GetGeoTransform()` returns a simple world scaling with a centered origin for formats 4 through 6. For version 7, it returns a realworld transform except for rotations. The identity transform is not considered an error condition; Leveller documents often use them. Since Leveller considers pixels as points, a half-pixel origin shift is applied to conform to GDAL's pixels-as-areas protocol.

`band::GetUnitType()` will report the measurement units used by the file instead of converting unusual types to meters. A list of unit types is in the `levellerdataset.cpp` module.

`band::GetScale()` and `band::GetOffset()` will return the physical-to-logical (i.e., raw to realworld) transform for the elevation data.

## Writing

The `dataset::Create()` call is supported, but for version 7 files only.

`band::SetUnitType()` can be set to any of the unit types listed in the `levellerdataset.cpp` module.

`dataset::SetGeoTransform()` should not include rotation data. Since Leveller considers pixels as points, a half-pixel origin shift is applied to conform to GDAL's pixels-as-areas protocol.

As with the Terragen driver, the `MINUSERPIXELVALUE` option must be specified. This lets the driver correctly map from logical (realworld) elevations to physical elevations.

Header information is written out on the first call to `band::IWriteBlock`.

## History

v1.3 (Jan 27/08): Added pixels-as-areas fix.
v1.2 (Jul 17/07): Added v7 and Create support.
v1.1 (Oct 20/05): Fixed coordsys and elev scaling errors.

## See Also:

- Implemented as `gdal/frmts/leveller/levellerdataset.cpp`.

- Leveller SDK, which documents the Leveller format.