Spatial information processing requires a robust capability to describe geometric properties such as position, direction and distance. Information may be spatially referenced to local structures (Example: building interiors) and regions (Example: cities), or spatially referenced to the Earth as a whole (Example: global weather). Information may be spatially referenced to other celestial bodies (Examples: astronomical, orbital, and geomagnetic observations). Information may also be spatially referenced to objects defined within contexts such as virtual realities (Example: 3D models). In each of these cases, a spatial reference frame is defined, with respect to which the values of geometric properties may be determined.
It is often necessary to represent position in several different spatial reference frames, simultaneously, according to the context in which the position is to be used. Each spatial reference frame corresponds to a particular way of expressing position. Spatial reference frames may be relative to moving objects (Examples: planets and spacecraft), and therefore have values that are a function of time. It is necessary to specify the time to which the spatial position refers, and the time for which the spatial reference frame is defined.
The Spatial reference model (SRM) defines the conceptual model and the methodologies that allow the description, and transformation or conversion, of geometric properties within or among spatial reference frames. The SRM supports unambiguous specification of the positions, directions, distances, and times associated with spatial information. It also defines algorithms for precise transformation of positions, directions and distances among different spatial reference frames.
The SRM provides an integrated framework and precise terminology for describing spatial concepts and operations on spatial information (including positions, directions, and distances):
The relationships among some of these concepts are depicted in the following figure. An abstract coordinate system is based on the underlying Euclidean structure of position-space. The reference datums that comprise the object reference model determine how position-space relates to object-space. That relationship is mathematically expressed by a normal embedding. A spatial reference frame combines the abstract coordinate system with the object reference model to specify a spatial coordinate system. This allows positions to be expressed relative to a spatial object of interest, such as the Earth.
.
A spatial coordinate system is a means of associating a unique coordinate with a point in object-space. It is defined by binding an abstract Coordinate System (CS) to a normal embedding. A spatial reference frame is a specification of a spatial coordinate system for a region of object-space. It is formed by the binding of an abstract coordinate system to the normal embedding specified by an Object Reference Model (ORM) for that object. A full specification specifies the CS and the ORM and includes values for CS parameters, if any, and a specification of the region of object-space. Some or all CS parameters may be bound by ORM parameters. In particular, a CS based on an oblate ellipsoid (or sphere) must match the parameters of the oblate ellipsoid (or sphere) Rerefence Datum of the ORM.
A spatial reference frame template is an abstraction of a collection of spatial reference frames that share the same abstract coordinate system, coordinate system parameter binding rules, and similar ORMs that model the same spatial object type. Spatial reference frames may be organized into specified sets so as to form an atlas for a large region of space. The SRM specifies a collection of spatial reference frame templates, realizations of those templates, and sets of those realizations.
SRM defined the following SRF Templates (SRFT):
SRM defined the following SRF Sets and their intrinsic SRF template types:
SRM defined the following Standard SRFs and their intrinsic SRF template types:
A reference datum is bound when the reference datum in position-space is identified with a corresponding constructed entity (i.e., a measured or conceptual geometric aspect of a spatial object) in object-space. The term "corresponding" in this context means that each position-space reference datum is bound to a constructed geometric entity of the same geometric object type. That is, position-space points are bound to object-space points, position-space lines to object-space lines, position-space curves to object-space curves, position-space planes to object-space planes, and position-space surfaces to object-space surfaces.
An object reference model (ORM) for a spatial object is a set of bound RDs for which there exists exactly one normal embedding that is compatible with each bound RD in the set. In the 3D case, this unique embedding shall also be right-handed.
An ORM is object-fixed if each of its RD bindings are object-fixed, otherwise it is called object-dynamic. The object-fixed definition assumes that the object itself is not changing in time by an amount significant for the accuracy and time scale of an application. The normal embedding determined by an ORM is, correspondingly, either an object-fixed embedding or an object-dynamic embedding.
Examples of ORMs are: World Geodesic System 1984 (WGS 1894), and COAMPS, and Heliocentric Arieas Ecliptic.
For 3D ORMs, a reference transformation shall be specified by the seven parameters of the corresponding seven-parameter embedding specification. For 2D ORMs, a reference transformation shall be specified by the four parameters of the corresponding four-parameter embedding specification.
For a list of supported reference tranformations for each ORM see the
ORM-RT Relationship Table.
Notice that the leading part of the RT names is the name of the ORM with which they are associated.
A temporal coordinate system is defined as a means of
identifying events in the time continuum by coordinate 1-tuples using an
abstract coordinate system of coordinate system type 1D. A spatial coordinate
system is defined as an abstract coordinate system suitably combined with a
normal embedding as a means of identifying points in object-space by coordinate
n-tuples.
Examples of coordinates are: Celestiocentric 3D coordinate, Local Space Rectangular 2D
coordinate, and Transverse Mercator surface coordinate.
Note that SRM 4.1 release only supports the EGM_96 Geoid and WGS_84 Ellipsoid DSS codes for the
Vertical Separation Offset calculation. See the Release Notes for
additional information.
These are conversions that have an algorithm implemented between the source
SRF and the target SRF. For instance, the coordinate conversion from a
Celestiodetic SRF to a Celestiocentric SRF is a direct conversion. This type
of conversion does not involve intermediate SRFs for its computation and
thus they are most efficient.
These conversions are chains of direct conversions, converting first from the
source SRF to intermediate SRFs, then to the
target SRF. Consequently, these conversions typically take more time to be
executed. For instance, the coordinate conversion from
a Transverse Mercator SRF to a Celestiocentric SRF is an indirect conversion
going through an intermediary conversion to Celestiodetic SRF.
Reflexive conversions are the cases where the source and the target SRFs are of the
same type. The trivial case of this type of conversion is when the source and the
target SRFs have the exact same parameter values. In that case, the identity transformation
is applied to the source coordinate. Another example, to convert from
a CD SRF to another CD SRF with a different ORM/RT pair. In that case, a datum
shift is performed by converting the coordinate from the source CD SRF to an intermediate CC SRF,
apply the datum shift and then to the target CD SRF.
The chart below is provided as a reference to indicate which coordinate
conversions are supported in SRM Version 4.0.1. Empty cells indicate
conversion not supported in 4.0.1.
The details on how to allocate SRFs, allocate coordinates and convert
coordinates are as follows:
There are three ways to allocate SRFs depending whether they are instances of
SRF Templates, SRF Sets, or standard SRFs. Once a SRF is allocated, its
parameter values cannot be changed:
There are 26 SRF Template types in SRM. These include
SRF_Celestiodetic, SRF_Celestiocentric, SRF_LocalSpaceRectangular3D,
and Transverse Mercator. Use specific SRM_<SRFT>_Create functions to
allocate these types of SRF. For example, to allocate a Celestiodetic
SRF using the WGS 1984 ORM with the Identity reference transformation:
There are 7 SRF Sets currently defined in SRM. These include
Universal Transverse Mercator (UTM), Geo Tile Reference
System (GRTS) Global Coordinate System (GCS), and Universal Polar Stereographic (UPS).
Each of these SRF Sets are composed of a well-defined set of members. For example,
UTM is composed of 120 members (zones) while GTRS GCS has 59,896 members (cell ids).
These SRF Set members can be allocated by invoking the SRM_CreateSRFSetMember
function with proper SRM SET Code and member code. For example, to allocate an UTM member zone 12 in
North hemisphere using the WGS 1984 ORM with the Identity reference transformation:
There are 14 Standard SRFs currently defined in SRM. These include British
National Grid Airy (BNG), Irish Grid, and the Maryland State Plane Coordinate
System (SPCS). Instances of these Standard SRFs can be allocated by invoking
the SRM_CreateStandardSRF() function using the proper SRF code. For example, to
allocate an instance of BNG:
The ORM parameter is pre-defined for each standard SRF. Users can only specify
the reference transformation parameter that are applicable to that particular ORM. The pre-specified
ORMs for the standard SRFs are as follows:
Each SRF Template has its specific coordinates defined. The coordinates is only valid
when associated with a specific SRF. Depending on the SRF allocated, 2D,
3D or surface coordinates can be associated with it:
For example, to allocate a 3D coordinate for a Celestiodetic SRF:
Having allocated the source SRF, the source coordinate, the target SRF, and
the target coordinate, invoke the
SRM_ChangeCoordinateSRF() to calculate the
target coordinate and the Valid Region. For example, to convert a Celestiodetic
3D coordinate to a Transverse Mercator SRF:
A Direction object can be allocated using the CreateDirection() method. For example,
to allocate a Direction using a Celestiodetic
3D coordinate "cd_ref_location" associated with and a direction vector (0.0, 0.0, 1.0):
Having allocated the source and target SRFs and Directions, invoke the
ChangeDirectionSRF() method to calculate the
target direction and the Valid Region. For example, to convert the Celestiodetic
direction to a Transverse Mercator SRF "tm_srf":
An Orientation object can be allocated using the CreateOrientation() method.
For example, to allocate a
Direction using a Celestiodetic
3D coordinate "cd_ref_location" associated with and an identity matrix:
Having allocated the source and target SRFs and orientations, invoke the
ChangeOrientationSRF() method to calculate the
target orientation and the Valid Region. For example, to convert the Celestiodetic
orientation to a Transverse Mercator SRF "tm_srf":
Return to: Top
Copyright © 2006 SEDRIS
Coordinate System
An abstract coordinate system is a means of identifying
positions in position-space by coordinate n-tuples. An abstract coordinate
system is completely defined in terms of the mathematical structure of
position-space. In SRM, the term "coordinate system" is defined to mean
"abstract coordinate system".
Coordinate
A coordinate is an element of the coordinate system domain. In particular, if the domain is
a subset of 3D Euclidean space (R3), each coordinate is called a 3D coordinate. If the
domain is a subset of 2D Euclidean space (R2), each coordinate is called a 2D coordinate.
Surface coordinates are defined as the projection of the 3D coordinate onto the surface
of a RD.
SRM Capability
The SRM API supports the following functionality:
Conversion Types
There are three types of coordinate conversions:
The type of conversions applied to the coordinates is transparent
to the users. The users can invoke the SRM_ChangeCoordinateSRF() method, regardless of whether
the conversion is direct, indirect, or reflexive. The API will perform the
conversion in a most efficient way. If a conversion is
not supported between the two given SRFs, then the call to
SRM_ChangeCoordinateSRF() will return the proper status code.
LSA
CC
CD
CM
EC
EI
HAEC
HEEC
HEEQ
LCC
LCE_3D
LSR_2D
LSR_3
LTSAS
LTSC
LTSE
M
OM
PD
LSP
PS
SEC
SEQ
SME
SMD
TM
LSA
R
.
.
.
.
.
.
.
.
.
D
.
.
.
.
.
.
.
.
.I
.
.
.
.
.
.
CC
.
R
D
D
I
D
D
D
D
I
D
.
.
I
I
D
I
I
I
.
I
.D
.
D
.
D
D
I
CD
.
D
R
.I
D
I
I
I
I
D
I.
.
.
I
I
I
D
D
D
.
D
.I
I
.
.
I
I
D
CM
.
D
I
.R
I
I
I.
.I
I.
I.
I.
.
.
I
I
I.
.I
I.
I.
.
I
I
I.
.I
I.
I.
EC
.
I
D
I
R
I
I
I
I
I
I
.
.
I
I
I
I
I
I
I
.
I
.I
I
.
.
I
I
I
EI
.
D
I
I
I
R
I
.I
I.
.I.
.I.
.
.
I
I
I.
.I
I.
I.
.
I
I
I.
.I
I.
I.
HAEC
.
D
I
I
I
.I
R
.I
I.
I
I
.
.
I
I
I
I
I
I
.
I
.I
I
.
.
I
I
I
HEEC
.
D
I
I
I
.I
.I
R
.
I.
I
I
.
.
I
I
I
I
I
I
.
I
.I
I
.
.
I
I
I
HEEQ
.
D
I
I
I
.I
.I
I.
R
I
I
.
.
I
I
I
I
I
I
.
I
.I
I
.
.
I
I
I
LCC
.
I
D
I
I
.I
I
I
I
R
I.
.
.
I
I
I
I
I
I
.
I
.I
I
.
.
I
I
I
LCE_3D
D
I
I
.I
I
I
I
I
I
R
I
I
I
I
I
I
I
I
I
I
I
I
LSR_2D
.D
.
.
.
.
.
.
.
.
.
R
.
.
.
.
.
.
.
.
D
.
.
.
.
.
.
LSR_3D
.
.
.
.
.
.
.
.
.
.
.
R
.
.
.
.
.
.
.
.
.
.
.
.
.
LTSAS
.
I
I
I
I
I.
I
I
I
I
I
.
.
R
I
D
I
I
I
.
I
.I
I
.
.
I
I
I
LTSC
.
I
I
I
I
.I
I
I
I
I
I
.
.
I
R
D
I
I
I
.
I
.I
I
.
.
I
I
I
LTSE
.
D
I
I
I
.
I
I
I
I
I
I
.
.
D
D
R
I
I
I
.
I
.I
I
.
.
I
I
I
M
.
I
D
I
I
.
I
I
I
I
I
I
.
.
I
I
I
R
I
I
.
I
.I
I
.
.
I
I
I
OM
.
I
D
I
I
.
I
I
I
I
I
I
.
.
I
I
I
I
R
I
.
I
.I
I
.
.
I
I
I
PD
.
I
D
I
I
.
I
I
I
I
I
I
.
.
I
I
I
I
I
R
.
I
.I
I
.
.
I
I
I
LSP
.
I
.
.
.
.
.
.
.
.
.
.
.
D
.
.
.
.
.
.
.
.
.R
.
.
.
.
.
.
PS
.
I
D
I
I
.
I
I
I
I
I
I
.
.
I
I
I
I
I
I
.
R
.I
I
.
.
I
I
I
SEC
.
D
I
I
I
.
I
I.
.
I
I.
I.
I.
.
.
I
I
I
I
I
I
.
I
.
R
.
I
.
I
.
I
I
.
SEQ
.
D.
I
.
I
I
.
I
I
.
I
I.
I.
I.
.
.
I
I
I
I
I
I
.
I
I
.
R
.
I
I
.
I
SME
.
D
I
I
I
.
I
.I
.
I
I.
I.
I.
.
.
I
I
I
I
I
I
.
I
.
I
.
I
.
R
I
I
SMD
.
D
I
.
I
I
.
I
.I
.
I
I.
I.
I.
.
.
I
I
I
I
I
I
.
I
.
I
.
I
I
.
.
R
.I
TM
.
I
D
I
I
.
I
I
I
I
I
I
.
.
I
I
I
I
I
I
.
I
.
I
I
I
.I
R
Typical Usages
A few typical API usages are described in this section
Convert a coordinate from one SRF to another
In order to convert a coordinate from one SRF to another, the user has to:
The users should re-use the allocated SRFs for the coordinate conversions
to minimize the one-time initialization cost.
The source and target coordinates must be both 2D, 3D, or surface.
SRM_Status_Code status;
SRM_Celestiodetic cd_srf;
status = SRM_CD_Create( SRM_ORMCOD_WGS_1984,
SRM_RTCOD_WGS_1984_IDENTITY,
&cd_srf );
SRM_Status_Code status;
SRM_Object_Reference utm12_srf;
status = SRM_CreateSRFSetMember( SRM_SRFSCOD_UNIVERSAL_TRANSVERSE_MERCATOR,
SRM_SRFSMUTMCOD_ZONE_12_NORTHERN_HEMISPHERE,
SRM_ORMCOD_WGS_1984,
SRM_RTCOD_WGS_1984_IDENTITY,
&utm12_srf );
The SRF template type for the Universal Transverse Mercator SRF is intrinsically
Transverse Mercator. In other words, the allocated UTM SRF is an instance
of the Transverse Mercator SRF Template, and therefore, supports all the function
applicable to that SRF Template. Likewise, for example, a GTRS GCS SRF is intrinsically
an instance of the Local Tangent Space Euclidean SRF Template.
SRM_Status_Code status;
SRM_Object_Reference bng_srf;
status = SRM_CreateStandardSRF( SRM_SRFCOD_BRITISH_NATIONAL_GRID_AIRY,
SRM_RTCOD_OSGB_1936_ENGLAND,
&bng_srf );
The SRF template type for the British National Grid SRF is intrinsically
Transverse Mercator. In other words, the allocated BNG SRF is an instance
of the Transverse Mercator SRF Template, and therefore, supports all the functions
applicable to that SRF Template. Likewise, for example, a Maryland SPCS SRF is
intrinsically an instance of the Lambert Conformal Conic SRF Template.
SRM_Status_Code status;
SRM_Coordinate3D cd_3d_coord;
SRM_Long_Float longitude = 0.5645;
SRM_Long_Float latitude = 0.8987;
SRM_Long_Float ellipsoidal_height = 1000.0;
status = cd_srf.methods->CrateCoordinate3D( &cd_srf,
longitude, latitude, ellipsoidal_height,
&cd_3d_coord );
Another example, to allocate a UTM surface coordinate for a UTM SRF:
SRM_Status_Code status;
SRM_Coordinate3D utm12_3d_coord;
SRM_Long_Float easting = 500000.0;
SRM_Long_Float northing = 0.0;
SRM_Long_Float ellipsoidal_height = 1000.0;
status = utm12_srf->methods->CreateCoordinate3D( utm12_srf,
easting, northing, ellipsoidal_height,
&utm_3d_coord );
Notice that the utm12_srf is an object reference to the actual Transverse Mercator SRF.
This assumes that it was instantiated using the CreateSRFSetMember() function.
SRM_Status_Code status;
SRM_Coordinate_Valid_Region valid_region;
status = cd_srf.methods->ChangeCoordinate3DSRF( &cd_srf,
utm12_srf,
&utm12_3d_coord,
&cd_3d_coord,
&valid_region );
Notice that the utm12_srf is an object reference to the actual Transverse Mercator SRF.
This assumes that it was instantiated using the CreateSRFSetMember() function.
Convert a direction from one SRF to another
The steps to convert a direction (source direction) from its original SRF
(source SRF) to another SRF (target SRF) resulting in the final direction
(target direction) is similar to converting a coordinate as follows:
SRM_Status_Code status;
SRM_Direction cd_dir;
status = cd_srf.methods->CreateDirection( cd_srf,
cd_ref_location,
0.0, 0.0, 1.0,
&cd_dir );
The Celectiodetic SRF "cd_srf" is the SRF associated with the
reference location "cd_ref_location".
SRM_Status_Code status;
status = tm_srf.methods->ChangeDirectionSRF( &tm_srf,
&cd_srf,
&cd_dir,
&tm_dir,
&valid_region );
In converting a Direction, both its reference location and the
vector are converted to the target SRF. The valid region is associated with the
resulting reference location.
Convert an orientation from one SRF to another
The steps to convert a orientation (source orientation) from its original SRF
(source SRF) to another SRF (target SRF) resulting in the final orientation
(target direction) is similar to converting a direction as follows:
SRM_Status_Code status;
SRM_Orientation cd_ori;
SRM_Matrix_3x3 ident_mat = { {1.0, 0.0, 0.0},
{0.0, 1.0, 0.0},
{0.0, 0.0, 1.0} };
status = cd_srf.methods->CreateOrientation( &cd_srf,
&cd_ref_location,
ident_mat,
&cd_ori );
The Celestiodetic SRF "cd_srf" is the SRF associated with the
reference location "cd_ref_location".
SRM_Status_Code status;
status = tm_srf.methods->ChangeOrientationSRF( &tm_srf,
&cd_srf,
&cd_ori,
&tm_ori,
&valid_region);
In converting an Orientation, both its reference location and the orientation
matrix are converted to the target SRF. The valid region is associated with
the resulting reference location.
Sample Application
The following sample code converts a a 3D coordinate from a Celestiodetic
SRF to a Celestiocentric SRF using the SRM C API:
#include
Executing the sample code would result the following output:
Running SRM Sample test program...
[ 4517590.878846, 0.000000, 4487348.408859 ]