Public Member Functions | Static Public Attributes

GeographicLib::TransverseMercatorExact Class Reference

An exact implementation of the Transverse Mercator Projection. More...

#include <GeographicLib/TransverseMercatorExact.hpp>

List of all members.

Public Member Functions

 TransverseMercatorExact (real a, real r, real k0, bool extendp=false)
void Forward (real lon0, real lat, real lon, real &x, real &y, real &gamma, real &k) const throw ()
void Reverse (real lon0, real x, real y, real &lat, real &lon, real &gamma, real &k) const throw ()
void Forward (real lon0, real lat, real lon, real &x, real &y) const throw ()
void Reverse (real lon0, real x, real y, real &lat, real &lon) const throw ()
Inspector functions

Math::real MajorRadius () const throw ()
Math::real InverseFlattening () const throw ()
Math::real CentralScale () const throw ()

Static Public Attributes

static const
TransverseMercatorExact 
UTM

Detailed Description

An exact implementation of the Transverse Mercator Projection.

Implementation of the Transverse Mercator Projection given in

Lee's gives the correct results for forward and reverse transformations subject to the branch cut rules (see the description of the extendp argument to the constructor). The maximum error is about 8 nm (ground distance) for the forward and reverse transformations. The error in the convergence is 2e-15", the relative error in the scale is 7e-12%%. See Sec. 3 of arXiv:1002.1417 for details. The method is "exact" in the sense that the errors are close to the round-off limit and that no changes are needed in the algorithms for them to be used with reals of a higher precision. Thus the errors using long double (with a 64-bit fraction) are about 2000 times smaller than using double (with a 53-bit fraction).

This algorithm is about 4.5 times slower than the 6th-order Krüger method, TransverseMercator, taking about 11 us for a combined forward and reverse projection on a 2.66 GHz Intel machine (g++, version 4.3.0, -O3).

The ellipsoid parameters and the central scale are set in the constructor. The central meridian (which is a trivial shift of the longitude) is specified as the lon0 argument of the TransverseMercatorExact::Forward and TransverseMercatorExact::Reverse functions. The latitude of origin is taken to be the equator. See the documentation on TransverseMercator for how to include a false easting, false northing, or a latitude of origin.

See TransverseMercatorExact.cpp for more information on the implementation.

See Transverse Mercator Projection for a discussion of this projection.

Definition at line 67 of file TransverseMercatorExact.hpp.


Constructor & Destructor Documentation

GeographicLib::TransverseMercatorExact::TransverseMercatorExact ( real  a,
real  r,
real  k0,
bool  extendp = false 
)

Constructor for a ellipsoid with

Parameters:
[in] a equatorial radius (meters)
[in] r reciprocal flattening.
[in] k0 central scale factor.
[in] extendp use extended domain.

The transverse Mercator projection has a branch point singularity at lat = 0 and lon - lon0 = 90 (1 - e) or (for TransverseMercatorExact::UTM) x = 18381 km, y = 0m. The extendp argument governs where the branch cut is placed. With extendp = false, the "standard" convention is followed, namely the cut is placed along x > 18381 km, y = 0m. Forward can be called with any lat and lon then produces the transformation shown in Lee, Fig 46. Reverse analytically continues this in the +/- x direction. As a consequence, Reverse may map multiple points to the same geographic location; for example, for TransverseMercatorExact::UTM, x = 22051449.037349 m, y = -7131237.022729 m and x = 29735142.378357 m, y = 4235043.607933 m both map to lat = -2 deg, lon = 88 deg.

With extendp = true, the branch cut is moved to the lower left quadrant. The various symmetries of the transverse Mercator projection can be used to explore the projection on any sheet. In this mode the domains of lat, lon, x, and y are restricted to

  • the union of
    • lat in [0, 90] and lon - lon0 in [0, 90]
    • lat in (-90, 0] and lon - lon0 in [90 (1 - e), 90]
  • the union of
    • x/(k0 a) in [0, inf) and y/(k0 a) in [0, E(e^2)]
    • x/(k0 a) in [K(1 - e^2) - E(1 - e^2), inf) and y/(k0 a) in (-inf, 0]

