Skip to content
UTM Altitude Service

UTM Altitude Service

Andi Lamprecht Andi Lamprecht ·· 3 min read· Accepted
ADR-0133 · Author: Sybil Melton · Date: 2025-02-07 · Products: shared
Originally ADR-0081- UTM ALTITUDE service (v4) · Source on Confluence ↗

UTM Altitude Service

Context

UTM currently needs to work with several different Altitude reference systems (AGL, NAVD88, and WGS84) and perform conversion operations between them.

Performing these operations include utilization of the UTM Atlas Elevation API, parsing binary geoid models, and making API calls to the National Oceanic and Atmospheric Administration (NOAA) VDatUm API.

How are Conversions Performed?

We need to be able to perform conversions between any kind of altitude reference to another. This means if we support N references, we must support N * N - 1 conversions.

With 3 altitude references currently supported, we need to be able to perform 6 different kinds of conversions. If and when we decide to add another, this number will jump up to 12, then 20, and so on.

Invalid Image Path

AGL and NAVD88

Converting between AGL and NAVD88 involves utilizing the Atlas Elevation API. This is a pretty simple conversion, but there is the cost of making the API.

NAVD88 and WGS84

image

image from Virtual Surveyer

Converting between NAVD88 and WGS84 is a bit more complex. This involves utilizing a geoid model provided by NOAA (GEOID18), converting WGS84 coordinates to and from NAD83, and adding or subtracting the geoid’s height at a given coordinate.

The WGS84 altitude reference uses only an ellipsoid model, while NAVD88 uses both an ellipsoid model as well as a geoid model. While NAVD88 and WGS84 do not share the same ellipsoid model (GRS80 and WGS84, respectively), the difference between the two is negligible (0.1 millimeter). This means we only need to account for the geoid difference.

Using the image above, we can see H = h - N. In our case, NAVD88 is the orthometric height (H), WGS84 is the is the ellipsoidal height (h), and N is our geoid model: NAVD88 = WGS84 - N.

So, in order to convert NAVD88 to WGS84, we would need to add the geoid height (N) to our NAVD88 height (H): WGS84 = N + NAVD88.

To convert WGS84 to NAVD88, we would perform a similar operation by subtracting the geoid height (N) from from our ellipsoidal height (h): NAVD88 = WGS84 - N.

NOAA API

In the past, we have used the NOAA API to perform this conversion. However, this proved to be slow and unreliable as some of our requests would be rejected. We have since moved toward doing this conversion ourselves using the method described above.

AGL and WGS84

Assuming we can perform AGL <-> NAVD88 and NAVD88 <-> WGS84 conversions, converting between AGL and WGS84 is simple, as NAVD88 becomes a bridge between the two. However, this is the most expensive operation because we must perform two altitude conversions.

Decision Drivers

  • separation of concerns
  • scalability
  • reliability
  • flexibility

Decision

Invalid Image Path

A separate service will be created dedicated to altitude conversion operations. The API endpoints will be used internally to support other UTM services.

Extrema

An extrema endpoint will be created which will find the lower and upper bounds under a GeoJSON object for a given altitude reference.

Transform

A transform endpoint will be created to convert a sequence of 3D coordinates from one coordinate reference system to another.


Alternate Approaches

  • Leave altitude conversions in the core API service
  • Continue using NOAA for altitude conversions

Consequences

  • Another service to maintain
  • An extra API call
  • We must calculate conversions between NAVD88 and WGS84
Last updated on