Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:35:41

0001 // Boost.Geometry - gis-projections (based on PROJ4)
0002 
0003 // Copyright (c) 2008-2015 Barend Gehrels, Amsterdam, the Netherlands.
0004 
0005 // This file was modified by Oracle on 2017, 2018, 2019.
0006 // Modifications copyright (c) 2017-2019, Oracle and/or its affiliates.
0007 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle.
0008 
0009 // Use, modification and distribution is subject to the Boost Software License,
0010 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
0011 // http://www.boost.org/LICENSE_1_0.txt)
0012 
0013 // This file is converted from PROJ4, http://trac.osgeo.org/proj
0014 // PROJ4 is originally written by Gerald Evenden (then of the USGS)
0015 // PROJ4 is maintained by Frank Warmerdam
0016 // PROJ4 is converted to Boost.Geometry by Barend Gehrels
0017 
0018 // Last updated version of proj: 5.0.0
0019 
0020 // Original copyright notice:
0021 
0022 // Permission is hereby granted, free of charge, to any person obtaining a
0023 // copy of this software and associated documentation files (the "Software"),
0024 // to deal in the Software without restriction, including without limitation
0025 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
0026 // and/or sell copies of the Software, and to permit persons to whom the
0027 // Software is furnished to do so, subject to the following conditions:
0028 
0029 // The above copyright notice and this permission notice shall be included
0030 // in all copies or substantial portions of the Software.
0031 
0032 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
0033 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0034 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
0035 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0036 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
0037 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
0038 // DEALINGS IN THE SOFTWARE.
0039 
0040 #ifndef BOOST_GEOMETRY_PROJECTIONS_EQC_HPP
0041 #define BOOST_GEOMETRY_PROJECTIONS_EQC_HPP
0042 
0043 #include <boost/geometry/srs/projections/impl/base_static.hpp>
0044 #include <boost/geometry/srs/projections/impl/base_dynamic.hpp>
0045 #include <boost/geometry/srs/projections/impl/factory_entry.hpp>
0046 #include <boost/geometry/srs/projections/impl/pj_param.hpp>
0047 #include <boost/geometry/srs/projections/impl/projects.hpp>
0048 
0049 namespace boost { namespace geometry
0050 {
0051 
0052 namespace projections
0053 {
0054     #ifndef DOXYGEN_NO_DETAIL
0055     namespace detail { namespace eqc
0056     {
0057             template <typename T>
0058             struct par_eqc
0059             {
0060                 T rc;
0061             };
0062 
0063             template <typename T, typename Parameters>
0064             struct base_eqc_spheroid
0065             {
0066                 par_eqc<T> m_proj_parm;
0067 
0068                 // FORWARD(s_forward)  spheroid
0069                 // Project coordinates from geographic (lon, lat) to cartesian (x, y)
0070                 inline void fwd(Parameters const& par, T const& lp_lon, T const& lp_lat, T& xy_x, T& xy_y) const
0071                 {
0072                     xy_x = this->m_proj_parm.rc * lp_lon;
0073                     xy_y = lp_lat - par.phi0;
0074                 }
0075 
0076                 // INVERSE(s_inverse)  spheroid
0077                 // Project coordinates from cartesian (x, y) to geographic (lon, lat)
0078                 inline void inv(Parameters const& par, T const& xy_x, T const& xy_y, T& lp_lon, T& lp_lat) const
0079                 {
0080                     lp_lon = xy_x / this->m_proj_parm.rc;
0081                     lp_lat = xy_y + par.phi0;
0082                 }
0083 
0084                 static inline std::string get_name()
0085                 {
0086                     return "eqc_spheroid";
0087                 }
0088 
0089             };
0090 
0091             // Equidistant Cylindrical (Plate Caree)
0092             template <typename Params, typename Parameters, typename T>
0093             inline void setup_eqc(Params const& params, Parameters& par, par_eqc<T>& proj_parm)
0094             {
0095                 proj_parm.rc = cos(pj_get_param_r<T, srs::spar::lat_ts>(params, "lat_ts", srs::dpar::lat_ts));
0096                 if (proj_parm.rc <= 0.)
0097                     BOOST_THROW_EXCEPTION( projection_exception(error_lat_ts_larger_than_90) );
0098                 par.es = 0.;
0099             }
0100 
0101     }} // namespace detail::eqc
0102     #endif // doxygen
0103 
0104     /*!
0105         \brief Equidistant Cylindrical (Plate Caree) projection
0106         \ingroup projections
0107         \tparam Geographic latlong point type
0108         \tparam Cartesian xy point type
0109         \tparam Parameters parameter type
0110         \par Projection characteristics
0111          - Cylindrical
0112          - Spheroid
0113         \par Projection parameters
0114          - lat_ts: Latitude of true scale (degrees)
0115          - lat_0: Latitude of origin
0116         \par Example
0117         \image html ex_eqc.gif
0118     */
0119     template <typename T, typename Parameters>
0120     struct eqc_spheroid : public detail::eqc::base_eqc_spheroid<T, Parameters>
0121     {
0122         template <typename Params>
0123         inline eqc_spheroid(Params const& params, Parameters & par)
0124         {
0125             detail::eqc::setup_eqc(params, par, this->m_proj_parm);
0126         }
0127     };
0128 
0129     #ifndef DOXYGEN_NO_DETAIL
0130     namespace detail
0131     {
0132 
0133         // Static projection
0134         BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_FI(srs::spar::proj_eqc, eqc_spheroid)
0135 
0136         // Factory entry(s)
0137         BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_FI(eqc_entry, eqc_spheroid)
0138 
0139         BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_BEGIN(eqc_init)
0140         {
0141             BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_ENTRY(eqc, eqc_entry);
0142         }
0143 
0144     } // namespace detail
0145     #endif // doxygen
0146 
0147 } // namespace projections
0148 
0149 }} // namespace boost::geometry
0150 
0151 #endif // BOOST_GEOMETRY_PROJECTIONS_EQC_HPP
0152