1 // Boost.Geometry
2 
3 // Copyright (c) 2017-2020, Oracle and/or its affiliates.
4 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
5 
6 // Use, modification and distribution is subject to the Boost Software License,
7 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 
10 #ifndef BOOST_GEOMETRY_SRS_PROJECTIONS_SPAR_HPP
11 #define BOOST_GEOMETRY_SRS_PROJECTIONS_SPAR_HPP
12 
13 
14 #include <string>
15 #include <type_traits>
16 #include <vector>
17 
18 #include <boost/geometry/core/radius.hpp>
19 #include <boost/geometry/core/static_assert.hpp>
20 #include <boost/geometry/core/tag.hpp>
21 #include <boost/geometry/core/tags.hpp>
22 
23 #include <boost/geometry/srs/projections/impl/pj_datums.hpp>
24 #include <boost/geometry/srs/projections/impl/pj_ellps.hpp>
25 #include <boost/geometry/srs/projections/dpar.hpp>
26 #include <boost/geometry/srs/projections/par_data.hpp>
27 #include <boost/geometry/srs/sphere.hpp>
28 #include <boost/geometry/srs/spheroid.hpp>
29 
30 #include <boost/geometry/util/sequence.hpp>
31 #include <boost/geometry/util/tuples.hpp>
32 
33 #include <boost/variant/variant.hpp>
34 
35 
36 namespace boost { namespace geometry { namespace srs
37 {
38 
39 namespace spar
40 {
41 
42 // Static parameters holder
43 
44 template <typename ...>
45 class parameters {};
46 
47 namespace detail
48 {
49 
50 // TODO: implement this as a sequence utility
51 template <std::size_t I, typename ...>
52 struct parameters_base
53 {
54     BOOST_GEOMETRY_STATIC_ASSERT_FALSE(
55         "I out of bounds.",
56         std::integral_constant<size_t, I>);
57 };
58 
59 template <std::size_t I, typename P, typename ...Ps>
60 struct parameters_base<I, P, Ps...>
61 {
62     typedef typename parameters_base<I - 1, Ps...>::type type;
63 };
64 
65 template <typename P, typename ...Ps>
66 struct parameters_base<0, P, Ps...>
67 {
68     typedef parameters<P, Ps...> type;
69 };
70 
71 } // namespace detail
72 
73 template <typename P, typename ...Ps>
74 class parameters<P, Ps...>
75     : private parameters<Ps...>
76 {
77 public:
78     parameters() = default;
79     parameters(parameters const&) = default;
80     parameters(parameters&&) = default;
81     parameters & operator=(parameters const&) = default;
82     parameters & operator=(parameters&&) = default;
83 
84     template
85     <
86         typename R, typename ...Rs,
87         std::enable_if_t<std::is_constructible<P, R>::value, int> = 0
88     >
parameters(R && r,Rs &&...rs)89     explicit parameters(R&& r, Rs&&... rs)
90         : parameters<Ps...>(std::forward<Rs>(rs)...)
91         , m_p(std::forward<R>(r))
92     {}
93 
94     template <std::size_t I>
get() const95     auto const& get() const
96     {
97         typedef typename detail::parameters_base<I, P, Ps...>::type base_t;
98         return static_cast<base_t const&>(*this).m_p;
99     }
100 
101 private:
102     P m_p;
103 
104     template <typename ...>
105     friend class parameters;
106 };
107 
108 } // namespace spar
109 
110 }}} // namespace boost::geometry::srs
111 
112 
113 namespace boost { namespace geometry { namespace tuples
114 {
115 
116 template <std::size_t I, typename ...Ts>
117 struct element<I, srs::spar::parameters<Ts...> >
118     : util::sequence_element<I, util::type_sequence<Ts...> >
119 {};
120 
121 template <typename ...Ts>
122 struct size<srs::spar::parameters<Ts...> >
123     : std::integral_constant<std::size_t, sizeof...(Ts)>
124 {};
125 
126 template <int I, typename ...Ts>
127 inline typename element<I, srs::spar::parameters<Ts...> >::type const&
get(srs::spar::parameters<Ts...> const & tup)128 get(srs::spar::parameters<Ts...> const& tup)
129 {
130     return tup.template get<I>();
131 }
132 
133 
134 }}} // namespace boost::geometry::tuples
135 
136 
137 namespace boost { namespace geometry { namespace srs
138 {
139 
140 namespace spar
141 {
142 
143 // Static parameters values
144 
145 struct datum_wgs84 {};
146 struct datum_ggrs87 {};
147 struct datum_nad83 {};
148 struct datum_nad27 {};
149 struct datum_potsdam {};
150 struct datum_carthage {};
151 struct datum_hermannskogel {};
152 struct datum_ire65 {};
153 struct datum_nzgd49 {};
154 struct datum_osgb36 {};
155 
156 struct ellps_merit {};
157 struct ellps_sgs85 {};
158 struct ellps_grs80 {};
159 struct ellps_iau76 {};
160 struct ellps_airy {};
161 struct ellps_apl4_9 {};
162 struct ellps_nwl9d {};
163 struct ellps_mod_airy {};
164 struct ellps_andrae {};
165 struct ellps_aust_sa {};
166 struct ellps_grs67 {};
167 struct ellps_bessel {};
168 struct ellps_bess_nam {};
169 struct ellps_clrk66 {};
170 struct ellps_clrk80 {};
171 struct ellps_clrk80ign {};
172 struct ellps_cpm {};
173 struct ellps_delmbr {};
174 struct ellps_engelis {};
175 struct ellps_evrst30 {};
176 struct ellps_evrst48 {};
177 struct ellps_evrst56 {};
178 struct ellps_evrst69 {};
179 struct ellps_evrstss {};
180 struct ellps_fschr60 {};
181 struct ellps_fschr60m {};
182 struct ellps_fschr68 {};
183 struct ellps_helmert {};
184 struct ellps_hough {};
185 struct ellps_intl {};
186 struct ellps_krass {};
187 struct ellps_kaula {};
188 struct ellps_lerch {};
189 struct ellps_mprts {};
190 struct ellps_new_intl {};
191 struct ellps_plessis {};
192 struct ellps_seasia {};
193 struct ellps_walbeck {};
194 struct ellps_wgs60 {};
195 struct ellps_wgs66 {};
196 struct ellps_wgs72 {};
197 struct ellps_wgs84 {};
198 struct ellps_sphere {};
199 
200 struct mode_plane {};
201 struct mode_di {};
202 struct mode_dd {};
203 struct mode_hex {};
204 
205 struct orient_isea {};
206 struct orient_pole {};
207 
208 struct pm_greenwich {};
209 struct pm_lisbon {};
210 struct pm_paris {};
211 struct pm_bogota {};
212 struct pm_madrid {};
213 struct pm_rome {};
214 struct pm_bern {};
215 struct pm_jakarta {};
216 struct pm_ferro {};
217 struct pm_brussels {};
218 struct pm_stockholm {};
219 struct pm_athens {};
220 struct pm_oslo {};
221 
222 struct proj_aea {}; struct proj_leac {}; // Albers Equal Area, Lambert Equal Area Conic
223 struct proj_aeqd {}; // Azimuthal Equidistant
224 struct proj_airy {}; // Airy
225 struct proj_aitoff {}; struct proj_wintri {}; // Aitoff, Winkel Tripel
226 struct proj_august {};
227 struct proj_apian {}; struct proj_ortel {}; struct proj_bacon {};
228 struct proj_bipc {};
229 struct proj_boggs {};
230 struct proj_bonne {};
231 struct proj_cass {};
232 struct proj_cc {};
233 struct proj_cea {};
234 struct proj_chamb {};
235 struct proj_collg {};
236 struct proj_crast {};
237 struct proj_denoy {};
238 struct proj_eck1 {};
239 struct proj_eck2 {};
240 struct proj_eck3 {}; struct proj_putp1 {}; struct proj_wag6 {}; struct proj_kav7 {};
241 struct proj_eck4 {};
242 struct proj_eck5 {};
243 struct proj_eqc {};
244 struct proj_eqdc {};
245 struct proj_etmerc {}; struct proj_utm {};
246 struct proj_fahey {};
247 struct proj_fouc_s {};
248 struct proj_gall {};
249 struct proj_geocent {};
250 struct proj_geos {};
251 struct proj_gins8 {};
252 struct proj_gn_sinu {}; struct proj_sinu {}; struct proj_eck6 {}; struct proj_mbtfps {};
253 struct proj_gnom {};
254 struct proj_goode {};
255 struct proj_gstmerc {};
256 struct proj_hammer {};
257 struct proj_hatano {};
258 struct proj_healpix {};
259 struct proj_rhealpix {};
260 struct proj_igh {};
261 struct proj_imw_p {};
262 struct proj_isea {};
263 struct proj_krovak {};
264 struct proj_labrd {};
265 struct proj_laea {};
266 struct proj_lagrng {};
267 struct proj_larr {};
268 struct proj_lask {};
269 struct proj_lonlat {}; struct proj_latlon {}; struct proj_latlong {}; struct proj_longlat {};
270 struct proj_lcc {};
271 struct proj_lcca {};
272 struct proj_loxim {};
273 struct proj_lsat {};
274 struct proj_mbt_fps {};
275 struct proj_mbtfpp {};
276 struct proj_mbtfpq {};
277 struct proj_merc {};
278 struct proj_mill {};
279 struct proj_mil_os {}; struct proj_lee_os {}; struct proj_gs48 {}; struct proj_alsk {}; struct proj_gs50 {};
280 struct proj_moll {}; struct proj_wag4 {}; struct proj_wag5 {};
281 struct proj_natearth {};
282 struct proj_nell {};
283 struct proj_nell_h {};
284 struct proj_nicol {};
285 struct proj_nsper {}; struct proj_tpers {};
286 struct proj_nzmg {};
287 struct proj_ob_tran {};
288 struct proj_ocea {};
289 struct proj_oea {};
290 struct proj_omerc {};
291 struct proj_ortho {};
292 struct proj_poly {};
293 struct proj_putp2 {};
294 struct proj_putp3 {}; struct proj_putp3p {};
295 struct proj_putp4p {}; struct proj_weren {};
296 struct proj_putp5 {}; struct proj_putp5p {};
297 struct proj_putp6 {}; struct proj_putp6p {};
298 struct proj_qsc {};
299 struct proj_robin {};
300 struct proj_rouss {};
301 struct proj_rpoly {};
302 struct proj_euler {}; struct proj_murd1 {}; struct proj_murd2 {}; struct proj_murd3 {}; struct proj_pconic {}; struct proj_tissot {}; struct proj_vitk1 {};
303 struct proj_somerc {};
304 struct proj_stere {}; struct proj_ups {};
305 struct proj_sterea {};
306 struct proj_kav5 {}; struct proj_qua_aut {}; struct proj_fouc {}; struct proj_mbt_s {};
307 struct proj_tcc {};
308 struct proj_tcea {};
309 struct proj_tmerc {};
310 struct proj_tpeqd {};
311 struct proj_urm5 {};
312 struct proj_urmfps {}; struct proj_wag1 {};
313 struct proj_vandg {};
314 struct proj_vandg2 {}; struct proj_vandg3 {};
315 struct proj_vandg4 {};
316 struct proj_wag2 {};
317 struct proj_wag3 {};
318 struct proj_wag7 {};
319 struct proj_wink1 {};
320 struct proj_wink2 {};
321 
322 struct sweep_x {};
323 struct sweep_y {};
324 
325 struct units_km {};
326 struct units_m {};
327 struct units_dm {};
328 struct units_cm {};
329 struct units_mm {};
330 struct units_kmi {};
331 struct units_in {};
332 struct units_ft {};
333 struct units_yd {};
334 struct units_mi {};
335 struct units_fath {};
336 struct units_ch {};
337 struct units_link {};
338 struct units_us_in {};
339 struct units_us_ft {};
340 struct units_us_yd {};
341 struct units_us_ch {};
342 struct units_us_mi {};
343 struct units_ind_yd {};
344 struct units_ind_ft {};
345 struct units_ind_ch {};
346 
347 // Static parameters names
348 
349 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(NAME) \
350 template <typename T = double> \
351 struct NAME \
352 { \
353     NAME() : value(0) {} \
354     explicit NAME(T const& v) : value(v) {} \
355     T value; \
356 };
357 
358 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(a)
359 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(b)
360 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(e)
361 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(es)
362 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(f)
363 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(gamma)
364 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(h)
365 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(k)
366 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(k_0)
367 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(m)
368 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(n)
369 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(q)
370 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(r)
371 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(rf)
372 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(to_meter)
373 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(vto_meter)
374 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(w)
375 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(x_0)
376 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(y_0)
377 
378 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(NAME) \
379 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(NAME)
380 
381 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(alpha)
382 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(azi)
383 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_0)
384 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_1)
385 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_2)
386 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_b)
387 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_ts)
388 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_0)
389 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_1)
390 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_2)
391 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_wrap)
392 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lonc)
393 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_alpha)
394 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_1)
395 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_2)
396 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_c)
397 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_p)
398 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_1)
399 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_2)
400 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_c)
401 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_p)
402 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(pm)
403 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(r_lat_a)
404 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(r_lat_g)
405 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(theta)
406 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(tilt)
407 
408 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(NAME) \
409 template <int I> struct NAME { static const int value = I; };
410 
411 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(aperture)
412 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(lsat)
413 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(north_square)
414 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(path)
415 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(resolution)
416 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(south_square)
417 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(zone)
418 
419 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(NAME) \
420 struct NAME {};
421 
422 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(czech)
423 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(geoc)
424 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(guam)
425 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(no_cut)
426 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(no_defs)
427 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(no_rot)
428 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(ns)
429 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(over)
430 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_a)
431 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_au)
432 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_g)
433 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_h)
434 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_v)
435 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(rescale)
436 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(south)
437 
438 template
439 <
440     typename SpheroidOrSphere
441 >
442 struct ellps
443 {
444     typedef SpheroidOrSphere model_type;
445 
ellpsboost::geometry::srs::spar::ellps446     ellps() : model() {}
ellpsboost::geometry::srs::spar::ellps447     explicit ellps(SpheroidOrSphere const& sph) : model(sph) {}
448 
449     SpheroidOrSphere model;
450 };
451 
452 struct nadgrids
453     : srs::detail::nadgrids
454 {
455     typedef srs::detail::nadgrids base_t;
nadgridsboost::geometry::srs::spar::nadgrids456     nadgrids(std::string const& g0) : base_t(g0) {}
nadgridsboost::geometry::srs::spar::nadgrids457     nadgrids(std::string const& g0, std::string const& g1) : base_t(g0, g1) {}
nadgridsboost::geometry::srs::spar::nadgrids458     nadgrids(std::string const& g0, std::string const& g1, std::string const& g2) : base_t(g0, g1, g2) {}
nadgridsboost::geometry::srs::spar::nadgrids459     nadgrids(std::string const& g0, std::string const& g1, std::string const& g2, std::string const& g3) : base_t(g0, g1, g2, g3) {}
nadgridsboost::geometry::srs::spar::nadgrids460     nadgrids(std::string const& g0, std::string const& g1, std::string const& g2, std::string const& g3, std::string const& g4) : base_t(g0, g1, g2, g3, g4) {}
461 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
nadgridsboost::geometry::srs::spar::nadgrids462     nadgrids(std::initializer_list<std::string> l) : base_t(l) {}
463 #endif
464 };
465 
466 template <typename Proj>
467 struct o_proj
468 {
469     typedef Proj type;
470 };
471 
472 template <typename T = double>
473 struct towgs84
474     : srs::detail::towgs84<T>
475 {
476     typedef srs::detail::towgs84<T> base_t;
477 
towgs84boost::geometry::srs::spar::towgs84478     towgs84(T const& v0, T const& v1, T const& v2)
479         : base_t(v0, v1, v2)
480     {}
towgs84boost::geometry::srs::spar::towgs84481     towgs84(T const& v0, T const& v1, T const& v2, T const& v3, T const& v4, T const& v5, T const& v6)
482         : base_t(v0, v1, v2, v3, v4, v5, v6)
483     {}
484 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
towgs84boost::geometry::srs::spar::towgs84485     towgs84(std::initializer_list<T> l) : base_t(l) {}
486 #endif
487 };
488 
489 template <typename Units>
490 struct vunits
491 {
492     typedef Units type;
493 };
494 
495 // Static parameters traits
496 
497 #ifndef DOXYGEN_NO_DETAIL
498 namespace detail
499 {
500 
501 template <typename D>
502 struct datum_traits
503 {
504     static const bool is_specialized = false;
505     typedef void ellps_type;
506     typedef void def_type;
507 };
508 
509 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(NAME, ELLPS, DEF_T, DEF_V) \
510 template <> \
511 struct datum_traits<spar::NAME> \
512 { \
513     static const bool is_specialized = true; \
514     typedef spar::ELLPS ellps_type; \
515     typedef spar::DEF_T def_type; \
516     static spar::DEF_T def() { return spar::DEF_T DEF_V; } \
517     static const dpar::value_datum id = dpar::NAME; \
518 };
519 
520 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_wgs84, ellps_wgs84, towgs84<double>, (0,0,0))
521 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_ggrs87, ellps_grs80, towgs84<double>, (-199.87,74.79,246.62))
522 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_nad83, ellps_grs80, towgs84<double>, (0,0,0))
523 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_nad27, ellps_clrk66, nadgrids, ("@conus","@alaska","@ntv2_0.gsb","@ntv1_can.dat"))
524 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_potsdam, ellps_bessel, towgs84<double>, (598.1,73.7,418.2,0.202,0.045,-2.455,6.7))
525 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_carthage, ellps_clrk80ign, towgs84<double>, (-263.0,6.0,431.0))
526 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_hermannskogel, ellps_bessel, towgs84<double>, (577.326,90.129,463.919,5.137,1.474,5.297,2.4232))
527 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_ire65, ellps_mod_airy, towgs84<double>, (482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15))
528 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_nzgd49, ellps_intl, towgs84<double>, (59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993))
529 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_osgb36, ellps_airy, towgs84<double>, (446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894))
530 
531 
532 template <typename E>
533 struct ellps_traits
534 {
535     static const bool is_specialized = false;
536     template <typename T> struct model_type
537     {
538         typedef void type;
539     };
540 };
541 
542 template <typename E>
543 struct ellps_traits<spar::ellps<E> >
544 {
545     static const bool is_specialized = true;
546     template <typename T> struct model_type
547     {
548         // TODO: transform to spheroid<T> or sphere<T>
549         typedef typename spar::ellps<E>::model_type type;
550     };
551 
552     template <typename T>
modelboost::geometry::srs::spar::detail::ellps_traits553     static typename spar::ellps<E>::model_type const& model(spar::ellps<E> const& e)
554     {
555         return e.model;
556     }
557 };
558 
559 // TODO: Implement as RadiusType-agnostic, member struct template defining model
560 //       and function template returning it
561 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(NAME) \
562 template <> \
563 struct ellps_traits<spar::NAME> \
564 { \
565     static const bool is_specialized = true; \
566     template <typename T> struct model_type \
567     { \
568         typedef srs::spheroid<T> type; \
569     }; \
570     template <typename T> \
571     static srs::spheroid<T> model(spar::NAME const&) { \
572         return srs::spheroid<T>(projections::detail::pj_get_ellps<T>().first[dpar::NAME].a, \
573                                 projections::detail::pj_get_ellps<T>().first[dpar::NAME].b); \
574     } \
575 };
576 
577 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SPHERE(NAME) \
578 template <> \
579 struct ellps_traits<spar::NAME> \
580 { \
581     static const bool is_specialized = true; \
582     template <typename T> struct model_type \
583     { \
584         typedef srs::sphere<T> type; \
585     }; \
586     template <typename T> \
587     static srs::sphere<T> model(spar::NAME const&) { \
588         return srs::sphere<T>(projections::detail::pj_get_ellps<T>().first[dpar::NAME].a); \
589     } \
590 };
591 
592 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_merit)
593 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_sgs85)
594 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_grs80)
595 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_iau76)
596 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_airy)
597 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_apl4_9)
598 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_nwl9d)
599 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_mod_airy)
600 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_andrae)
601 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_aust_sa)
602 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_grs67)
603 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_bessel)
604 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_bess_nam)
605 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_clrk66)
606 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_clrk80)
607 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_clrk80ign)
608 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_cpm)
609 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_delmbr)
610 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_engelis)
611 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst30)
612 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst48)
613 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst56)
614 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst69)
615 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrstss)
616 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_fschr60)
617 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_fschr60m)
618 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_fschr68)
619 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_helmert)
620 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_hough)
621 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_intl)
622 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_krass)
623 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_kaula)
624 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_lerch)
625 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_mprts)
626 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_new_intl)
627 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_plessis)
628 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_seasia)
629 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_walbeck)
630 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs60)
631 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs66)
632 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs72)
633 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs84)
634 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SPHERE(ellps_sphere)
635 
636 template <typename M>
637 struct mode_traits
638 {
639     static const bool is_specialized = false;
640     typedef void type;
641 };
642 
643 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(NAME) \
644 template <> \
645 struct mode_traits<spar::NAME> \
646 { \
647     static const bool is_specialized = true; \
648     typedef spar::NAME type; \
649 };
650 
651 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_plane)
652 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_di)
653 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_dd)
654 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_hex)
655 
656 template <typename O>
657 struct orient_traits
658 {
659     static const bool is_specialized = false;
660     typedef void type;
661 };
662 
663 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(NAME) \
664 template <> \
665 struct orient_traits<spar::NAME> \
666 { \
667     static const bool is_specialized = true; \
668     typedef spar::NAME type; \
669 };
670 
671 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(orient_isea)
672 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(orient_pole)
673 
674 template <typename M>
675 struct pm_traits
676 {
677     static const bool is_specialized = false;
678     typedef void type;
679 };
680 
681 template <typename T>
682 struct pm_traits<spar::pm<T> >
683 {
684     static const bool is_specialized = true;
685     typedef T type;
valueboost::geometry::srs::spar::detail::pm_traits686     static T const& value(spar::pm<T> const& p) { return p.value; }
687 };
688 
689 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(NAME, INDEX) \
690 template <> \
691 struct pm_traits<spar::NAME> \
692 { \
693     static const bool is_specialized = true; \
694     typedef double type; \
695     static double value(spar::NAME const& ) { return projections::detail::pj_prime_meridians[INDEX].deg; } \
696 };
697 
698 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_greenwich, 0)
699 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_lisbon,    1)
700 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_paris,     2)
701 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_bogota,    3)
702 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_madrid,    4)
703 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_rome,      5)
704 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_bern,      6)
705 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_jakarta,   7)
706 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_ferro,     8)
707 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_brussels,  9)
708 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_stockholm, 10)
709 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_athens,    11)
710 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_oslo,      12)
711 
712 template <typename P>
713 struct proj_traits
714 {
715     static const bool is_specialized = false;
716     typedef void type;
717 };
718 
719 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(NAME) \
720 template <> \
721 struct proj_traits<spar::NAME> \
722 { \
723     static const bool is_specialized = true; \
724     typedef spar::NAME type; \
725     static const srs::dpar::value_proj id = dpar::NAME; \
726 };
727 
728 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_aea)
729 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_leac)
730 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_aeqd)
731 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_airy)
732 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_aitoff)
733 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wintri)
734 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_august)
735 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_apian)
736 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ortel)
737 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_bacon)
738 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_bipc)
739 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_boggs)
740 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_bonne)
741 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_cass)
742 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_cc)
743 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_cea)
744 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_chamb)
745 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_collg)
746 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_crast)
747 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_denoy)
748 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck1)
749 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck2)
750 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck3)
751 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp1)
752 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag6)
753 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_kav7)
754 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck4)
755 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck5)
756 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eqc)
757 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eqdc)
758 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_etmerc)
759 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_utm)
760 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_fahey)
761 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_fouc_s)
762 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gall)
763 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_geocent)
764 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_geos)
765 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gins8)
766 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gn_sinu)
767 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_sinu)
768 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck6)
769 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbtfps)
770 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gnom)
771 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_goode)
772 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gstmerc)
773 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_hammer)
774 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_hatano)
775 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_healpix)
776 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_rhealpix)
777 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_igh)
778 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_imw_p)
779 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_isea)
780 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_krovak)
781 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_labrd)
782 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_laea)
783 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lagrng)
784 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_larr)
785 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lask)
786 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lonlat)
787 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_latlon)
788 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_latlong)
789 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_longlat)
790 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lcc)
791 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lcca)
792 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_loxim)
793 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lsat)
794 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbt_fps)
795 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbtfpp)
796 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbtfpq)
797 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_merc)
798 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mill)
799 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mil_os)
800 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lee_os)
801 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gs48)
802 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_alsk)
803 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gs50)
804 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_moll)
805 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag4)
806 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag5)
807 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_natearth)
808 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nell)
809 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nell_h)
810 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nicol)
811 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nsper)
812 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tpers)
813 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nzmg)
814 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ob_tran)
815 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ocea)
816 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_oea)
817 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_omerc)
818 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ortho)
819 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_poly)
820 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp2)
821 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp3)
822 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp3p)
823 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp4p)
824 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_weren)
825 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp5)
826 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp5p)
827 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp6)
828 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp6p)
829 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_qsc)
830 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_robin)
831 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_rouss)
832 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_rpoly)
833 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_euler)
834 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_murd1)
835 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_murd2)
836 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_murd3)
837 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_pconic)
838 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tissot)
839 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vitk1)
840 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_somerc)
841 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_stere)
842 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ups)
843 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_sterea)
844 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_kav5)
845 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_qua_aut)
846 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_fouc)
847 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbt_s)
848 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tcc)
849 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tcea)
850 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tmerc)
851 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tpeqd)
852 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_urm5)
853 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_urmfps)
854 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag1)
855 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg)
856 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg2)
857 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg3)
858 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg4)
859 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag2)
860 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag3)
861 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag7)
862 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wink1)
863 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wink2)
864 
865 template <typename S>
866 struct sweep_traits
867 {
868     static const bool is_specialized = false;
869     typedef void type;
870 };
871 
872 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(NAME) \
873 template <> \
874 struct sweep_traits<spar::NAME> \
875 { \
876     static const bool is_specialized = true; \
877     typedef spar::NAME type; \
878 };
879 
880 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(sweep_x)
881 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(sweep_y)
882 
883 template <typename S>
884 struct units_traits
885 {
886     static const bool is_specialized = false;
887     typedef void type;
888 };
889 
890 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(NAME) \
891 template <> \
892 struct units_traits<spar::NAME> \
893 { \
894     static const bool is_specialized = true; \
895     typedef spar::NAME type; \
896     static const srs::dpar::value_units id = dpar::NAME; \
897 };
898 
899 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_km)
900 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_m)
901 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_dm)
902 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_cm)
903 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_mm)
904 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_kmi)
905 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_in)
906 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ft)
907 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_yd)
908 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_mi)
909 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_fath)
910 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ch)
911 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_link)
912 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_in)
913 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_ft)
914 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_yd)
915 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_ch)
916 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_mi)
917 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ind_yd)
918 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ind_ft)
919 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ind_ch)
920 
921 
922 template <typename T, template <typename> class Param>
923 struct is_same_t : std::false_type {};
924 template <typename T, template <typename> class Param>
925 struct is_same_t<Param<T>, Param> : std::true_type {};
926 
927 template <typename T, template <int> class Param>
928 struct is_same_i : std::false_type {};
929 template <int I, template <int> class Param>
930 struct is_same_i<Param<I>, Param> : std::true_type {};
931 
932 template <typename T, template <typename> class Traits>
933 struct it_traits_specialized
934     : std::integral_constant
935         <
936             bool,
937             Traits<T>::is_specialized
938         >
939 {};
940 
941 template <typename Param>
942 struct is_param
943 {
944     template <typename T>
945     struct pred : std::is_same<T, Param> {};
946 };
947 
948 template <template <typename> class Param>
949 struct is_param_t
950 {
951     template <typename T>
952     struct pred : is_same_t<T, Param> {};
953 };
954 
955 template <template <int> class Param>
956 struct is_param_i
957 {
958     template <typename T>
959     struct pred : is_same_i<T, Param> {};
960 };
961 
962 template <template <typename> class Traits>
963 struct is_param_tr
964 {
965     template <typename T>
966     struct pred : it_traits_specialized<T, Traits> {};
967 };
968 
969 // pick proj static name
970 
971 template <typename Tuple>
972 struct pick_proj_tag
973 {
974     typedef typename geometry::tuples::find_if
975         <
976             Tuple,
977             is_param_tr<proj_traits>::pred
978         >::type proj_type;
979 
980     static const bool is_found = geometry::tuples::is_found<proj_type>::value;
981 
982     BOOST_GEOMETRY_STATIC_ASSERT((is_found), "Projection not named.", Tuple);
983 
984     typedef proj_traits<proj_type> traits_type;
985     typedef typename traits_type::type type;
986 };
987 
988 template <typename Tuple>
989 struct pick_o_proj_tag
990 {
991     typedef typename geometry::tuples::find_if
992         <
993             Tuple,
994             is_param_t<o_proj>::pred
995         >::type o_proj_type;
996 
997     static const bool is_found = geometry::tuples::is_found<o_proj_type>::value;
998 
999     BOOST_GEOMETRY_STATIC_ASSERT((is_found), "Expected o_proj parameter.", Tuple);
1000 
1001     typedef proj_traits<typename o_proj_type::type> traits_type;
1002     typedef typename traits_type::type type;
1003 };
1004 
1005 
1006 } // namespace detail
1007 #endif // DOXYGEN_NO_DETAIL
1008 
1009 } // namespace spar
1010 
1011 }}} // namespace boost::geometry::srs
1012 
1013 
1014 #endif // BOOST_GEOMETRY_SRS_PROJECTIONS_SPAR_HPP
1015