Back to home page

EIC code displayed by LXR

 
 

    


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

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_HATANO_HPP
0041 #define BOOST_GEOMETRY_PROJECTIONS_HATANO_HPP
0042 
0043 #include <boost/geometry/util/math.hpp>
0044 
0045 #include <boost/geometry/srs/projections/impl/base_static.hpp>
0046 #include <boost/geometry/srs/projections/impl/base_dynamic.hpp>
0047 #include <boost/geometry/srs/projections/impl/projects.hpp>
0048 #include <boost/geometry/srs/projections/impl/factory_entry.hpp>
0049 
0050 namespace boost { namespace geometry
0051 {
0052 
0053 namespace projections
0054 {
0055     #ifndef DOXYGEN_NO_DETAIL
0056     namespace detail { namespace hatano
0057     {
0058 
0059             static const int n_iter = 20;
0060             static const double epsilon = 1e-7;
0061             static const double one_plus_tol = 1.000001;
0062             static const double CN_ = 2.67595;
0063             static const double CS_ = 2.43763;
0064             static const double RCN = 0.37369906014686373063;
0065             static const double RCS = 0.41023453108141924738;
0066             static const double FYCN = 1.75859;
0067             static const double FYCS = 1.93052;
0068             static const double RYCN = 0.56863737426006061674;
0069             static const double RYCS = 0.51799515156538134803;
0070             static const double FXC = 0.85;
0071             static const double RXC = 1.17647058823529411764;
0072 
0073             template <typename T, typename Parameters>
0074             struct base_hatano_spheroid
0075             {
0076                 // FORWARD(s_forward)  spheroid
0077                 // Project coordinates from geographic (lon, lat) to cartesian (x, y)
0078                 inline void fwd(Parameters const& , T const& lp_lon, T lp_lat, T& xy_x, T& xy_y) const
0079                 {
0080                     T th1, c;
0081                     int i;
0082 
0083                     c = sin(lp_lat) * (lp_lat < 0. ? CS_ : CN_);
0084                     for (i = n_iter; i; --i) {
0085                         lp_lat -= th1 = (lp_lat + sin(lp_lat) - c) / (1. + cos(lp_lat));
0086                         if (fabs(th1) < epsilon) break;
0087                     }
0088                     xy_x = FXC * lp_lon * cos(lp_lat *= .5);
0089                     xy_y = sin(lp_lat) * (lp_lat < 0. ? FYCS : FYCN);
0090                 }
0091 
0092                 // INVERSE(s_inverse)  spheroid
0093                 // Project coordinates from cartesian (x, y) to geographic (lon, lat)
0094                 inline void inv(Parameters const& , T const& xy_x, T const& xy_y, T& lp_lon, T& lp_lat) const
0095                 {
0096                     static T const half_pi = detail::half_pi<T>();
0097 
0098                     T th;
0099 
0100                     th = xy_y * ( xy_y < 0. ? RYCS : RYCN);
0101                     if (fabs(th) > 1.) {
0102                         if (fabs(th) > one_plus_tol) {
0103                             BOOST_THROW_EXCEPTION( projection_exception(error_tolerance_condition) );
0104                         } else {
0105                             th = th > 0. ? half_pi : - half_pi;
0106                         }
0107                     } else {
0108                         th = asin(th);
0109                     }
0110 
0111                     lp_lon = RXC * xy_x / cos(th);
0112                     th += th;
0113                     lp_lat = (th + sin(th)) * (xy_y < 0. ? RCS : RCN);
0114                     if (fabs(lp_lat) > 1.) {
0115                         if (fabs(lp_lat) > one_plus_tol) {
0116                             BOOST_THROW_EXCEPTION( projection_exception(error_tolerance_condition) );
0117                         } else {
0118                             lp_lat = lp_lat > 0. ? half_pi : - half_pi;
0119                         }
0120                     } else {
0121                         lp_lat = asin(lp_lat);
0122                     }
0123                 }
0124 
0125                 static inline std::string get_name()
0126                 {
0127                     return "hatano_spheroid";
0128                 }
0129 
0130             };
0131 
0132             // Hatano Asymmetrical Equal Area
0133             template <typename Parameters>
0134             inline void setup_hatano(Parameters& par)
0135             {
0136                 par.es = 0.;
0137             }
0138 
0139     }} // namespace detail::hatano
0140     #endif // doxygen
0141 
0142     /*!
0143         \brief Hatano Asymmetrical Equal Area projection
0144         \ingroup projections
0145         \tparam Geographic latlong point type
0146         \tparam Cartesian xy point type
0147         \tparam Parameters parameter type
0148         \par Projection characteristics
0149          - Pseudocylindrical
0150          - Spheroid
0151         \par Example
0152         \image html ex_hatano.gif
0153     */
0154     template <typename T, typename Parameters>
0155     struct hatano_spheroid : public detail::hatano::base_hatano_spheroid<T, Parameters>
0156     {
0157         template <typename Params>
0158         inline hatano_spheroid(Params const& , Parameters & par)
0159         {
0160             detail::hatano::setup_hatano(par);
0161         }
0162     };
0163 
0164     #ifndef DOXYGEN_NO_DETAIL
0165     namespace detail
0166     {
0167 
0168         // Static projection
0169         BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_FI(srs::spar::proj_hatano, hatano_spheroid)
0170 
0171         // Factory entry(s)
0172         BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_FI(hatano_entry, hatano_spheroid)
0173 
0174         BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_BEGIN(hatano_init)
0175         {
0176             BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_ENTRY(hatano, hatano_entry)
0177         }
0178 
0179     } // namespace detail
0180     #endif // doxygen
0181 
0182 } // namespace projections
0183 
0184 }} // namespace boost::geometry
0185 
0186 #endif // BOOST_GEOMETRY_PROJECTIONS_HATANO_HPP
0187