crs_projections
This library provides a crs_projections_protocol protocol and a
crs_projections object for working with a small set of common
coordinate reference systems and transforming coordinates between them.
Both 2D and explicit 3D WGS84 geodetic coordinates are supported.
API documentation
Open the ../../apis/library_index.html#crs_projections link in a web browser.
Loading
To load all entities in this library, load the loader.lgt file:
| ?- logtalk_load(crs_projections(loader)).
Testing
To test this library predicates, load the tester.lgt file:
| ?- logtalk_load(crs_projections(tester)).
Supported coordinate reference systems
The library currently supports:
wgs84geographic coordinates represented asgeographic(Latitude,Longitude)in degreeswgs84_3dgeographic coordinates represented asgeographic(Latitude,Longitude,EllipsoidalHeight)in degrees and metersweb_mercatorprojected coordinates represented asprojected(X,Y)in metersworld_mercatorprojected coordinates represented asprojected(X,Y)in metersecefgeocentric coordinates represented asecef(X,Y,Z)in metersenu(OriginCoordinate)local tangent-plane coordinates represented asenu(East,North,Up)in meterslambert_azimuthal_equal_area(OriginCoordinate)equal-area projected coordinates represented asprojected(X,Y)in metersutm(Zone,Hemisphere)projected coordinates represented asgrid(Easting,Northing)in meters
EPSG helpers are available for these reference systems:
4326forwgs844979forwgs84_3d3857forweb_mercator3395forworld_mercator4978forecef32601-32660for northern-hemisphere UTM zones32701-32760for southern-hemisphere UTM zones
Additional metadata helpers are provided for querying CRS names, kinds, coordinate units, and dimensions.
Additional projection helpers are provided for working directly with local ENU tangent-plane coordinates and Lambert azimuthal equal-area coordinates.
Usage
Load the library:
| ?- logtalk_load(crs_projections(loader)).
Validate CRS terms and look up EPSG codes:
| ?- crs_projections::valid_crs(utm(29, north)).
| ?- crs_projections::crs_name(wgs84_3d, Name).
| ?- crs_projections::crs_name(ecef, Name).
| ?- crs_projections::crs_kind(world_mercator, Kind).
| ?- crs_projections::crs_units(wgs84, Units).
| ?- crs_projections::crs_units(wgs84_3d, Units).
| ?- crs_projections::crs_dimensions(ecef, Dimensions).
| ?- crs_projections::crs_dimensions(wgs84_3d, Dimensions).
| ?- crs_projections::crs_epsg(web_mercator, EPSG).
| ?- crs_projections::crs_epsg(wgs84_3d, EPSG).
| ?- crs_projections::epsg_crs(32629, CRS).
| ?- crs_projections::epsg_crs(4979, CRS).
| ?- crs_projections::valid_crs(enu(geographic(38.7223, -9.1393))).
| ?- crs_projections::valid_crs(lambert_azimuthal_equal_area(geographic(38.7223, -9.1393))).
Infer the native UTM CRS for a WGS84 coordinate:
| ?- crs_projections::utm_zone(geographic(38.7223, -9.1393), Zone).
| ?- crs_projections::utm_crs(geographic(38.7223, -9.1393), CRS).
Transform WGS84 coordinates to projected systems and back:
| ?- crs_projections::transform(wgs84, web_mercator, geographic(38.7223, -9.1393), Projected).
| ?- crs_projections::transform(wgs84, wgs84_3d, geographic(38.7223, -9.1393), Geodetic3D).
| ?- crs_projections::transform(wgs84_3d, ecef, geographic(38.7223, -9.1393, 123.45), Geocentric3D).
| ?- crs_projections::transform(ecef, wgs84_3d, Geocentric3D, Geodetic3D).
| ?- crs_projections::transform(web_mercator, wgs84, Projected, Coordinate).
| ?- crs_projections::transform(wgs84, world_mercator, geographic(38.7223, -9.1393), Mercator).
| ?- crs_projections::transform(wgs84, ecef, geographic(38.7223, -9.1393), Geocentric).
| ?- crs_projections::transform(wgs84_3d, enu(geographic(38.7223, -9.1393, 100.0)), geographic(38.7223, -9.1393, 125.0), Local3D).
| ?- crs_projections::transform(enu(geographic(38.7223, -9.1393, 100.0)), wgs84_3d, Local3D, Geodetic3D).
| ?- crs_projections::transform(wgs84, enu(geographic(38.7223, -9.1393)), geographic(38.7233, -9.1383), Local).
| ?- crs_projections::transform(wgs84, lambert_azimuthal_equal_area(geographic(38.7223, -9.1393)), geographic(38.7233, -9.1383), EqualArea).
| ?- crs_projections::transform(wgs84, utm(29, north), geographic(38.7223, -9.1393), UTM).
| ?- crs_projections::transform(utm(29, north), wgs84, UTM, Coordinate).
Use direct helper predicates for local tangent-plane and equal-area workflows:
| ?- crs_projections::local_tangent_plane(geographic(38.7223, -9.1393), geographic(38.7233, -9.1383), Local).
| ?- crs_projections::local_tangent_plane_inverse(geographic(38.7223, -9.1393), Local, Coordinate).
| ?- crs_projections::lambert_azimuthal_equal_area(geographic(38.7223, -9.1393), geographic(38.7233, -9.1383), EqualArea).
| ?- crs_projections::lambert_azimuthal_equal_area_inverse(geographic(38.7223, -9.1393), EqualArea, Coordinate).
Notes
The utm_zone/2, utm_crs/2, and UTM transformation predicates
only succeed for latitudes in the [-80.0,84.0[ range, matching the
standard UTM coverage.
Transformations between projected coordinate reference systems are
implemented by converting through wgs84.
When converting from wgs84 to wgs84_3d, the ellipsoidal height
defaults to 0.0. When converting from 2D projected or geographic
coordinate reference systems to wgs84_3d, the resulting ellipsoidal
height is also 0.0 because the source coordinate reference system
does not carry height information.
Transforms between ecef and projected coordinate reference systems
are also implemented through wgs84.
Transforms involving enu(OriginCoordinate) preserve the local Up
component when converting directly to or from ecef and wgs84_3d.