An exact implementation of the Transverse Mercator Projection. More...
#include <GeographicLib/TransverseMercatorExact.hpp>
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 () |
Math::real | MajorRadius () const throw () |
Math::real | InverseFlattening () const throw () |
Math::real | CentralScale () const throw () |
Static Public Attributes | |
static const TransverseMercatorExact | UTM |
An exact implementation of the Transverse Mercator Projection.
Implementation of the Transverse Mercator Projection given in
This method 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 Accuracy of transverse Mercator projection for the weasel words.) 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, GeographicLib::TransverseMercator, taking about 11 us for a combined forward and reverse projection on a 2.6 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 GeographicLib::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 62 of file TransverseMercatorExact.hpp.
GeographicLib::TransverseMercatorExact::TransverseMercatorExact | ( | real | a, | |
real | r, | |||
real | k0, | |||
bool | extendp = false | |||
) |
Constructor for a ellipsoid radius a (meters), reciprocal flattening r, and central scale factor k0. 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
See Properties far from the central meridian 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/stdnumeric_limits<real>::epsilon(). However, GeographicLib::TransverseMercator treats the sphere exactly. An exception is thrown if a, r, or k0 is not positive.
Definition at line 59 of file TransverseMercatorExact.cpp.
void GeographicLib::TransverseMercatorExact::Forward | ( | real | lon0, | |
real | lat, | |||
real | lon, | |||
real & | x, | |||
real & | y, | |||
real & | gamma, | |||
real & | k | |||
) | const throw () |
Convert from latitude lat (degrees) and longitude lon (degrees) to transverse Mercator easting x (meters) and northing y (meters). The central meridian of the transformation is lon0 (degrees). Also return the meridian convergence gamma (degrees) and the scale k. 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 366 of file TransverseMercatorExact.cpp.
References GeographicLib::Constants::degree().
void GeographicLib::TransverseMercatorExact::Reverse | ( | real | lon0, | |
real | x, | |||
real | y, | |||
real & | lat, | |||
real & | lon, | |||
real & | gamma, | |||
real & | k | |||
) | const throw () |
Convert from transverse Mercator easting x (meters) and northing y (meters) to latitude lat (degrees) and longitude lon (degrees) . The central meridian of the transformation is lon0 (degrees). Also return the meridian convergence gamma (degrees) and the scale k. 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 427 of file TransverseMercatorExact.cpp.
References GeographicLib::Constants::degree(), and GeographicLib::Constants::pi().
Math::real GeographicLib::TransverseMercatorExact::MajorRadius | ( | ) | const throw () [inline] |
The major radius of the ellipsoid (meters). This is that value of a used in the constructor.
Definition at line 177 of file TransverseMercatorExact.hpp.
Math::real GeographicLib::TransverseMercatorExact::InverseFlattening | ( | ) | const throw () [inline] |
The inverse flattening of the ellipsoid. This is that value of r used in the constructor.
Definition at line 183 of file TransverseMercatorExact.hpp.
Math::real GeographicLib::TransverseMercatorExact::CentralScale | ( | ) | const throw () [inline] |
The central scale for the projection. This is that value of k0 used in the constructor and is the scale on the central meridian.
Definition at line 189 of file TransverseMercatorExact.hpp.
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 196 of file TransverseMercatorExact.hpp.