See Sec. 5 of arXiv:1002.1417 for a full discussion of the treatment of the branch cut.

The method will work for all ellipsoids used in terrestial geodesy. The method cannot be applied directly to the case of a sphere (r = inf) because some the constants characterizing this method diverge in that limit, and in practise, r should be smaller than about 1/numeric_limits< real >::epsilon(). However, TransverseMercator treats the sphere exactly. An exception is thrown if either axis of the ellipsoid or k0 is not positive or if r < 1.

Definition at line 61 of file TransverseMercatorExact.cpp.


Member Function Documentation

void GeographicLib::TransverseMercatorExact::Forward ( real  lon0,
real  lat,
real  lon,
real &  x,
real &  y,
real &  gamma,
real &  k 
) const throw ()

Forward projection, from geographic to transverse Mercator.

Parameters:
[in] lon0 central meridian of the projection (degrees).
[in] lat latitude of point (degrees).
[in] lon longitude of point (degrees).
[out] x easting of point (meters).
[out] y northing of point (meters).
[out] gamma meridian convergence at point (degrees).
[out] k scale of projection at point.

No false easting or northing is added. lat should be in the range [-90, 90]; lon and lon0 should be in the range [-180, 360].

Definition at line 372 of file TransverseMercatorExact.cpp.

Referenced by Forward().

void GeographicLib::TransverseMercatorExact::Reverse ( real  lon0,
real  x,
real  y,
real &  lat,
real &  lon,
real &  gamma,
real &  k 
) const throw ()

Reverse projection, from transverse Mercator to geographic.

Parameters:
[in] lon0 central meridian of the projection (degrees).
[in] x easting of point (meters).
[in] y northing of point (meters).
[out] lat latitude of point (degrees).
[out] lon longitude of point (degrees).
[out] gamma meridian convergence at point (degrees).
[out] k scale of projection at point.

No false easting or northing is added. lon0 should be in the range [-180, 360]. The value of lon returned is in the range [-180, 180).

Definition at line 433 of file TransverseMercatorExact.cpp.

Referenced by Reverse().

void GeographicLib::TransverseMercatorExact::Forward ( real  lon0,
real  lat,
real  lon,
real &  x,
real &  y 
) const throw () [inline]

TransverseMercatorExact::Forward without returning the convergence and scale.

Definition at line 201 of file TransverseMercatorExact.hpp.

References Forward().

void GeographicLib::TransverseMercatorExact::Reverse ( real  lon0,
real  x,
real  y,
real &  lat,
real &  lon 
) const throw () [inline]

TransverseMercatorExact::Reverse without returning the convergence and scale.

Definition at line 211 of file TransverseMercatorExact.hpp.

References Reverse().

Math::real GeographicLib::TransverseMercatorExact::MajorRadius (  )  const throw () [inline]
Returns:
a the equatorial radius of the ellipsoid (meters). This is the value used in the constructor.

Definition at line 224 of file TransverseMercatorExact.hpp.

Math::real GeographicLib::TransverseMercatorExact::InverseFlattening (  )  const throw () [inline]
Returns:
r the inverse flattening of the ellipsoid. This is the value used in the constructor. A value of 0 is returned for a sphere (infinite inverse flattening).

Definition at line 231 of file TransverseMercatorExact.hpp.

Math::real GeographicLib::TransverseMercatorExact::CentralScale (  )  const throw () [inline]
Returns:
k0 central scale for the projection. This is the value of k0 used in the constructor and is the scale on the central meridian.

Definition at line 237 of file TransverseMercatorExact.hpp.


Member Data Documentation

A global instantiation of TransverseMercatorExact with the WGS84 ellipsoid and the UTM scale factor. However, unlike UTM, no false easting or northing is added.

Definition at line 245 of file TransverseMercatorExact.hpp.

Referenced by main().


The documentation for this class was generated from the following files: