]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | // Boost.Geometry (aka GGL, Generic Geometry Library) |
2 | ||
3 | // Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands. | |
4 | ||
20effc67 TL |
5 | // This file was modified by Oracle on 2017-2020. |
6 | // Modifications copyright (c) 2017-2020, 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 | #ifndef BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP | |
14 | #define BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP | |
15 | ||
16 | #include <map> | |
17 | #include <string> | |
18 | ||
19 | #include <boost/shared_ptr.hpp> | |
20 | ||
20effc67 TL |
21 | #include <boost/geometry/core/static_assert.hpp> |
22 | ||
92f5a8d4 TL |
23 | #include <boost/geometry/srs/projections/dpar.hpp> |
24 | #include <boost/geometry/srs/projections/proj4.hpp> | |
11fdf7f2 TL |
25 | #include <boost/geometry/srs/projections/impl/factory_entry.hpp> |
26 | #include <boost/geometry/srs/projections/proj/aea.hpp> | |
27 | #include <boost/geometry/srs/projections/proj/aeqd.hpp> | |
28 | #include <boost/geometry/srs/projections/proj/airy.hpp> | |
29 | #include <boost/geometry/srs/projections/proj/aitoff.hpp> | |
30 | #include <boost/geometry/srs/projections/proj/august.hpp> | |
31 | #include <boost/geometry/srs/projections/proj/bacon.hpp> | |
32 | #include <boost/geometry/srs/projections/proj/bipc.hpp> | |
33 | #include <boost/geometry/srs/projections/proj/boggs.hpp> | |
34 | #include <boost/geometry/srs/projections/proj/bonne.hpp> | |
35 | #include <boost/geometry/srs/projections/proj/cass.hpp> | |
36 | #include <boost/geometry/srs/projections/proj/cc.hpp> | |
37 | #include <boost/geometry/srs/projections/proj/cea.hpp> | |
38 | #include <boost/geometry/srs/projections/proj/chamb.hpp> | |
39 | #include <boost/geometry/srs/projections/proj/collg.hpp> | |
40 | #include <boost/geometry/srs/projections/proj/crast.hpp> | |
41 | #include <boost/geometry/srs/projections/proj/denoy.hpp> | |
42 | #include <boost/geometry/srs/projections/proj/eck1.hpp> | |
43 | #include <boost/geometry/srs/projections/proj/eck2.hpp> | |
44 | #include <boost/geometry/srs/projections/proj/eck3.hpp> | |
45 | #include <boost/geometry/srs/projections/proj/eck4.hpp> | |
46 | #include <boost/geometry/srs/projections/proj/eck5.hpp> | |
47 | #include <boost/geometry/srs/projections/proj/eqc.hpp> | |
48 | #include <boost/geometry/srs/projections/proj/eqdc.hpp> | |
49 | #include <boost/geometry/srs/projections/proj/etmerc.hpp> | |
50 | #include <boost/geometry/srs/projections/proj/fahey.hpp> | |
51 | #include <boost/geometry/srs/projections/proj/fouc_s.hpp> | |
52 | #include <boost/geometry/srs/projections/proj/gall.hpp> | |
53 | #include <boost/geometry/srs/projections/proj/geocent.hpp> | |
54 | #include <boost/geometry/srs/projections/proj/geos.hpp> | |
55 | #include <boost/geometry/srs/projections/proj/gins8.hpp> | |
56 | #include <boost/geometry/srs/projections/proj/gn_sinu.hpp> | |
57 | #include <boost/geometry/srs/projections/proj/gnom.hpp> | |
58 | #include <boost/geometry/srs/projections/proj/goode.hpp> | |
59 | #include <boost/geometry/srs/projections/proj/gstmerc.hpp> | |
60 | #include <boost/geometry/srs/projections/proj/hammer.hpp> | |
61 | #include <boost/geometry/srs/projections/proj/hatano.hpp> | |
62 | #include <boost/geometry/srs/projections/proj/healpix.hpp> | |
63 | #include <boost/geometry/srs/projections/proj/krovak.hpp> | |
64 | #include <boost/geometry/srs/projections/proj/igh.hpp> | |
65 | #include <boost/geometry/srs/projections/proj/imw_p.hpp> | |
66 | #include <boost/geometry/srs/projections/proj/isea.hpp> | |
67 | #include <boost/geometry/srs/projections/proj/laea.hpp> | |
68 | #include <boost/geometry/srs/projections/proj/labrd.hpp> | |
69 | #include <boost/geometry/srs/projections/proj/lagrng.hpp> | |
70 | #include <boost/geometry/srs/projections/proj/larr.hpp> | |
71 | #include <boost/geometry/srs/projections/proj/lask.hpp> | |
72 | #include <boost/geometry/srs/projections/proj/latlong.hpp> | |
73 | #include <boost/geometry/srs/projections/proj/lcc.hpp> | |
74 | #include <boost/geometry/srs/projections/proj/lcca.hpp> | |
75 | #include <boost/geometry/srs/projections/proj/loxim.hpp> | |
76 | #include <boost/geometry/srs/projections/proj/lsat.hpp> | |
77 | #include <boost/geometry/srs/projections/proj/mbtfpp.hpp> | |
78 | #include <boost/geometry/srs/projections/proj/mbtfpq.hpp> | |
79 | #include <boost/geometry/srs/projections/proj/mbt_fps.hpp> | |
80 | #include <boost/geometry/srs/projections/proj/merc.hpp> | |
81 | #include <boost/geometry/srs/projections/proj/mill.hpp> | |
82 | #include <boost/geometry/srs/projections/proj/mod_ster.hpp> | |
83 | #include <boost/geometry/srs/projections/proj/moll.hpp> | |
84 | #include <boost/geometry/srs/projections/proj/natearth.hpp> | |
85 | #include <boost/geometry/srs/projections/proj/nell.hpp> | |
86 | #include <boost/geometry/srs/projections/proj/nell_h.hpp> | |
87 | #include <boost/geometry/srs/projections/proj/nocol.hpp> | |
88 | #include <boost/geometry/srs/projections/proj/nsper.hpp> | |
89 | #include <boost/geometry/srs/projections/proj/nzmg.hpp> | |
90 | #include <boost/geometry/srs/projections/proj/ob_tran.hpp> | |
91 | #include <boost/geometry/srs/projections/proj/ocea.hpp> | |
92 | #include <boost/geometry/srs/projections/proj/oea.hpp> | |
93 | #include <boost/geometry/srs/projections/proj/omerc.hpp> | |
94 | #include <boost/geometry/srs/projections/proj/ortho.hpp> | |
95 | #include <boost/geometry/srs/projections/proj/qsc.hpp> | |
96 | #include <boost/geometry/srs/projections/proj/poly.hpp> | |
97 | #include <boost/geometry/srs/projections/proj/putp2.hpp> | |
98 | #include <boost/geometry/srs/projections/proj/putp3.hpp> | |
99 | #include <boost/geometry/srs/projections/proj/putp4p.hpp> | |
100 | #include <boost/geometry/srs/projections/proj/putp5.hpp> | |
101 | #include <boost/geometry/srs/projections/proj/putp6.hpp> | |
102 | #include <boost/geometry/srs/projections/proj/robin.hpp> | |
103 | #include <boost/geometry/srs/projections/proj/rouss.hpp> | |
104 | #include <boost/geometry/srs/projections/proj/rpoly.hpp> | |
105 | #include <boost/geometry/srs/projections/proj/sconics.hpp> | |
106 | #include <boost/geometry/srs/projections/proj/somerc.hpp> | |
107 | #include <boost/geometry/srs/projections/proj/stere.hpp> | |
108 | #include <boost/geometry/srs/projections/proj/sterea.hpp> | |
109 | #include <boost/geometry/srs/projections/proj/sts.hpp> | |
110 | #include <boost/geometry/srs/projections/proj/tcc.hpp> | |
111 | #include <boost/geometry/srs/projections/proj/tcea.hpp> | |
112 | #include <boost/geometry/srs/projections/proj/tmerc.hpp> | |
113 | #include <boost/geometry/srs/projections/proj/tpeqd.hpp> | |
114 | #include <boost/geometry/srs/projections/proj/urm5.hpp> | |
115 | #include <boost/geometry/srs/projections/proj/urmfps.hpp> | |
116 | #include <boost/geometry/srs/projections/proj/vandg.hpp> | |
117 | #include <boost/geometry/srs/projections/proj/vandg2.hpp> | |
118 | #include <boost/geometry/srs/projections/proj/vandg4.hpp> | |
119 | #include <boost/geometry/srs/projections/proj/wag2.hpp> | |
120 | #include <boost/geometry/srs/projections/proj/wag3.hpp> | |
121 | #include <boost/geometry/srs/projections/proj/wag7.hpp> | |
122 | #include <boost/geometry/srs/projections/proj/wink1.hpp> | |
123 | #include <boost/geometry/srs/projections/proj/wink2.hpp> | |
124 | ||
125 | namespace boost { namespace geometry { namespace projections | |
126 | { | |
127 | ||
128 | namespace detail | |
129 | { | |
130 | ||
92f5a8d4 TL |
131 | template <typename Params> |
132 | struct factory_key | |
11fdf7f2 | 133 | { |
20effc67 TL |
134 | BOOST_GEOMETRY_STATIC_ASSERT_FALSE( |
135 | "Invalid parameters type.", | |
136 | Params); | |
92f5a8d4 TL |
137 | }; |
138 | ||
139 | template <> | |
140 | struct factory_key<srs::detail::proj4_parameters> | |
141 | { | |
142 | typedef std::string type; | |
143 | template <typename ProjParams> | |
144 | static type const& get(ProjParams const& par) | |
145 | { | |
146 | return par.id.name; | |
147 | } | |
148 | static const char* get(const char* name, srs::dpar::value_proj id) | |
149 | { | |
150 | return name; | |
151 | } | |
152 | }; | |
11fdf7f2 | 153 | |
92f5a8d4 TL |
154 | template <typename T> |
155 | struct factory_key<srs::dpar::parameters<T> > | |
156 | { | |
157 | typedef srs::dpar::value_proj type; | |
158 | template <typename ProjParams> | |
159 | static type const& get(ProjParams const& par) | |
160 | { | |
161 | return par.id.id; | |
162 | } | |
163 | static srs::dpar::value_proj get(const char* name, srs::dpar::value_proj id) | |
164 | { | |
165 | return id; | |
166 | } | |
167 | }; | |
168 | ||
169 | ||
170 | template <typename Params, typename CT, typename ProjParams> | |
171 | class factory | |
172 | { | |
173 | private: | |
174 | typedef detail::factory_entry | |
11fdf7f2 | 175 | < |
92f5a8d4 TL |
176 | Params, |
177 | CT, | |
178 | ProjParams | |
179 | > entry_base; | |
180 | ||
181 | typedef factory_key<Params> key; | |
182 | typedef typename key::type key_type; | |
183 | typedef boost::shared_ptr<entry_base> entry_ptr; | |
184 | ||
185 | typedef std::map<key_type, entry_ptr> entries_map; | |
186 | ||
187 | entries_map m_entries; | |
11fdf7f2 TL |
188 | |
189 | public: | |
190 | ||
191 | factory() | |
192 | { | |
193 | detail::aea_init(*this); | |
194 | detail::aeqd_init(*this); | |
195 | detail::airy_init(*this); | |
196 | detail::aitoff_init(*this); | |
197 | detail::august_init(*this); | |
198 | detail::bacon_init(*this); | |
199 | detail::bipc_init(*this); | |
200 | detail::boggs_init(*this); | |
201 | detail::bonne_init(*this); | |
202 | detail::cass_init(*this); | |
203 | detail::cc_init(*this); | |
204 | detail::cea_init(*this); | |
205 | detail::chamb_init(*this); | |
206 | detail::collg_init(*this); | |
207 | detail::crast_init(*this); | |
208 | detail::denoy_init(*this); | |
209 | detail::eck1_init(*this); | |
210 | detail::eck2_init(*this); | |
211 | detail::eck3_init(*this); | |
212 | detail::eck4_init(*this); | |
213 | detail::eck5_init(*this); | |
214 | detail::eqc_init(*this); | |
215 | detail::eqdc_init(*this); | |
216 | detail::etmerc_init(*this); | |
217 | detail::fahey_init(*this); | |
218 | detail::fouc_s_init(*this); | |
219 | detail::gall_init(*this); | |
220 | detail::geocent_init(*this); | |
221 | detail::geos_init(*this); | |
222 | detail::gins8_init(*this); | |
223 | detail::gn_sinu_init(*this); | |
224 | detail::gnom_init(*this); | |
225 | detail::goode_init(*this); | |
226 | detail::gstmerc_init(*this); | |
227 | detail::hammer_init(*this); | |
228 | detail::hatano_init(*this); | |
229 | detail::healpix_init(*this); | |
230 | detail::krovak_init(*this); | |
231 | detail::igh_init(*this); | |
232 | detail::imw_p_init(*this); | |
233 | detail::isea_init(*this); | |
234 | detail::labrd_init(*this); | |
235 | detail::laea_init(*this); | |
236 | detail::lagrng_init(*this); | |
237 | detail::larr_init(*this); | |
238 | detail::lask_init(*this); | |
239 | detail::latlong_init(*this); | |
240 | detail::lcc_init(*this); | |
241 | detail::lcca_init(*this); | |
242 | detail::loxim_init(*this); | |
243 | detail::lsat_init(*this); | |
244 | detail::mbtfpp_init(*this); | |
245 | detail::mbtfpq_init(*this); | |
246 | detail::mbt_fps_init(*this); | |
247 | detail::merc_init(*this); | |
248 | detail::mill_init(*this); | |
249 | detail::mod_ster_init(*this); | |
250 | detail::moll_init(*this); | |
251 | detail::natearth_init(*this); | |
252 | detail::nell_init(*this); | |
253 | detail::nell_h_init(*this); | |
254 | detail::nocol_init(*this); | |
255 | detail::nsper_init(*this); | |
256 | detail::nzmg_init(*this); | |
257 | detail::ob_tran_init(*this); | |
258 | detail::ocea_init(*this); | |
259 | detail::oea_init(*this); | |
260 | detail::omerc_init(*this); | |
261 | detail::ortho_init(*this); | |
262 | detail::qsc_init(*this); | |
263 | detail::poly_init(*this); | |
264 | detail::putp2_init(*this); | |
265 | detail::putp3_init(*this); | |
266 | detail::putp4p_init(*this); | |
267 | detail::putp5_init(*this); | |
268 | detail::putp6_init(*this); | |
269 | detail::robin_init(*this); | |
270 | detail::rouss_init(*this); | |
271 | detail::rpoly_init(*this); | |
272 | detail::sconics_init(*this); | |
273 | detail::somerc_init(*this); | |
274 | detail::stere_init(*this); | |
275 | detail::sterea_init(*this); | |
276 | detail::sts_init(*this); | |
277 | detail::tcc_init(*this); | |
278 | detail::tcea_init(*this); | |
279 | detail::tmerc_init(*this); | |
280 | detail::tpeqd_init(*this); | |
281 | detail::urm5_init(*this); | |
282 | detail::urmfps_init(*this); | |
283 | detail::vandg_init(*this); | |
284 | detail::vandg2_init(*this); | |
285 | detail::vandg4_init(*this); | |
286 | detail::wag2_init(*this); | |
287 | detail::wag3_init(*this); | |
288 | detail::wag7_init(*this); | |
289 | detail::wink1_init(*this); | |
290 | detail::wink2_init(*this); | |
291 | } | |
292 | ||
92f5a8d4 | 293 | void add_to_factory(const char* name, srs::dpar::value_proj id, entry_base* entry) |
11fdf7f2 | 294 | { |
92f5a8d4 TL |
295 | // The pointer has to be owned before std::map::operator[] in case it thrown an exception. |
296 | entry_ptr ptr(entry); | |
297 | m_entries[key::get(name, id)] = ptr; | |
11fdf7f2 TL |
298 | } |
299 | ||
92f5a8d4 | 300 | detail::dynamic_wrapper_b<CT, ProjParams>* create_new(Params const& params, ProjParams const& proj_par) const |
11fdf7f2 | 301 | { |
92f5a8d4 TL |
302 | typedef typename entries_map::const_iterator const_iterator; |
303 | const_iterator it = m_entries.find(key::get(proj_par)); | |
304 | if (it != m_entries.end()) | |
11fdf7f2 | 305 | { |
92f5a8d4 | 306 | return it->second->create_new(params, proj_par); |
11fdf7f2 TL |
307 | } |
308 | ||
309 | return 0; | |
310 | } | |
311 | }; | |
312 | ||
92f5a8d4 TL |
313 | template <typename T> |
314 | inline detail::dynamic_wrapper_b<T, projections::parameters<T> >* | |
315 | create_new(srs::detail::proj4_parameters const& params, | |
316 | projections::parameters<T> const& parameters) | |
317 | { | |
318 | static factory<srs::detail::proj4_parameters, T, projections::parameters<T> > const fac; | |
319 | return fac.create_new(params, parameters); | |
320 | } | |
321 | ||
322 | template <typename T> | |
323 | inline detail::dynamic_wrapper_b<T, projections::parameters<T> >* | |
324 | create_new(srs::dpar::parameters<T> const& params, | |
325 | projections::parameters<T> const& parameters) | |
11fdf7f2 | 326 | { |
92f5a8d4 TL |
327 | static factory<srs::dpar::parameters<T>, T, projections::parameters<T> > const fac; |
328 | return fac.create_new(params, parameters); | |
11fdf7f2 TL |
329 | } |
330 | ||
92f5a8d4 | 331 | |
11fdf7f2 TL |
332 | } // namespace detail |
333 | ||
334 | }}} // namespace boost::geometry::projections | |
335 | ||
336 | #endif // BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP |