File indexing completed on 2025-01-18 09:35:46
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 #ifndef BOOST_GEOMETRY_PROJECTIONS_RPOLY_HPP
0041 #define BOOST_GEOMETRY_PROJECTIONS_RPOLY_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 rpoly
0056 {
0057
0058 static const double epsilon = 1e-9;
0059
0060 template <typename T>
0061 struct par_rpoly
0062 {
0063 T phi1;
0064 T fxa;
0065 T fxb;
0066 bool mode;
0067 };
0068
0069 template <typename T, typename Parameters>
0070 struct base_rpoly_spheroid
0071 {
0072 par_rpoly<T> m_proj_parm;
0073
0074
0075
0076 inline void fwd(Parameters const& par, T const& lp_lon, T const& lp_lat, T& xy_x, T& xy_y) const
0077 {
0078 T fa;
0079
0080 if (this->m_proj_parm.mode)
0081 fa = tan(lp_lon * this->m_proj_parm.fxb) * this->m_proj_parm.fxa;
0082 else
0083 fa = 0.5 * lp_lon;
0084 if (fabs(lp_lat) < epsilon) {
0085 xy_x = fa + fa;
0086 xy_y = - par.phi0;
0087 } else {
0088 xy_y = 1. / tan(lp_lat);
0089 xy_x = sin(fa = 2. * atan(fa * sin(lp_lat))) * xy_y;
0090 xy_y = lp_lat - par.phi0 + (1. - cos(fa)) * xy_y;
0091 }
0092 }
0093
0094 static inline std::string get_name()
0095 {
0096 return "rpoly_spheroid";
0097 }
0098
0099 };
0100
0101
0102 template <typename Params, typename Parameters, typename T>
0103 inline void setup_rpoly(Params const& params, Parameters& par, par_rpoly<T>& proj_parm)
0104 {
0105 proj_parm.phi1 = fabs(pj_get_param_r<T, srs::spar::lat_ts>(params, "lat_ts", srs::dpar::lat_ts));
0106 if ((proj_parm.mode = (proj_parm.phi1 > epsilon)))
0107 {
0108 proj_parm.fxb = 0.5 * sin(proj_parm.phi1);
0109 proj_parm.fxa = 0.5 / proj_parm.fxb;
0110 }
0111 par.es = 0.;
0112 }
0113
0114 }}
0115 #endif
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132 template <typename T, typename Parameters>
0133 struct rpoly_spheroid : public detail::rpoly::base_rpoly_spheroid<T, Parameters>
0134 {
0135 template <typename Params>
0136 inline rpoly_spheroid(Params const& params, Parameters & par)
0137 {
0138 detail::rpoly::setup_rpoly(params, par, this->m_proj_parm);
0139 }
0140 };
0141
0142 #ifndef DOXYGEN_NO_DETAIL
0143 namespace detail
0144 {
0145
0146
0147 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_F(srs::spar::proj_rpoly, rpoly_spheroid)
0148
0149
0150 BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_F(rpoly_entry, rpoly_spheroid)
0151
0152 BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_BEGIN(rpoly_init)
0153 {
0154 BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_ENTRY(rpoly, rpoly_entry)
0155 }
0156
0157 }
0158 #endif
0159
0160 }
0161
0162 }}
0163
0164 #endif
0165