File indexing completed on 2025-01-18 09:35:45
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_PUTP4P_HPP
0041 #define BOOST_GEOMETRY_PROJECTIONS_PUTP4P_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/projects.hpp>
0046 #include <boost/geometry/srs/projections/impl/factory_entry.hpp>
0047 #include <boost/geometry/srs/projections/impl/aasincos.hpp>
0048
0049 namespace boost { namespace geometry
0050 {
0051
0052 namespace projections
0053 {
0054 #ifndef DOXYGEN_NO_DETAIL
0055 namespace detail { namespace putp4p
0056 {
0057 template <typename T>
0058 struct par_putp4p
0059 {
0060 T C_x, C_y;
0061 };
0062
0063 template <typename T, typename Parameters>
0064 struct base_putp4p_spheroid
0065 {
0066 par_putp4p<T> m_proj_parm;
0067
0068
0069
0070 inline void fwd(Parameters const& , T const& lp_lon, T lp_lat, T& xy_x, T& xy_y) const
0071 {
0072 static T const third = detail::third<T>();
0073
0074 lp_lat = aasin(0.883883476 * sin(lp_lat));
0075 xy_x = this->m_proj_parm.C_x * lp_lon * cos(lp_lat);
0076 xy_x /= cos(lp_lat *= third);
0077 xy_y = this->m_proj_parm.C_y * sin(lp_lat);
0078 }
0079
0080
0081
0082 inline void inv(Parameters const& , T const& xy_x, T const& xy_y, T& lp_lon, T& lp_lat) const
0083 {
0084 lp_lat = aasin(xy_y / this->m_proj_parm.C_y);
0085 lp_lon = xy_x * cos(lp_lat) / this->m_proj_parm.C_x;
0086 lp_lat *= 3.;
0087 lp_lon /= cos(lp_lat);
0088 lp_lat = aasin(1.13137085 * sin(lp_lat));
0089 }
0090
0091 static inline std::string get_name()
0092 {
0093 return "putp4p_spheroid";
0094 }
0095
0096 };
0097
0098
0099
0100 template <typename Parameters, typename T>
0101 inline void setup_putp4p(Parameters& par, par_putp4p<T>& proj_parm)
0102 {
0103 proj_parm.C_x = 0.874038744;
0104 proj_parm.C_y = 3.883251825;
0105
0106 par.es = 0.;
0107 }
0108
0109
0110 template <typename Parameters, typename T>
0111 inline void setup_weren(Parameters& par, par_putp4p<T>& proj_parm)
0112 {
0113 proj_parm.C_x = 1.;
0114 proj_parm.C_y = 4.442882938;
0115
0116 par.es = 0.;
0117 }
0118
0119 }}
0120 #endif
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134 template <typename T, typename Parameters>
0135 struct putp4p_spheroid : public detail::putp4p::base_putp4p_spheroid<T, Parameters>
0136 {
0137 template <typename Params>
0138 inline putp4p_spheroid(Params const& , Parameters & par)
0139 {
0140 detail::putp4p::setup_putp4p(par, this->m_proj_parm);
0141 }
0142 };
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156 template <typename T, typename Parameters>
0157 struct weren_spheroid : public detail::putp4p::base_putp4p_spheroid<T, Parameters>
0158 {
0159 template <typename Params>
0160 inline weren_spheroid(Params const& , Parameters & par)
0161 {
0162 detail::putp4p::setup_weren(par, this->m_proj_parm);
0163 }
0164 };
0165
0166 #ifndef DOXYGEN_NO_DETAIL
0167 namespace detail
0168 {
0169
0170
0171 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_FI(srs::spar::proj_putp4p, putp4p_spheroid)
0172 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_FI(srs::spar::proj_weren, weren_spheroid)
0173
0174
0175 BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_FI(putp4p_entry, putp4p_spheroid)
0176 BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_FI(weren_entry, weren_spheroid)
0177
0178 BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_BEGIN(putp4p_init)
0179 {
0180 BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_ENTRY(putp4p, putp4p_entry)
0181 BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_ENTRY(weren, weren_entry)
0182 }
0183
0184 }
0185 #endif
0186
0187 }
0188
0189 }}
0190
0191 #endif
0192