GeographicLib
1.21
|
Gnomonic Projection. More...
#include <GeographicLib/Gnomonic.hpp>
Public Member Functions | |
Gnomonic (const Geodesic &earth=Geodesic::WGS84) throw () | |
void | Forward (real lat0, real lon0, real lat, real lon, real &x, real &y, real &azi, real &rk) const throw () |
void | Reverse (real lat0, real lon0, real x, real y, real &lat, real &lon, real &azi, real &rk) const throw () |
void | Forward (real lat0, real lon0, real lat, real lon, real &x, real &y) const throw () |
void | Reverse (real lat0, real lon0, real x, real y, real &lat, real &lon) const throw () |
Inspector functions | |
Math::real | MajorRadius () const throw () |
Math::real | Flattening () const throw () |
Gnomonic Projection.
Gnomonic projection centered at an arbitrary position C on the ellipsoid. This projection is derived in Section 13 of
See also Section 8 of
The projection of P is defined as follows: compute the geodesic line from C to P; compute the reduced length m12, geodesic scale M12, and rho = m12/M12; finally x = rho sin azi1; y = rho cos azi1, where azi1 is the azimuth of the geodesic at C. The Gnomonic::Forward and Gnomonic::Reverse methods also return the azimuth azi of the geodesic at P and reciprocal scale rk in the azimuthal direction. The scale in the radial direction if 1/rk2.
For a sphere, rho is reduces to a tan(s12/a), where s12 is the length of the geodesic from C to P, and the gnomonic projection has the property that all geodesics appear as straight lines. For an ellipsoid, this property holds only for geodesics interesting the centers. However geodesic segments close to the center are approximately straight.
Consider a geodesic segment of length l. Let T be the point on the geodesic (extended if necessary) closest to C the center of the projection and t be the distance CT. To lowest order, the maximum deviation (as a true distance) of the corresponding gnomonic line segment (i.e., with the same end points) from the geodesic is
(K(T) - K(C)) l2 t / 32.
where K is the Gaussian curvature.
This result applies for any surface. For an ellipsoid of revolution, consider all geodesics whose end points are within a distance r of C. For a given r, the deviation is maximum when the latitude of C is 45o, when endpoints are a distance r away, and when their azimuths from the center are +/- 45o or +/- 135o. To lowest order in r and the flattening f, the deviation is f (r/2a)3 r.
The conversions all take place using a Geodesic object (by default Geodesic::WGS84). For more information on geodesics see Geodesics on the ellipsoid.
CAUTION: The definition of this projection for a sphere is standard. However, there is no standard for how it should be extended to an ellipsoid. The choices are:
Example of use:
// Example of using the GeographicLib::Gnomonic class // $Id: 59ed16349fd55bdde98654feeb1225a046d85696 $ #include <iostream> #include <exception> #include <GeographicLib/Geodesic.hpp> #include <GeographicLib/Gnomonic.hpp> using namespace std; using namespace GeographicLib; int main() { try { Geodesic geod(Constants::WGS84_a(), Constants::WGS84_f()); // Alternatively: const Geodesic& geod = Geodesic::WGS84; const double lat0 = 48 + 50/60.0, lon0 = 2 + 20/60.0; // Paris Gnomonic proj(geod); { // Sample forward calculation double lat = 50.9, lon = 1.8; // Calais double x, y; proj.Forward(lat0, lon0, lat, lon, x, y); cout << x << " " << y << "\n"; } { // Sample reverse calculation double x = -38e3, y = 230e3; double lat, lon; proj.Reverse(lat0, lon0, x, y, lat, lon); cout << lat << " " << lon << "\n"; } } catch (const exception& e) { cerr << "Caught exception: " << e.what() << "\n"; return 1; } return 0; }
GeodesicProj is a command-line utility providing access to the functionality of AzimuthalEquidistant, Gnomonic, and CassiniSoldner.
GeographicLib::Gnomonic::Gnomonic | ( | const Geodesic & | earth = Geodesic::WGS84 | ) | throw () [inline, explicit] |
Constructor for Gnomonic.
[in] | earth | the Geodesic object to use for geodesic calculations. By default this uses the WGS84 ellipsoid. |
Definition at line 123 of file Gnomonic.hpp.
void GeographicLib::Gnomonic::Forward | ( | real | lat0, |
real | lon0, | ||
real | lat, | ||
real | lon, | ||
real & | x, | ||
real & | y, | ||
real & | azi, | ||
real & | rk | ||
) | const throw () |
Forward projection, from geographic to gnomonic.
[in] | lat0 | latitude of center point of projection (degrees). |
[in] | lon0 | longitude of center point of 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] | azi | azimuth of geodesic at point (degrees). |
[out] | rk | reciprocal of azimuthal scale at point. |
lat0 and lat should be in the range [-90, 90] and lon0 and lon should be in the range [-180, 360]. The scale of the projection is 1/rk2 in the "radial" direction, azi clockwise from true north, and is 1/rk in the direction perpendicular to this. If the point lies "over the horizon", i.e., if rk <= 0, then NaNs are returned for x and y (the correct values are returned for azi and rk). A call to Forward followed by a call to Reverse will return the original (lat, lon) (to within roundoff) provided the point in not over the horizon.
Definition at line 25 of file Gnomonic.cpp.
Referenced by main().
void GeographicLib::Gnomonic::Reverse | ( | real | lat0, |
real | lon0, | ||
real | x, | ||
real | y, | ||
real & | lat, | ||
real & | lon, | ||
real & | azi, | ||
real & | rk | ||
) | const throw () |
Reverse projection, from gnomonic to geographic.
[in] | lat0 | latitude of center point of projection (degrees). |
[in] | lon0 | longitude of center point of 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] | azi | azimuth of geodesic at point (degrees). |
[out] | rk | reciprocal of azimuthal scale at point. |
lat0 should be in the range [-90, 90] and lon0 should be in the range [-180, 360]. lat will be in the range [-90, 90] and lon will be in the range [-180, 180). The scale of the projection is 1/rk2 in the "radial" direction, azi clockwise from true north, and is 1/rk in the direction perpendicular to this. Even though all inputs should return a valid lat and lon, it's possible that the procedure fails to converge for very large x or y; in this case NaNs are returned for all the output arguments. A call to Reverse followed by a call to Forward will return the original (x, y) (to roundoff).
Definition at line 44 of file Gnomonic.cpp.
References GeographicLib::GeodesicLine::Position().
Referenced by main().
void GeographicLib::Gnomonic::Forward | ( | real | lat0, |
real | lon0, | ||
real | lat, | ||
real | lon, | ||
real & | x, | ||
real & | y | ||
) | const throw () [inline] |
Gnomonic::Forward without returning the azimuth and scale.
Definition at line 184 of file Gnomonic.hpp.
void GeographicLib::Gnomonic::Reverse | ( | real | lat0, |
real | lon0, | ||
real | x, | ||
real | y, | ||
real & | lat, | ||
real & | lon | ||
) | const throw () [inline] |
Gnomonic::Reverse without returning the azimuth and scale.
Definition at line 193 of file Gnomonic.hpp.
Math::real GeographicLib::Gnomonic::MajorRadius | ( | ) | const throw () [inline] |
Definition at line 206 of file Gnomonic.hpp.
Math::real GeographicLib::Gnomonic::Flattening | ( | ) | const throw () [inline] |
Definition at line 212 of file Gnomonic.hpp.