123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- /**
- * \file PolarStereographic.hpp
- * \brief Header for GeographicLib::PolarStereographic class
- *
- * Copyright (c) Charles Karney (2008-2020) <charles@karney.com> and licensed
- * under the MIT/X11 License. For more information, see
- * https://geographiclib.sourceforge.io/
- **********************************************************************/
- #if !defined(GEOGRAPHICLIB_POLARSTEREOGRAPHIC_HPP)
- #define GEOGRAPHICLIB_POLARSTEREOGRAPHIC_HPP 1
- #include <GeographicLib/Constants.hpp>
- namespace GeographicLib {
- /**
- * \brief Polar stereographic projection
- *
- * Implementation taken from the report,
- * - J. P. Snyder,
- * <a href="http://pubs.er.usgs.gov/usgspubs/pp/pp1395"> Map Projections: A
- * Working Manual</a>, USGS Professional Paper 1395 (1987),
- * pp. 160--163.
- *
- * This is a straightforward implementation of the equations in Snyder except
- * that Newton's method is used to invert the projection.
- *
- * This class also returns the meridian convergence \e gamma and scale \e k.
- * The meridian convergence is the bearing of grid north (the \e y axis)
- * measured clockwise from true north.
- *
- * Example of use:
- * \include example-PolarStereographic.cpp
- **********************************************************************/
- class GEOGRAPHICLIB_EXPORT PolarStereographic {
- private:
- typedef Math::real real;
- real _a, _f, _e2, _es, _e2m, _c;
- real _k0;
- public:
- /**
- * Constructor for a ellipsoid with
- *
- * @param[in] a equatorial radius (meters).
- * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere.
- * Negative \e f gives a prolate ellipsoid.
- * @param[in] k0 central scale factor.
- * @exception GeographicErr if \e a, (1 − \e f) \e a, or \e k0 is
- * not positive.
- **********************************************************************/
- PolarStereographic(real a, real f, real k0);
- /**
- * Set the scale for the projection.
- *
- * @param[in] lat (degrees) assuming \e northp = true.
- * @param[in] k scale at latitude \e lat (default 1).
- * @exception GeographicErr \e k is not positive.
- * @exception GeographicErr if \e lat is not in (−90°,
- * 90°].
- **********************************************************************/
- void SetScale(real lat, real k = real(1));
- /**
- * Forward projection, from geographic to polar stereographic.
- *
- * @param[in] northp the pole which is the center of projection (true means
- * north, false means south).
- * @param[in] lat latitude of point (degrees).
- * @param[in] lon longitude of point (degrees).
- * @param[out] x easting of point (meters).
- * @param[out] y northing of point (meters).
- * @param[out] gamma meridian convergence at point (degrees).
- * @param[out] k scale of projection at point.
- *
- * No false easting or northing is added. \e lat should be in the range
- * (−90°, 90°] for \e northp = true and in the range
- * [−90°, 90°) for \e northp = false.
- **********************************************************************/
- void Forward(bool northp, real lat, real lon,
- real& x, real& y, real& gamma, real& k) const;
- /**
- * Reverse projection, from polar stereographic to geographic.
- *
- * @param[in] northp the pole which is the center of projection (true means
- * north, false means south).
- * @param[in] x easting of point (meters).
- * @param[in] y northing of point (meters).
- * @param[out] lat latitude of point (degrees).
- * @param[out] lon longitude of point (degrees).
- * @param[out] gamma meridian convergence at point (degrees).
- * @param[out] k scale of projection at point.
- *
- * No false easting or northing is added. The value of \e lon returned is
- * in the range [−180°, 180°].
- **********************************************************************/
- void Reverse(bool northp, real x, real y,
- real& lat, real& lon, real& gamma, real& k) const;
- /**
- * PolarStereographic::Forward without returning the convergence and scale.
- **********************************************************************/
- void Forward(bool northp, real lat, real lon,
- real& x, real& y) const {
- real gamma, k;
- Forward(northp, lat, lon, x, y, gamma, k);
- }
- /**
- * PolarStereographic::Reverse without returning the convergence and scale.
- **********************************************************************/
- void Reverse(bool northp, real x, real y,
- real& lat, real& lon) const {
- real gamma, k;
- Reverse(northp, x, y, lat, lon, gamma, k);
- }
- /** \name Inspector functions
- **********************************************************************/
- ///@{
- /**
- * @return \e a the equatorial radius of the ellipsoid (meters). This is
- * the value used in the constructor.
- **********************************************************************/
- Math::real EquatorialRadius() const { return _a; }
- /**
- * @return \e f the flattening of the ellipsoid. This is the value used in
- * the constructor.
- **********************************************************************/
- Math::real Flattening() const { return _f; }
- /**
- * The central scale for the projection. This is the value of \e k0 used
- * in the constructor and is the scale at the pole unless overridden by
- * PolarStereographic::SetScale.
- **********************************************************************/
- Math::real CentralScale() const { return _k0; }
- /**
- * \deprecated An old name for EquatorialRadius().
- **********************************************************************/
- GEOGRAPHICLIB_DEPRECATED("Use EquatorialRadius()")
- Math::real MajorRadius() const { return EquatorialRadius(); }
- ///@}
- /**
- * A global instantiation of PolarStereographic with the WGS84 ellipsoid
- * and the UPS scale factor. However, unlike UPS, no false easting or
- * northing is added.
- **********************************************************************/
- static const PolarStereographic& UPS();
- };
- } // namespace GeographicLib
- #endif // GEOGRAPHICLIB_POLARSTEREOGRAPHIC_HPP
|