]>
Commit | Line | Data |
---|---|---|
92f5a8d4 | 1 | // Boost.Geometry - gis-projections (based on PROJ4) |
11fdf7f2 TL |
2 | |
3 | // Copyright (c) 2008-2015 Barend Gehrels, Amsterdam, the Netherlands. | |
4 | ||
92f5a8d4 TL |
5 | // This file was modified by Oracle on 2017, 2018, 2019. |
6 | // Modifications copyright (c) 2017-2019, Oracle and/or its affiliates. | |
11fdf7f2 TL |
7 | // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle. |
8 | ||
9 | // Use, modification and distribution is subject to the Boost Software License, | |
10 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
11 | // http://www.boost.org/LICENSE_1_0.txt) | |
12 | ||
13 | // This file is converted from PROJ4, http://trac.osgeo.org/proj | |
14 | // PROJ4 is originally written by Gerald Evenden (then of the USGS) | |
15 | // PROJ4 is maintained by Frank Warmerdam | |
16 | // PROJ4 is converted to Boost.Geometry by Barend Gehrels | |
17 | ||
92f5a8d4 | 18 | // Last updated version of proj: 5.0.0 |
11fdf7f2 TL |
19 | |
20 | // Original copyright notice: | |
21 | ||
22 | // Permission is hereby granted, free of charge, to any person obtaining a | |
23 | // copy of this software and associated documentation files (the "Software"), | |
24 | // to deal in the Software without restriction, including without limitation | |
25 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
26 | // and/or sell copies of the Software, and to permit persons to whom the | |
27 | // Software is furnished to do so, subject to the following conditions: | |
28 | ||
29 | // The above copyright notice and this permission notice shall be included | |
30 | // in all copies or substantial portions of the Software. | |
31 | ||
32 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
33 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
34 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
35 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
36 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
37 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
38 | // DEALINGS IN THE SOFTWARE. | |
39 | ||
92f5a8d4 TL |
40 | #ifndef BOOST_GEOMETRY_PROJECTIONS_LOXIM_HPP |
41 | #define BOOST_GEOMETRY_PROJECTIONS_LOXIM_HPP | |
11fdf7f2 TL |
42 | |
43 | #include <boost/geometry/srs/projections/impl/base_static.hpp> | |
44 | #include <boost/geometry/srs/projections/impl/base_dynamic.hpp> | |
11fdf7f2 | 45 | #include <boost/geometry/srs/projections/impl/factory_entry.hpp> |
92f5a8d4 TL |
46 | #include <boost/geometry/srs/projections/impl/pj_param.hpp> |
47 | #include <boost/geometry/srs/projections/impl/projects.hpp> | |
11fdf7f2 | 48 | |
92f5a8d4 | 49 | #include <boost/geometry/util/math.hpp> |
11fdf7f2 | 50 | |
92f5a8d4 | 51 | namespace boost { namespace geometry |
11fdf7f2 | 52 | { |
11fdf7f2 TL |
53 | |
54 | namespace projections | |
55 | { | |
56 | #ifndef DOXYGEN_NO_DETAIL | |
57 | namespace detail { namespace loxim | |
58 | { | |
92f5a8d4 | 59 | static const double epsilon = 1e-8; |
11fdf7f2 TL |
60 | |
61 | template <typename T> | |
62 | struct par_loxim | |
63 | { | |
64 | T phi1; | |
65 | T cosphi1; | |
66 | T tanphi1; | |
67 | }; | |
68 | ||
92f5a8d4 TL |
69 | template <typename T, typename Parameters> |
70 | struct base_loxim_spheroid | |
11fdf7f2 | 71 | { |
92f5a8d4 | 72 | par_loxim<T> m_proj_parm; |
11fdf7f2 TL |
73 | |
74 | // FORWARD(s_forward) spheroid | |
75 | // Project coordinates from geographic (lon, lat) to cartesian (x, y) | |
92f5a8d4 | 76 | inline void fwd(Parameters const& , T const& lp_lon, T const& lp_lat, T& xy_x, T& xy_y) const |
11fdf7f2 | 77 | { |
92f5a8d4 TL |
78 | static const T fourth_pi = detail::fourth_pi<T>(); |
79 | static const T half_pi = detail::half_pi<T>(); | |
11fdf7f2 TL |
80 | |
81 | xy_y = lp_lat - this->m_proj_parm.phi1; | |
92f5a8d4 | 82 | if (fabs(xy_y) < epsilon) |
11fdf7f2 TL |
83 | xy_x = lp_lon * this->m_proj_parm.cosphi1; |
84 | else { | |
92f5a8d4 TL |
85 | xy_x = fourth_pi + 0.5 * lp_lat; |
86 | if (fabs(xy_x) < epsilon || fabs(fabs(xy_x) - half_pi) < epsilon) | |
11fdf7f2 TL |
87 | xy_x = 0.; |
88 | else | |
89 | xy_x = lp_lon * xy_y / log( tan(xy_x) / this->m_proj_parm.tanphi1 ); | |
90 | } | |
91 | } | |
92 | ||
93 | // INVERSE(s_inverse) spheroid | |
94 | // Project coordinates from cartesian (x, y) to geographic (lon, lat) | |
92f5a8d4 | 95 | inline void inv(Parameters const&, T const& xy_x, T const& xy_y, T& lp_lon, T& lp_lat) const |
11fdf7f2 | 96 | { |
92f5a8d4 TL |
97 | static const T fourth_pi = detail::fourth_pi<T>(); |
98 | static const T half_pi = detail::half_pi<T>(); | |
11fdf7f2 TL |
99 | |
100 | lp_lat = xy_y + this->m_proj_parm.phi1; | |
92f5a8d4 | 101 | if (fabs(xy_y) < epsilon) { |
11fdf7f2 | 102 | lp_lon = xy_x / this->m_proj_parm.cosphi1; |
92f5a8d4 TL |
103 | } else { |
104 | lp_lon = fourth_pi + 0.5 * lp_lat; | |
105 | if (fabs(lp_lon) < epsilon || fabs(fabs(lp_lon) - half_pi) < epsilon) | |
11fdf7f2 TL |
106 | lp_lon = 0.; |
107 | else | |
108 | lp_lon = xy_x * log( tan(lp_lon) / this->m_proj_parm.tanphi1 ) / xy_y ; | |
92f5a8d4 | 109 | } |
11fdf7f2 TL |
110 | } |
111 | ||
112 | static inline std::string get_name() | |
113 | { | |
114 | return "loxim_spheroid"; | |
115 | } | |
116 | ||
117 | }; | |
118 | ||
119 | // Loximuthal | |
92f5a8d4 TL |
120 | template <typename Params, typename Parameters, typename T> |
121 | inline void setup_loxim(Params const& params, Parameters& par, par_loxim<T>& proj_parm) | |
11fdf7f2 | 122 | { |
92f5a8d4 TL |
123 | static const T fourth_pi = detail::fourth_pi<T>(); |
124 | ||
125 | proj_parm.phi1 = pj_get_param_r<T, srs::spar::lat_1>(params, "lat_1", srs::dpar::lat_1); | |
126 | proj_parm.cosphi1 = cos(proj_parm.phi1); | |
127 | if (proj_parm.cosphi1 < epsilon) | |
128 | BOOST_THROW_EXCEPTION( projection_exception(error_lat_larger_than_90) ); | |
129 | ||
130 | proj_parm.tanphi1 = tan(fourth_pi + 0.5 * proj_parm.phi1); | |
11fdf7f2 | 131 | |
11fdf7f2 TL |
132 | par.es = 0.; |
133 | } | |
134 | ||
135 | }} // namespace detail::loxim | |
136 | #endif // doxygen | |
137 | ||
138 | /*! | |
139 | \brief Loximuthal projection | |
140 | \ingroup projections | |
141 | \tparam Geographic latlong point type | |
142 | \tparam Cartesian xy point type | |
143 | \tparam Parameters parameter type | |
144 | \par Projection characteristics | |
145 | - Pseudocylindrical | |
146 | - Spheroid | |
147 | \par Projection parameters | |
148 | - lat_1: Latitude of first standard parallel (degrees) | |
149 | \par Example | |
150 | \image html ex_loxim.gif | |
151 | */ | |
92f5a8d4 TL |
152 | template <typename T, typename Parameters> |
153 | struct loxim_spheroid : public detail::loxim::base_loxim_spheroid<T, Parameters> | |
11fdf7f2 | 154 | { |
92f5a8d4 TL |
155 | template <typename Params> |
156 | inline loxim_spheroid(Params const& params, Parameters & par) | |
11fdf7f2 | 157 | { |
92f5a8d4 | 158 | detail::loxim::setup_loxim(params, par, this->m_proj_parm); |
11fdf7f2 TL |
159 | } |
160 | }; | |
161 | ||
162 | #ifndef DOXYGEN_NO_DETAIL | |
163 | namespace detail | |
164 | { | |
165 | ||
166 | // Static projection | |
92f5a8d4 | 167 | BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_FI(srs::spar::proj_loxim, loxim_spheroid) |
11fdf7f2 TL |
168 | |
169 | // Factory entry(s) | |
92f5a8d4 TL |
170 | BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_FI(loxim_entry, loxim_spheroid) |
171 | ||
172 | BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_BEGIN(loxim_init) | |
11fdf7f2 | 173 | { |
92f5a8d4 | 174 | BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_ENTRY(loxim, loxim_entry) |
11fdf7f2 TL |
175 | } |
176 | ||
177 | } // namespace detail | |
178 | #endif // doxygen | |
179 | ||
180 | } // namespace projections | |
181 | ||
182 | }} // namespace boost::geometry | |
183 | ||
184 | #endif // BOOST_GEOMETRY_PROJECTIONS_LOXIM_HPP | |
185 |