/** * \file PolarStereographic.hpp * \brief Header for GeographicLib::PolarStereographic class * * Copyright (c) Charles Karney (2008-2020) 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 namespace GeographicLib { /** * \brief Polar stereographic projection * * Implementation taken from the report, * - J. P. Snyder, * Map Projections: A * Working Manual, 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