3 // Copyright (c) 2017-2018, Oracle and/or its affiliates.
4 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
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)
10 #ifndef BOOST_GEOMETRY_SRS_PROJECTIONS_SPAR_HPP
11 #define BOOST_GEOMETRY_SRS_PROJECTIONS_SPAR_HPP
14 #include <boost/geometry/core/radius.hpp>
15 #include <boost/geometry/core/tag.hpp>
16 #include <boost/geometry/core/tags.hpp>
18 #include <boost/geometry/srs/projections/impl/pj_datums.hpp>
19 #include <boost/geometry/srs/projections/impl/pj_ellps.hpp>
20 #include <boost/geometry/srs/projections/dpar.hpp>
21 #include <boost/geometry/srs/projections/par_data.hpp>
22 #include <boost/geometry/srs/sphere.hpp>
23 #include <boost/geometry/srs/spheroid.hpp>
25 // TODO: move this functionality
26 #include <boost/geometry/index/detail/tuples.hpp>
28 #include <boost/mpl/assert.hpp>
29 #include <boost/mpl/if.hpp>
30 #include <boost/mpl/or.hpp>
31 #include <boost/mpl/not.hpp>
32 #include <boost/tuple/tuple.hpp>
33 #include <boost/variant/variant.hpp>
34 #include <boost/type_traits/integral_constant.hpp>
35 #include <boost/type_traits/is_same.hpp>
36 #include <boost/type_traits/is_void.hpp>
41 namespace boost { namespace geometry { namespace srs
47 // Static parameters holder
49 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX \
50 typename P0, typename P1, typename P2, typename P3, typename P4, \
51 typename P5, typename P6, typename P7, typename P8, typename P9, \
52 typename P10, typename P11, typename P12, typename P13, typename P14
54 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX \
55 P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14
57 #ifndef DOXYGEN_NO_DETAIL
61 template <BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
62 struct map_params_to_cons
64 typedef boost::tuples::cons
67 typename map_params_to_cons
69 P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14,
70 boost::tuples::null_type
76 struct map_params_to_cons
78 boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
79 boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
80 boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type
83 typedef boost::tuples::null_type type;
87 #endif // DOXYGEN_NO_DETAIL
92 typename P0 = boost::tuples::null_type,
93 typename P1 = boost::tuples::null_type,
94 typename P2 = boost::tuples::null_type,
95 typename P3 = boost::tuples::null_type,
96 typename P4 = boost::tuples::null_type,
97 typename P5 = boost::tuples::null_type,
98 typename P6 = boost::tuples::null_type,
99 typename P7 = boost::tuples::null_type,
100 typename P8 = boost::tuples::null_type,
101 typename P9 = boost::tuples::null_type,
102 typename P10 = boost::tuples::null_type,
103 typename P11 = boost::tuples::null_type,
104 typename P12 = boost::tuples::null_type,
105 typename P13 = boost::tuples::null_type,
106 typename P14 = boost::tuples::null_type
109 : detail::map_params_to_cons<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>::type
112 typedef typename detail::map_params_to_cons<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>::type base_type;
115 typedef typename base_type::tail_type tail_type;
121 explicit parameters(P0 const& p0)
122 : base_type(p0, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
125 parameters(P0 const& p0, P1 const& p1)
126 : base_type(p0, p1, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
129 parameters(P0 const& p0, P1 const& p1, P2 const& p2)
130 : base_type(p0, p1, p2, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
133 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3)
134 : base_type(p0, p1, p2, p3, cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
137 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4)
138 : base_type(p0, p1, p2, p3, p4, cnull(), cnull(), cnull(), cnull(), cnull())
141 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5)
142 : base_type(p0, p1, p2, p3, p4, p5, cnull(), cnull(), cnull(), cnull())
145 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6)
146 : base_type(p0, p1, p2, p3, p4, p5, p6, cnull(), cnull(), cnull())
149 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6, P7 const& p7)
150 : base_type(p0, p1, p2, p3, p4, p5, p6, p7, cnull(), cnull())
153 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6, P7 const& p7, P8 const& p8)
154 : base_type(p0, p1, p2, p3, p4, p5, p6, p7, p8, cnull())
157 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6, P7 const& p7, P8 const& p8, P9 const& p9)
158 : base_type(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
161 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6, P7 const& p7, P8 const& p8, P9 const& p9, P10 const& p10)
163 tail_type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10))
166 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6, P7 const& p7, P8 const& p8, P9 const& p9, P10 const& p10, P11 const& p11)
169 typename tail_type::tail_type(p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)))
172 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6, P7 const& p7, P8 const& p8, P9 const& p9, P10 const& p10, P11 const& p11, P12 const& p12)
175 typename tail_type::tail_type(p2,
176 typename tail_type::tail_type::tail_type(p3, p4, p5, p6, p7, p8, p9, p10, p11, p12))))
179 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6, P7 const& p7, P8 const& p8, P9 const& p9, P10 const& p10, P11 const& p11, P12 const& p12, P13 const& p13)
182 typename tail_type::tail_type(p2,
183 typename tail_type::tail_type::tail_type(p3,
184 typename tail_type::tail_type::tail_type::tail_type(p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)))))
187 parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6, P7 const& p7, P8 const& p8, P9 const& p9, P10 const& p10, P11 const& p11, P12 const& p12, P13 const& p13, P14 const& p14)
190 typename tail_type::tail_type(p2,
191 typename tail_type::tail_type::tail_type(p3,
192 typename tail_type::tail_type::tail_type::tail_type(p4,
193 typename tail_type::tail_type::tail_type::tail_type::tail_type(p5, p6, p7, p8, p9, p10, p11, p12, p13, p14))))))
197 static inline const boost::tuples::null_type cnull()
199 return boost::tuples::null_type();
204 #ifndef DOXYGEN_NO_DETAIL
208 template <typename Parameters, typename Parameter>
211 BOOST_MPL_ASSERT_MSG((false), INVALID_ARGUMENT, (Parameters));
214 // NOTE: parameters has to be convertible to tuples::cons
215 template <BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX, typename Parameter>
216 struct add_parameter<spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>, Parameter>
217 : index::detail::tuples::push_back
219 typename detail::map_params_to_cons<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>::type,
224 template <typename Head, typename Tail, typename Parameter>
225 struct add_parameter<boost::tuples::cons<Head, Tail>, Parameter>
226 : index::detail::tuples::push_back
228 boost::tuples::cons<Head, Tail>,
233 } // namespace detail
234 #endif // DOXYGEN_NO_DETAIL
237 // Static parameters values
239 struct datum_wgs84 {};
240 struct datum_ggrs87 {};
241 struct datum_nad83 {};
242 struct datum_nad27 {};
243 struct datum_potsdam {};
244 struct datum_carthage {};
245 struct datum_hermannskogel {};
246 struct datum_ire65 {};
247 struct datum_nzgd49 {};
248 struct datum_osgb36 {};
250 struct ellps_merit {};
251 struct ellps_sgs85 {};
252 struct ellps_grs80 {};
253 struct ellps_iau76 {};
254 struct ellps_airy {};
255 struct ellps_apl4_9 {};
256 struct ellps_nwl9d {};
257 struct ellps_mod_airy {};
258 struct ellps_andrae {};
259 struct ellps_aust_sa {};
260 struct ellps_grs67 {};
261 struct ellps_bessel {};
262 struct ellps_bess_nam {};
263 struct ellps_clrk66 {};
264 struct ellps_clrk80 {};
265 struct ellps_clrk80ign {};
267 struct ellps_delmbr {};
268 struct ellps_engelis {};
269 struct ellps_evrst30 {};
270 struct ellps_evrst48 {};
271 struct ellps_evrst56 {};
272 struct ellps_evrst69 {};
273 struct ellps_evrstss {};
274 struct ellps_fschr60 {};
275 struct ellps_fschr60m {};
276 struct ellps_fschr68 {};
277 struct ellps_helmert {};
278 struct ellps_hough {};
279 struct ellps_intl {};
280 struct ellps_krass {};
281 struct ellps_kaula {};
282 struct ellps_lerch {};
283 struct ellps_mprts {};
284 struct ellps_new_intl {};
285 struct ellps_plessis {};
286 struct ellps_seasia {};
287 struct ellps_walbeck {};
288 struct ellps_wgs60 {};
289 struct ellps_wgs66 {};
290 struct ellps_wgs72 {};
291 struct ellps_wgs84 {};
292 struct ellps_sphere {};
294 struct mode_plane {};
299 struct orient_isea {};
300 struct orient_pole {};
302 struct pm_greenwich {};
309 struct pm_jakarta {};
311 struct pm_brussels {};
312 struct pm_stockholm {};
316 struct proj_aea {}; struct proj_leac {}; // Albers Equal Area, Lambert Equal Area Conic
317 struct proj_aeqd {}; // Azimuthal Equidistant
318 struct proj_airy {}; // Airy
319 struct proj_aitoff {}; struct proj_wintri {}; // Aitoff, Winkel Tripel
320 struct proj_august {};
321 struct proj_apian {}; struct proj_ortel {}; struct proj_bacon {};
323 struct proj_boggs {};
324 struct proj_bonne {};
328 struct proj_chamb {};
329 struct proj_collg {};
330 struct proj_crast {};
331 struct proj_denoy {};
334 struct proj_eck3 {}; struct proj_putp1 {}; struct proj_wag6 {}; struct proj_kav7 {};
339 struct proj_etmerc {}; struct proj_utm {};
340 struct proj_fahey {};
341 struct proj_fouc_s {};
343 struct proj_geocent {};
345 struct proj_gins8 {};
346 struct proj_gn_sinu {}; struct proj_sinu {}; struct proj_eck6 {}; struct proj_mbtfps {};
348 struct proj_goode {};
349 struct proj_gstmerc {};
350 struct proj_hammer {};
351 struct proj_hatano {};
352 struct proj_healpix {};
353 struct proj_rhealpix {};
355 struct proj_imw_p {};
357 struct proj_krovak {};
358 struct proj_labrd {};
360 struct proj_lagrng {};
363 struct proj_lonlat {}; struct proj_latlon {}; struct proj_latlong {}; struct proj_longlat {};
366 struct proj_loxim {};
368 struct proj_mbt_fps {};
369 struct proj_mbtfpp {};
370 struct proj_mbtfpq {};
373 struct proj_mil_os {}; struct proj_lee_os {}; struct proj_gs48 {}; struct proj_alsk {}; struct proj_gs50 {};
374 struct proj_moll {}; struct proj_wag4 {}; struct proj_wag5 {};
375 struct proj_natearth {};
377 struct proj_nell_h {};
378 struct proj_nicol {};
379 struct proj_nsper {}; struct proj_tpers {};
381 struct proj_ob_tran {};
384 struct proj_omerc {};
385 struct proj_ortho {};
387 struct proj_putp2 {};
388 struct proj_putp3 {}; struct proj_putp3p {};
389 struct proj_putp4p {}; struct proj_weren {};
390 struct proj_putp5 {}; struct proj_putp5p {};
391 struct proj_putp6 {}; struct proj_putp6p {};
393 struct proj_robin {};
394 struct proj_rouss {};
395 struct proj_rpoly {};
396 struct proj_euler {}; struct proj_murd1 {}; struct proj_murd2 {}; struct proj_murd3 {}; struct proj_pconic {}; struct proj_tissot {}; struct proj_vitk1 {};
397 struct proj_somerc {};
398 struct proj_stere {}; struct proj_ups {};
399 struct proj_sterea {};
400 struct proj_kav5 {}; struct proj_qua_aut {}; struct proj_fouc {}; struct proj_mbt_s {};
403 struct proj_tmerc {};
404 struct proj_tpeqd {};
406 struct proj_urmfps {}; struct proj_wag1 {};
407 struct proj_vandg {};
408 struct proj_vandg2 {}; struct proj_vandg3 {};
409 struct proj_vandg4 {};
413 struct proj_wink1 {};
414 struct proj_wink2 {};
429 struct units_fath {};
431 struct units_link {};
432 struct units_us_in {};
433 struct units_us_ft {};
434 struct units_us_yd {};
435 struct units_us_ch {};
436 struct units_us_mi {};
437 struct units_ind_yd {};
438 struct units_ind_ft {};
439 struct units_ind_ch {};
441 // Static parameters names
443 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(NAME) \
444 template <typename T = double> \
447 NAME() : value(0) {} \
448 explicit NAME(T const& v) : value(v) {} \
452 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(a)
453 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(b)
454 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(e)
455 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(es)
456 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(f)
457 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(gamma)
458 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(h)
459 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(k)
460 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(k_0)
461 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(m)
462 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(n)
463 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(q)
464 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(r)
465 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(rf)
466 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(to_meter)
467 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(vto_meter)
468 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(w)
469 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(x_0)
470 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(y_0)
472 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(NAME) \
473 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(NAME)
475 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(alpha)
476 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(azi)
477 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_0)
478 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_1)
479 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_2)
480 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_b)
481 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_ts)
482 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_0)
483 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_1)
484 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_2)
485 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_wrap)
486 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lonc)
487 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_alpha)
488 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_1)
489 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_2)
490 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_c)
491 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_p)
492 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_1)
493 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_2)
494 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_c)
495 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_p)
496 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(pm)
497 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(r_lat_a)
498 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(r_lat_g)
499 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(theta)
500 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(tilt)
502 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(NAME) \
503 template <int I> struct NAME { static const int value = I; };
505 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(aperture)
506 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(lsat)
507 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(north_square)
508 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(path)
509 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(resolution)
510 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(south_square)
511 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(zone)
513 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(NAME) \
516 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(czech)
517 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(geoc)
518 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(guam)
519 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(no_cut)
520 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(no_defs)
521 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(no_rot)
522 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(ns)
523 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(over)
524 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_a)
525 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_au)
526 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_g)
527 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_h)
528 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_v)
529 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(rescale)
530 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(south)
534 typename SpheroidOrSphere
538 typedef SpheroidOrSphere model_type;
541 explicit ellps(SpheroidOrSphere const& sph) : model(sph) {}
543 SpheroidOrSphere model;
547 : srs::detail::nadgrids
549 typedef srs::detail::nadgrids base_t;
550 nadgrids(std::string const& g0) : base_t(g0) {}
551 nadgrids(std::string const& g0, std::string const& g1) : base_t(g0, g1) {}
552 nadgrids(std::string const& g0, std::string const& g1, std::string const& g2) : base_t(g0, g1, g2) {}
553 nadgrids(std::string const& g0, std::string const& g1, std::string const& g2, std::string const& g3) : base_t(g0, g1, g2, g3) {}
554 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) {}
555 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
556 nadgrids(std::initializer_list<std::string> l) : base_t(l) {}
560 template <typename Proj>
566 template <typename T = double>
568 : srs::detail::towgs84<T>
570 typedef srs::detail::towgs84<T> base_t;
572 towgs84(T const& v0, T const& v1, T const& v2)
575 towgs84(T const& v0, T const& v1, T const& v2, T const& v3, T const& v4, T const& v5, T const& v6)
576 : base_t(v0, v1, v2, v3, v4, v5, v6)
578 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
579 towgs84(std::initializer_list<T> l) : base_t(l) {}
583 template <typename Units>
589 // Static parameters traits
591 #ifndef DOXYGEN_NO_DETAIL
595 template <typename D>
598 static const bool is_specialized = false;
599 typedef void ellps_type;
600 typedef void def_type;
603 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(NAME, ELLPS, DEF_T, DEF_V) \
605 struct datum_traits<spar::NAME> \
607 static const bool is_specialized = true; \
608 typedef spar::ELLPS ellps_type; \
609 typedef spar::DEF_T def_type; \
610 static spar::DEF_T def() { return spar::DEF_T DEF_V; } \
611 static const dpar::value_datum id = dpar::NAME; \
614 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_wgs84, ellps_wgs84, towgs84<double>, (0,0,0))
615 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_ggrs87, ellps_grs80, towgs84<double>, (-199.87,74.79,246.62))
616 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_nad83, ellps_grs80, towgs84<double>, (0,0,0))
617 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_nad27, ellps_clrk66, nadgrids, ("@conus","@alaska","@ntv2_0.gsb","@ntv1_can.dat"))
618 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))
619 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_carthage, ellps_clrk80ign, towgs84<double>, (-263.0,6.0,431.0))
620 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))
621 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))
622 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))
623 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))
626 template <typename E>
629 static const bool is_specialized = false;
630 template <typename T> struct model_type
636 template <typename E>
637 struct ellps_traits<spar::ellps<E> >
639 static const bool is_specialized = true;
640 template <typename T> struct model_type
642 // TODO: transform to spheroid<T> or sphere<T>
643 typedef typename spar::ellps<E>::model_type type;
646 template <typename T>
647 static typename spar::ellps<E>::model_type const& model(spar::ellps<E> const& e)
653 // TODO: Implement as RadiusType-agnostic, member struct template defining model
654 // and function template returning it
655 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(NAME) \
657 struct ellps_traits<spar::NAME> \
659 static const bool is_specialized = true; \
660 template <typename T> struct model_type \
662 typedef srs::spheroid<T> type; \
664 template <typename T> \
665 static srs::spheroid<T> model(spar::NAME const&) { \
666 return srs::spheroid<T>(projections::detail::pj_get_ellps<T>().first[dpar::NAME].a, \
667 projections::detail::pj_get_ellps<T>().first[dpar::NAME].b); \
671 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SPHERE(NAME) \
673 struct ellps_traits<spar::NAME> \
675 static const bool is_specialized = true; \
676 template <typename T> struct model_type \
678 typedef srs::sphere<T> type; \
680 template <typename T> \
681 static srs::sphere<T> model(spar::NAME const&) { \
682 return srs::sphere<T>(projections::detail::pj_get_ellps<T>().first[dpar::NAME].a); \
686 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_merit)
687 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_sgs85)
688 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_grs80)
689 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_iau76)
690 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_airy)
691 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_apl4_9)
692 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_nwl9d)
693 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_mod_airy)
694 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_andrae)
695 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_aust_sa)
696 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_grs67)
697 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_bessel)
698 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_bess_nam)
699 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_clrk66)
700 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_clrk80)
701 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_clrk80ign)
702 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_cpm)
703 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_delmbr)
704 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_engelis)
705 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst30)
706 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst48)
707 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst56)
708 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst69)
709 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrstss)
710 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_fschr60)
711 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_fschr60m)
712 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_fschr68)
713 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_helmert)
714 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_hough)
715 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_intl)
716 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_krass)
717 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_kaula)
718 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_lerch)
719 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_mprts)
720 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_new_intl)
721 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_plessis)
722 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_seasia)
723 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_walbeck)
724 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs60)
725 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs66)
726 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs72)
727 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs84)
728 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SPHERE(ellps_sphere)
730 template <typename M>
733 static const bool is_specialized = false;
737 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(NAME) \
739 struct mode_traits<spar::NAME> \
741 static const bool is_specialized = true; \
742 typedef spar::NAME type; \
745 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_plane)
746 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_di)
747 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_dd)
748 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_hex)
750 template <typename O>
753 static const bool is_specialized = false;
757 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(NAME) \
759 struct orient_traits<spar::NAME> \
761 static const bool is_specialized = true; \
762 typedef spar::NAME type; \
765 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(orient_isea)
766 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(orient_pole)
768 template <typename M>
771 static const bool is_specialized = false;
775 template <typename T>
776 struct pm_traits<spar::pm<T> >
778 static const bool is_specialized = true;
780 static T const& value(spar::pm<T> const& p) { return p.value; }
783 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(NAME, INDEX) \
785 struct pm_traits<spar::NAME> \
787 static const bool is_specialized = true; \
788 typedef double type; \
789 static double value(spar::NAME const& ) { return projections::detail::pj_prime_meridians[INDEX].deg; } \
792 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_greenwich, 0)
793 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_lisbon, 1)
794 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_paris, 2)
795 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_bogota, 3)
796 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_madrid, 4)
797 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_rome, 5)
798 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_bern, 6)
799 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_jakarta, 7)
800 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_ferro, 8)
801 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_brussels, 9)
802 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_stockholm, 10)
803 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_athens, 11)
804 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_oslo, 12)
806 template <typename P>
809 static const bool is_specialized = false;
813 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(NAME) \
815 struct proj_traits<spar::NAME> \
817 static const bool is_specialized = true; \
818 typedef spar::NAME type; \
819 static const srs::dpar::value_proj id = dpar::NAME; \
822 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_aea)
823 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_leac)
824 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_aeqd)
825 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_airy)
826 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_aitoff)
827 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wintri)
828 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_august)
829 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_apian)
830 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ortel)
831 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_bacon)
832 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_bipc)
833 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_boggs)
834 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_bonne)
835 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_cass)
836 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_cc)
837 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_cea)
838 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_chamb)
839 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_collg)
840 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_crast)
841 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_denoy)
842 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck1)
843 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck2)
844 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck3)
845 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp1)
846 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag6)
847 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_kav7)
848 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck4)
849 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck5)
850 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eqc)
851 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eqdc)
852 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_etmerc)
853 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_utm)
854 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_fahey)
855 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_fouc_s)
856 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gall)
857 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_geocent)
858 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_geos)
859 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gins8)
860 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gn_sinu)
861 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_sinu)
862 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck6)
863 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbtfps)
864 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gnom)
865 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_goode)
866 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gstmerc)
867 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_hammer)
868 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_hatano)
869 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_healpix)
870 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_rhealpix)
871 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_igh)
872 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_imw_p)
873 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_isea)
874 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_krovak)
875 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_labrd)
876 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_laea)
877 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lagrng)
878 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_larr)
879 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lask)
880 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lonlat)
881 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_latlon)
882 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_latlong)
883 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_longlat)
884 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lcc)
885 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lcca)
886 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_loxim)
887 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lsat)
888 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbt_fps)
889 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbtfpp)
890 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbtfpq)
891 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_merc)
892 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mill)
893 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mil_os)
894 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lee_os)
895 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gs48)
896 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_alsk)
897 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gs50)
898 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_moll)
899 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag4)
900 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag5)
901 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_natearth)
902 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nell)
903 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nell_h)
904 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nicol)
905 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nsper)
906 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tpers)
907 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nzmg)
908 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ob_tran)
909 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ocea)
910 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_oea)
911 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_omerc)
912 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ortho)
913 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_poly)
914 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp2)
915 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp3)
916 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp3p)
917 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp4p)
918 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_weren)
919 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp5)
920 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp5p)
921 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp6)
922 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp6p)
923 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_qsc)
924 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_robin)
925 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_rouss)
926 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_rpoly)
927 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_euler)
928 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_murd1)
929 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_murd2)
930 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_murd3)
931 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_pconic)
932 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tissot)
933 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vitk1)
934 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_somerc)
935 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_stere)
936 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ups)
937 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_sterea)
938 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_kav5)
939 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_qua_aut)
940 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_fouc)
941 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbt_s)
942 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tcc)
943 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tcea)
944 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tmerc)
945 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tpeqd)
946 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_urm5)
947 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_urmfps)
948 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag1)
949 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg)
950 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg2)
951 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg3)
952 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg4)
953 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag2)
954 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag3)
955 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag7)
956 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wink1)
957 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wink2)
959 template <typename S>
962 static const bool is_specialized = false;
966 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(NAME) \
968 struct sweep_traits<spar::NAME> \
970 static const bool is_specialized = true; \
971 typedef spar::NAME type; \
974 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(sweep_x)
975 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(sweep_y)
977 template <typename S>
980 static const bool is_specialized = false;
984 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(NAME) \
986 struct units_traits<spar::NAME> \
988 static const bool is_specialized = true; \
989 typedef spar::NAME type; \
990 static const srs::dpar::value_units id = dpar::NAME; \
993 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_km)
994 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_m)
995 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_dm)
996 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_cm)
997 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_mm)
998 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_kmi)
999 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_in)
1000 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ft)
1001 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_yd)
1002 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_mi)
1003 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_fath)
1004 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ch)
1005 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_link)
1006 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_in)
1007 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_ft)
1008 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_yd)
1009 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_ch)
1010 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_mi)
1011 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ind_yd)
1012 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ind_ft)
1013 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ind_ch)
1019 template <typename> class IsSamePred,
1021 int N = boost::tuples::length<Tuple>::value
1023 struct tuples_find_index_if
1026 IsSamePred<typename boost::tuples::element<I, Tuple>::type>::value,
1027 boost::integral_constant<int, I>,
1028 typename tuples_find_index_if<Tuple, IsSamePred, I+1, N>::type
1035 template <typename> class IsSamePred,
1038 struct tuples_find_index_if<Tuple, IsSamePred, N, N>
1039 : boost::integral_constant<int, N>
1045 template <typename> class IsSamePred,
1046 int I = tuples_find_index_if<Tuple, IsSamePred>::value,
1047 int N = boost::tuples::length<Tuple>::value
1049 struct tuples_find_if
1050 : boost::tuples::element<I, Tuple>
1056 template <typename> class IsSamePred,
1059 struct tuples_find_if<Tuple, IsSamePred, N, N>
1061 typedef boost::tuples::null_type type;
1064 template <typename T>
1065 struct tuples_is_found
1066 : boost::mpl::not_<boost::is_same<T, boost::tuples::null_type> >
1069 template <typename T>
1070 struct tuples_is_not_found
1071 : boost::is_same<T, boost::tuples::null_type>
1074 template <typename Tuple, template <typename> class IsSamePred>
1075 struct tuples_exists_if
1078 typename tuples_find_if<Tuple, IsSamePred>::type
1083 template <typename T, template <typename> class Param>
1084 struct is_same_t : boost::false_type {};
1085 template <typename T, template <typename> class Param>
1086 struct is_same_t<Param<T>, Param> : boost::true_type {};
1088 template <typename T, template <int> class Param>
1089 struct is_same_i : boost::false_type {};
1090 template <int I, template <int> class Param>
1091 struct is_same_i<Param<I>, Param> : boost::true_type {};
1093 template <typename T, template <typename> class Traits>
1094 struct it_traits_specialized
1097 Traits<T>::is_specialized,
1103 template <typename Param>
1106 template <typename T>
1107 struct pred : boost::is_same<T, Param> {};
1110 template <template <typename> class Param>
1113 template <typename T>
1114 struct pred : is_same_t<T, Param> {};
1117 template <template <int> class Param>
1120 template <typename T>
1121 struct pred : is_same_i<T, Param> {};
1124 template <template <typename> class Traits>
1127 template <typename T>
1128 struct pred : it_traits_specialized<T, Traits> {};
1131 //template <typename IsParam1, typename IsParam2>
1132 //struct is_param_or
1134 // template <typename T>
1135 // struct pred : boost::mpl::or_<IsParam1::pred<T>, IsParam2::pred<T> > {};
1138 // pick proj static name
1140 template <typename Tuple>
1141 struct pick_proj_tag
1143 typedef typename tuples_find_if
1146 is_param_tr<proj_traits>::pred
1149 static const bool is_found = tuples_is_found<proj_type>::value;
1151 BOOST_MPL_ASSERT_MSG((is_found), PROJECTION_NOT_NAMED, (Tuple));
1153 typedef proj_traits<proj_type> traits_type;
1154 typedef typename traits_type::type type;
1157 template <typename Tuple>
1158 struct pick_o_proj_tag
1160 typedef typename tuples_find_if
1163 is_param_t<o_proj>::pred
1164 >::type o_proj_type;
1166 static const bool is_found = tuples_is_found<o_proj_type>::value;
1168 BOOST_MPL_ASSERT_MSG((is_found), NO_O_PROJ_PARAMETER, (Tuple));
1170 typedef proj_traits<typename o_proj_type::type> traits_type;
1171 typedef typename traits_type::type type;
1175 } // namespace detail
1176 #endif // DOXYGEN_NO_DETAIL
1180 }}} // namespace boost::geometry::srs
1183 #endif // BOOST_GEOMETRY_SRS_PROJECTIONS_SPAR_HPP