protocol

# `crs_projections_protocol`

Coordinate reference systems and coordinate transformation predicates protocol.

Availability:
`logtalk_load(crs_projections(loader))`
Author: Paulo Moura
Version: 1:0:0
Date: 2026-05-10
Compilation flags:
`static`
Dependencies:
(none)
Remarks:
(none)
Inherited public predicates:
(none)

## Public predicates

### `valid_crs/1`

True when the argument is a supported coordinate reference system. Supported values are `wgs84`, `wgs84_3d`, `web_mercator`, `world_mercator`, `ecef`, `enu(OriginCoordinate)`, `lambert_azimuthal_equal_area(OriginCoordinate)`, and `utm(Zone,Hemisphere)` terms.

Compilation flags:
`static`
Template:
`valid_crs(CRS)`
Mode and number of proofs:
`valid_crs(@term)` - `zero_or_one`

### `crs_name/2`

Maps a supported coordinate reference system to a human-readable name.

Compilation flags:
`static`
Template:
`crs_name(CRS,Name)`
Mode and number of proofs:
`crs_name(+term,-atom)` - `zero_or_one`

### `crs_kind/2`

Classifies a supported coordinate reference system as `geographic`, `projected`, `geocentric`, or `local_tangent_plane`.

Compilation flags:
`static`
Template:
`crs_kind(CRS,Kind)`
Mode and number of proofs:
`crs_kind(+term,-atom)` - `zero_or_one`

### `crs_units/2`

Returns the coordinate axis units used by a supported coordinate reference system. Supported values are `degrees`, `meters`, and `[degrees,degrees,meters]`.

Compilation flags:
`static`
Template:
`crs_units(CRS,Units)`
Mode and number of proofs:
`crs_units(+term,-term)` - `zero_or_one`

### `crs_dimensions/2`

Returns the coordinate dimensionality for a supported coordinate reference system.

Compilation flags:
`static`
Template:
`crs_dimensions(CRS,Dimensions)`
Mode and number of proofs:
`crs_dimensions(+term,-positive_integer)` - `zero_or_one`

### `crs_epsg/2`

Maps a supported coordinate reference system to the corresponding EPSG code.

Compilation flags:
`static`
Template:
`crs_epsg(CRS,EPSG)`
Mode and number of proofs:
`crs_epsg(+term,-positive_integer)` - `zero_or_one`

### `epsg_crs/2`

Maps a supported EPSG code to the corresponding coordinate reference system term.

Compilation flags:
`static`
Template:
`epsg_crs(EPSG,CRS)`
Mode and number of proofs:
`epsg_crs(+positive_integer,-term)` - `zero_or_one`

### `valid_coordinate/2`

True when the coordinate is valid for the given coordinate reference system. `wgs84` coordinates are represented as `geographic(Latitude,Longitude)` in degrees, `wgs84_3d` coordinates as `geographic(Latitude,Longitude,EllipsoidalHeight)` in degrees and meters, `web_mercator`, `world_mercator`, and `lambert_azimuthal_equal_area(OriginCoordinate)` coordinates as `projected(X,Y)` pairs in meters, `ecef` coordinates as `ecef(X,Y,Z)` triples in meters, `enu(OriginCoordinate)` coordinates as `enu(East,North,Up)` triples in meters, and `utm(Zone,Hemisphere)` coordinates as `grid(Easting,Northing)` pairs in meters.

Compilation flags:
`static`
Template:
`valid_coordinate(CRS,Coordinate)`
Mode and number of proofs:
`valid_coordinate(+term,@compound)` - `zero_or_one`

### `local_tangent_plane/3`

Projects a WGS84 geographic coordinate to local `enu(East,North,Up)` coordinates in meters using an origin coordinate. For height-preserving 3D geodetic workflows, use `transform/4` with `wgs84_3d`.

Compilation flags:
`static`
Template:
`local_tangent_plane(Origin,Coordinate,LocalCoordinate)`
Mode and number of proofs:
`local_tangent_plane(+compound,+compound,-compound)` - `zero_or_one`

### `local_tangent_plane_inverse/3`

Converts local `enu(East,North,Up)` coordinates in meters back to a WGS84 geographic coordinate using an origin coordinate. For height-preserving 3D geodetic workflows, use `transform/4` with `wgs84_3d`.

Compilation flags:
`static`
Template:
`local_tangent_plane_inverse(Origin,LocalCoordinate,Coordinate)`
Mode and number of proofs:
`local_tangent_plane_inverse(+compound,+compound,-compound)` - `zero_or_one`

### `lambert_azimuthal_equal_area/3`

Projects a WGS84 geographic coordinate to a Lambert azimuthal equal-area plane centered on an origin coordinate, returning `projected(X,Y)` coordinates in meters.

Compilation flags:
`static`
Template:
`lambert_azimuthal_equal_area(Origin,Coordinate,ProjectedCoordinate)`
Mode and number of proofs:
`lambert_azimuthal_equal_area(+compound,+compound,-compound)` - `zero_or_one`

### `lambert_azimuthal_equal_area_inverse/3`

Converts Lambert azimuthal equal-area `projected(X,Y)` coordinates back to a WGS84 geographic coordinate using an origin coordinate.

Compilation flags:
`static`
Template:
`lambert_azimuthal_equal_area_inverse(Origin,ProjectedCoordinate,Coordinate)`
Mode and number of proofs:
`lambert_azimuthal_equal_area_inverse(+compound,+compound,-compound)` - `zero_or_one`

### `utm_zone/2`

Infers the UTM longitudinal zone for a WGS84 `geographic(Latitude,Longitude)` coordinate. Uses the standard Norway and Svalbard special-zone rules and only succeeds for coordinates within the UTM latitude coverage.

Compilation flags:
`static`
Template:
`utm_zone(Coordinate,Zone)`
Mode and number of proofs:
`utm_zone(+compound,-integer)` - `zero_or_one`

### `utm_crs/2`

Infers the native UTM coordinate reference system term `utm(Zone,Hemisphere)` for a WGS84 `geographic(Latitude,Longitude)` coordinate.

Compilation flags:
`static`
Template:
`utm_crs(Coordinate,CRS)`
Mode and number of proofs:
`utm_crs(+compound,-compound)` - `zero_or_one`

### `transform/4`

Transforms a coordinate between supported coordinate reference systems. Transformations between projected systems are computed by converting through `wgs84`.

Compilation flags:
`static`
Template:
`transform(SourceCRS,TargetCRS,Coordinate,TransformedCoordinate)`
Mode and number of proofs:
`transform(+term,+term,+compound,-compound)` - `zero_or_one`

## Protected predicates

(none)

## Private predicates

(none)

## Operators

(none)

See also

crs_projections, geospatial_protocol