• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry
2 
3 // Copyright (c) 2017-2019, 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 <boost/geometry/core/radius.hpp>
15 #include <boost/geometry/core/tag.hpp>
16 #include <boost/geometry/core/tags.hpp>
17 
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>
24 
25 #include <boost/geometry/util/tuples.hpp>
26 
27 #include <boost/mpl/assert.hpp>
28 #include <boost/mpl/if.hpp>
29 #include <boost/mpl/or.hpp>
30 #include <boost/mpl/not.hpp>
31 #include <boost/tuple/tuple.hpp>
32 #include <boost/variant/variant.hpp>
33 #include <boost/type_traits/is_same.hpp>
34 
35 #include <string>
36 #include <vector>
37 
38 namespace boost { namespace geometry { namespace srs
39 {
40 
41 namespace spar
42 {
43 
44 // Static parameters holder
45 
46 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX \
47 typename P0, typename P1, typename P2, typename P3, typename P4, \
48 typename P5, typename P6, typename P7, typename P8, typename P9, \
49 typename P10, typename P11, typename P12, typename P13, typename P14
50 
51 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX \
52 P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14
53 
54 #ifndef DOXYGEN_NO_DETAIL
55 namespace detail
56 {
57 
58 template <BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
59 struct map_params_to_cons
60 {
61   typedef boost::tuples::cons
62     <
63         P0,
64         typename map_params_to_cons
65             <
66                 P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14,
67                 boost::tuples::null_type
68             >::type
69     > type;
70 };
71 
72 template <>
73 struct map_params_to_cons
74 <
75     boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
76     boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
77     boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type
78 >
79 {
80   typedef boost::tuples::null_type type;
81 };
82 
83 } // namespace detail
84 #endif // DOXYGEN_NO_DETAIL
85 
86 template
87 <
88     // null_type -> void?
89     typename P0 = boost::tuples::null_type,
90     typename P1 = boost::tuples::null_type,
91     typename P2 = boost::tuples::null_type,
92     typename P3 = boost::tuples::null_type,
93     typename P4 = boost::tuples::null_type,
94     typename P5 = boost::tuples::null_type,
95     typename P6 = boost::tuples::null_type,
96     typename P7 = boost::tuples::null_type,
97     typename P8 = boost::tuples::null_type,
98     typename P9 = boost::tuples::null_type,
99     typename P10 = boost::tuples::null_type,
100     typename P11 = boost::tuples::null_type,
101     typename P12 = boost::tuples::null_type,
102     typename P13 = boost::tuples::null_type,
103     typename P14 = boost::tuples::null_type
104 >
105 struct parameters
106     : detail::map_params_to_cons<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>::type
107 {
108 private:
109     typedef typename detail::map_params_to_cons<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>::type base_type;
110 
111 public:
112     typedef typename base_type::tail_type tail_type;
113 
parametersboost::geometry::srs::spar::parameters114     parameters()
115         : base_type()
116     {}
117 
parametersboost::geometry::srs::spar::parameters118     explicit parameters(P0 const& p0)
119         : base_type(p0, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
120     {}
121 
parametersboost::geometry::srs::spar::parameters122     parameters(P0 const& p0, P1 const& p1)
123         : base_type(p0, p1, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
124     {}
125 
parametersboost::geometry::srs::spar::parameters126     parameters(P0 const& p0, P1 const& p1, P2 const& p2)
127         : base_type(p0, p1, p2, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
128     {}
129 
parametersboost::geometry::srs::spar::parameters130     parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3)
131         : base_type(p0, p1, p2, p3, cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
132     {}
133 
parametersboost::geometry::srs::spar::parameters134     parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4)
135         : base_type(p0, p1, p2, p3, p4, cnull(), cnull(), cnull(), cnull(), cnull())
136     {}
137 
parametersboost::geometry::srs::spar::parameters138     parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5)
139         : base_type(p0, p1, p2, p3, p4, p5, cnull(), cnull(), cnull(), cnull())
140     {}
141 
parametersboost::geometry::srs::spar::parameters142     parameters(P0 const& p0, P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4, P5 const& p5, P6 const& p6)
143         : base_type(p0, p1, p2, p3, p4, p5, p6, cnull(), cnull(), cnull())
144     {}
145 
parametersboost::geometry::srs::spar::parameters146     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)
147         : base_type(p0, p1, p2, p3, p4, p5, p6, p7, cnull(), cnull())
148     {}
149 
parametersboost::geometry::srs::spar::parameters150     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)
151         : base_type(p0, p1, p2, p3, p4, p5, p6, p7, p8, cnull())
152     {}
153 
parametersboost::geometry::srs::spar::parameters154     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)
155         : base_type(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
156     {}
157 
parametersboost::geometry::srs::spar::parameters158     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)
159         : base_type(p0,
160             tail_type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10))
161     {}
162 
parametersboost::geometry::srs::spar::parameters163     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)
164         : base_type(p0,
165             tail_type(p1,
166                 typename tail_type::tail_type(p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)))
167     {}
168 
parametersboost::geometry::srs::spar::parameters169     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)
170         : base_type(p0,
171             tail_type(p1,
172                 typename tail_type::tail_type(p2,
173                     typename tail_type::tail_type::tail_type(p3, p4, p5, p6, p7, p8, p9, p10, p11, p12))))
174     {}
175 
parametersboost::geometry::srs::spar::parameters176     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)
177         : base_type(p0,
178             tail_type(p1,
179                 typename tail_type::tail_type(p2,
180                     typename tail_type::tail_type::tail_type(p3,
181                         typename tail_type::tail_type::tail_type::tail_type(p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)))))
182     {}
183 
parametersboost::geometry::srs::spar::parameters184     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)
185         : base_type(p0,
186             tail_type(p1,
187                 typename tail_type::tail_type(p2,
188                     typename tail_type::tail_type::tail_type(p3,
189                         typename tail_type::tail_type::tail_type::tail_type(p4,
190                             typename tail_type::tail_type::tail_type::tail_type::tail_type(p5, p6, p7, p8, p9, p10, p11, p12, p13, p14))))))
191     {}
192 
193 private:
cnullboost::geometry::srs::spar::parameters194     static inline const boost::tuples::null_type cnull()
195     {
196         return boost::tuples::null_type();
197     }
198 };
199 
200 
201 #ifndef DOXYGEN_NO_DETAIL
202 namespace detail
203 {
204 
205 template <typename Parameters, typename Parameter>
206 struct add_parameter
207 {
208     BOOST_MPL_ASSERT_MSG((false), INVALID_ARGUMENT, (Parameters));
209 };
210 
211 // NOTE: parameters has to be convertible to tuples::cons
212 template <BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX, typename Parameter>
213 struct add_parameter<spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>, Parameter>
214     : geometry::tuples::push_back
215         <
216             typename detail::map_params_to_cons<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>::type,
217             Parameter
218         >
219 {};
220 
221 template <typename Head, typename Tail, typename Parameter>
222 struct add_parameter<boost::tuples::cons<Head, Tail>, Parameter>
223     : geometry::tuples::push_back
224         <
225             boost::tuples::cons<Head, Tail>,
226             Parameter
227         >
228 {};
229 
230 } // namespace detail
231 #endif // DOXYGEN_NO_DETAIL
232 
233 
234 // Static parameters values
235 
236 struct datum_wgs84 {};
237 struct datum_ggrs87 {};
238 struct datum_nad83 {};
239 struct datum_nad27 {};
240 struct datum_potsdam {};
241 struct datum_carthage {};
242 struct datum_hermannskogel {};
243 struct datum_ire65 {};
244 struct datum_nzgd49 {};
245 struct datum_osgb36 {};
246 
247 struct ellps_merit {};
248 struct ellps_sgs85 {};
249 struct ellps_grs80 {};
250 struct ellps_iau76 {};
251 struct ellps_airy {};
252 struct ellps_apl4_9 {};
253 struct ellps_nwl9d {};
254 struct ellps_mod_airy {};
255 struct ellps_andrae {};
256 struct ellps_aust_sa {};
257 struct ellps_grs67 {};
258 struct ellps_bessel {};
259 struct ellps_bess_nam {};
260 struct ellps_clrk66 {};
261 struct ellps_clrk80 {};
262 struct ellps_clrk80ign {};
263 struct ellps_cpm {};
264 struct ellps_delmbr {};
265 struct ellps_engelis {};
266 struct ellps_evrst30 {};
267 struct ellps_evrst48 {};
268 struct ellps_evrst56 {};
269 struct ellps_evrst69 {};
270 struct ellps_evrstss {};
271 struct ellps_fschr60 {};
272 struct ellps_fschr60m {};
273 struct ellps_fschr68 {};
274 struct ellps_helmert {};
275 struct ellps_hough {};
276 struct ellps_intl {};
277 struct ellps_krass {};
278 struct ellps_kaula {};
279 struct ellps_lerch {};
280 struct ellps_mprts {};
281 struct ellps_new_intl {};
282 struct ellps_plessis {};
283 struct ellps_seasia {};
284 struct ellps_walbeck {};
285 struct ellps_wgs60 {};
286 struct ellps_wgs66 {};
287 struct ellps_wgs72 {};
288 struct ellps_wgs84 {};
289 struct ellps_sphere {};
290 
291 struct mode_plane {};
292 struct mode_di {};
293 struct mode_dd {};
294 struct mode_hex {};
295 
296 struct orient_isea {};
297 struct orient_pole {};
298 
299 struct pm_greenwich {};
300 struct pm_lisbon {};
301 struct pm_paris {};
302 struct pm_bogota {};
303 struct pm_madrid {};
304 struct pm_rome {};
305 struct pm_bern {};
306 struct pm_jakarta {};
307 struct pm_ferro {};
308 struct pm_brussels {};
309 struct pm_stockholm {};
310 struct pm_athens {};
311 struct pm_oslo {};
312 
313 struct proj_aea {}; struct proj_leac {}; // Albers Equal Area, Lambert Equal Area Conic
314 struct proj_aeqd {}; // Azimuthal Equidistant
315 struct proj_airy {}; // Airy
316 struct proj_aitoff {}; struct proj_wintri {}; // Aitoff, Winkel Tripel
317 struct proj_august {};
318 struct proj_apian {}; struct proj_ortel {}; struct proj_bacon {};
319 struct proj_bipc {};
320 struct proj_boggs {};
321 struct proj_bonne {};
322 struct proj_cass {};
323 struct proj_cc {};
324 struct proj_cea {};
325 struct proj_chamb {};
326 struct proj_collg {};
327 struct proj_crast {};
328 struct proj_denoy {};
329 struct proj_eck1 {};
330 struct proj_eck2 {};
331 struct proj_eck3 {}; struct proj_putp1 {}; struct proj_wag6 {}; struct proj_kav7 {};
332 struct proj_eck4 {};
333 struct proj_eck5 {};
334 struct proj_eqc {};
335 struct proj_eqdc {};
336 struct proj_etmerc {}; struct proj_utm {};
337 struct proj_fahey {};
338 struct proj_fouc_s {};
339 struct proj_gall {};
340 struct proj_geocent {};
341 struct proj_geos {};
342 struct proj_gins8 {};
343 struct proj_gn_sinu {}; struct proj_sinu {}; struct proj_eck6 {}; struct proj_mbtfps {};
344 struct proj_gnom {};
345 struct proj_goode {};
346 struct proj_gstmerc {};
347 struct proj_hammer {};
348 struct proj_hatano {};
349 struct proj_healpix {};
350 struct proj_rhealpix {};
351 struct proj_igh {};
352 struct proj_imw_p {};
353 struct proj_isea {};
354 struct proj_krovak {};
355 struct proj_labrd {};
356 struct proj_laea {};
357 struct proj_lagrng {};
358 struct proj_larr {};
359 struct proj_lask {};
360 struct proj_lonlat {}; struct proj_latlon {}; struct proj_latlong {}; struct proj_longlat {};
361 struct proj_lcc {};
362 struct proj_lcca {};
363 struct proj_loxim {};
364 struct proj_lsat {};
365 struct proj_mbt_fps {};
366 struct proj_mbtfpp {};
367 struct proj_mbtfpq {};
368 struct proj_merc {};
369 struct proj_mill {};
370 struct proj_mil_os {}; struct proj_lee_os {}; struct proj_gs48 {}; struct proj_alsk {}; struct proj_gs50 {};
371 struct proj_moll {}; struct proj_wag4 {}; struct proj_wag5 {};
372 struct proj_natearth {};
373 struct proj_nell {};
374 struct proj_nell_h {};
375 struct proj_nicol {};
376 struct proj_nsper {}; struct proj_tpers {};
377 struct proj_nzmg {};
378 struct proj_ob_tran {};
379 struct proj_ocea {};
380 struct proj_oea {};
381 struct proj_omerc {};
382 struct proj_ortho {};
383 struct proj_poly {};
384 struct proj_putp2 {};
385 struct proj_putp3 {}; struct proj_putp3p {};
386 struct proj_putp4p {}; struct proj_weren {};
387 struct proj_putp5 {}; struct proj_putp5p {};
388 struct proj_putp6 {}; struct proj_putp6p {};
389 struct proj_qsc {};
390 struct proj_robin {};
391 struct proj_rouss {};
392 struct proj_rpoly {};
393 struct proj_euler {}; struct proj_murd1 {}; struct proj_murd2 {}; struct proj_murd3 {}; struct proj_pconic {}; struct proj_tissot {}; struct proj_vitk1 {};
394 struct proj_somerc {};
395 struct proj_stere {}; struct proj_ups {};
396 struct proj_sterea {};
397 struct proj_kav5 {}; struct proj_qua_aut {}; struct proj_fouc {}; struct proj_mbt_s {};
398 struct proj_tcc {};
399 struct proj_tcea {};
400 struct proj_tmerc {};
401 struct proj_tpeqd {};
402 struct proj_urm5 {};
403 struct proj_urmfps {}; struct proj_wag1 {};
404 struct proj_vandg {};
405 struct proj_vandg2 {}; struct proj_vandg3 {};
406 struct proj_vandg4 {};
407 struct proj_wag2 {};
408 struct proj_wag3 {};
409 struct proj_wag7 {};
410 struct proj_wink1 {};
411 struct proj_wink2 {};
412 
413 struct sweep_x {};
414 struct sweep_y {};
415 
416 struct units_km {};
417 struct units_m {};
418 struct units_dm {};
419 struct units_cm {};
420 struct units_mm {};
421 struct units_kmi {};
422 struct units_in {};
423 struct units_ft {};
424 struct units_yd {};
425 struct units_mi {};
426 struct units_fath {};
427 struct units_ch {};
428 struct units_link {};
429 struct units_us_in {};
430 struct units_us_ft {};
431 struct units_us_yd {};
432 struct units_us_ch {};
433 struct units_us_mi {};
434 struct units_ind_yd {};
435 struct units_ind_ft {};
436 struct units_ind_ch {};
437 
438 // Static parameters names
439 
440 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(NAME) \
441 template <typename T = double> \
442 struct NAME \
443 { \
444     NAME() : value(0) {} \
445     explicit NAME(T const& v) : value(v) {} \
446     T value; \
447 };
448 
449 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(a)
450 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(b)
451 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(e)
452 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(es)
453 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(f)
454 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(gamma)
455 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(h)
456 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(k)
457 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(k_0)
458 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(m)
459 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(n)
460 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(q)
461 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(r)
462 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(rf)
463 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(to_meter)
464 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(vto_meter)
465 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(w)
466 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(x_0)
467 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(y_0)
468 
469 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(NAME) \
470 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(NAME)
471 
472 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(alpha)
473 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(azi)
474 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_0)
475 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_1)
476 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_2)
477 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_b)
478 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lat_ts)
479 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_0)
480 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_1)
481 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_2)
482 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lon_wrap)
483 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(lonc)
484 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_alpha)
485 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_1)
486 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_2)
487 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_c)
488 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lat_p)
489 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_1)
490 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_2)
491 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_c)
492 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(o_lon_p)
493 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(pm)
494 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(r_lat_a)
495 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(r_lat_g)
496 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(theta)
497 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(tilt)
498 
499 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(NAME) \
500 template <int I> struct NAME { static const int value = I; };
501 
502 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(aperture)
503 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(lsat)
504 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(north_square)
505 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(path)
506 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(resolution)
507 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(south_square)
508 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(zone)
509 
510 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(NAME) \
511 struct NAME {};
512 
513 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(czech)
514 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(geoc)
515 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(guam)
516 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(no_cut)
517 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(no_defs)
518 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(no_rot)
519 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(ns)
520 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(over)
521 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_a)
522 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_au)
523 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_g)
524 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_h)
525 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(r_v)
526 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(rescale)
527 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(south)
528 
529 template
530 <
531     typename SpheroidOrSphere
532 >
533 struct ellps
534 {
535     typedef SpheroidOrSphere model_type;
536 
ellpsboost::geometry::srs::spar::ellps537     ellps() : model() {}
ellpsboost::geometry::srs::spar::ellps538     explicit ellps(SpheroidOrSphere const& sph) : model(sph) {}
539 
540     SpheroidOrSphere model;
541 };
542 
543 struct nadgrids
544     : srs::detail::nadgrids
545 {
546     typedef srs::detail::nadgrids base_t;
nadgridsboost::geometry::srs::spar::nadgrids547     nadgrids(std::string const& g0) : base_t(g0) {}
nadgridsboost::geometry::srs::spar::nadgrids548     nadgrids(std::string const& g0, std::string const& g1) : base_t(g0, g1) {}
nadgridsboost::geometry::srs::spar::nadgrids549     nadgrids(std::string const& g0, std::string const& g1, std::string const& g2) : base_t(g0, g1, g2) {}
nadgridsboost::geometry::srs::spar::nadgrids550     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::nadgrids551     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) {}
552 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
nadgridsboost::geometry::srs::spar::nadgrids553     nadgrids(std::initializer_list<std::string> l) : base_t(l) {}
554 #endif
555 };
556 
557 template <typename Proj>
558 struct o_proj
559 {
560     typedef Proj type;
561 };
562 
563 template <typename T = double>
564 struct towgs84
565     : srs::detail::towgs84<T>
566 {
567     typedef srs::detail::towgs84<T> base_t;
568 
towgs84boost::geometry::srs::spar::towgs84569     towgs84(T const& v0, T const& v1, T const& v2)
570         : base_t(v0, v1, v2)
571     {}
towgs84boost::geometry::srs::spar::towgs84572     towgs84(T const& v0, T const& v1, T const& v2, T const& v3, T const& v4, T const& v5, T const& v6)
573         : base_t(v0, v1, v2, v3, v4, v5, v6)
574     {}
575 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
towgs84boost::geometry::srs::spar::towgs84576     towgs84(std::initializer_list<T> l) : base_t(l) {}
577 #endif
578 };
579 
580 template <typename Units>
581 struct vunits
582 {
583     typedef Units type;
584 };
585 
586 // Static parameters traits
587 
588 #ifndef DOXYGEN_NO_DETAIL
589 namespace detail
590 {
591 
592 template <typename D>
593 struct datum_traits
594 {
595     static const bool is_specialized = false;
596     typedef void ellps_type;
597     typedef void def_type;
598 };
599 
600 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(NAME, ELLPS, DEF_T, DEF_V) \
601 template <> \
602 struct datum_traits<spar::NAME> \
603 { \
604     static const bool is_specialized = true; \
605     typedef spar::ELLPS ellps_type; \
606     typedef spar::DEF_T def_type; \
607     static spar::DEF_T def() { return spar::DEF_T DEF_V; } \
608     static const dpar::value_datum id = dpar::NAME; \
609 };
610 
611 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_wgs84, ellps_wgs84, towgs84<double>, (0,0,0))
612 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_ggrs87, ellps_grs80, towgs84<double>, (-199.87,74.79,246.62))
613 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_nad83, ellps_grs80, towgs84<double>, (0,0,0))
614 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_nad27, ellps_clrk66, nadgrids, ("@conus","@alaska","@ntv2_0.gsb","@ntv1_can.dat"))
615 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))
616 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(datum_carthage, ellps_clrk80ign, towgs84<double>, (-263.0,6.0,431.0))
617 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))
618 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))
619 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))
620 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))
621 
622 
623 template <typename E>
624 struct ellps_traits
625 {
626     static const bool is_specialized = false;
627     template <typename T> struct model_type
628     {
629         typedef void type;
630     };
631 };
632 
633 template <typename E>
634 struct ellps_traits<spar::ellps<E> >
635 {
636     static const bool is_specialized = true;
637     template <typename T> struct model_type
638     {
639         // TODO: transform to spheroid<T> or sphere<T>
640         typedef typename spar::ellps<E>::model_type type;
641     };
642 
643     template <typename T>
modelboost::geometry::srs::spar::detail::ellps_traits644     static typename spar::ellps<E>::model_type const& model(spar::ellps<E> const& e)
645     {
646         return e.model;
647     }
648 };
649 
650 // TODO: Implement as RadiusType-agnostic, member struct template defining model
651 //       and function template returning it
652 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(NAME) \
653 template <> \
654 struct ellps_traits<spar::NAME> \
655 { \
656     static const bool is_specialized = true; \
657     template <typename T> struct model_type \
658     { \
659         typedef srs::spheroid<T> type; \
660     }; \
661     template <typename T> \
662     static srs::spheroid<T> model(spar::NAME const&) { \
663         return srs::spheroid<T>(projections::detail::pj_get_ellps<T>().first[dpar::NAME].a, \
664                                 projections::detail::pj_get_ellps<T>().first[dpar::NAME].b); \
665     } \
666 };
667 
668 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SPHERE(NAME) \
669 template <> \
670 struct ellps_traits<spar::NAME> \
671 { \
672     static const bool is_specialized = true; \
673     template <typename T> struct model_type \
674     { \
675         typedef srs::sphere<T> type; \
676     }; \
677     template <typename T> \
678     static srs::sphere<T> model(spar::NAME const&) { \
679         return srs::sphere<T>(projections::detail::pj_get_ellps<T>().first[dpar::NAME].a); \
680     } \
681 };
682 
683 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_merit)
684 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_sgs85)
685 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_grs80)
686 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_iau76)
687 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_airy)
688 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_apl4_9)
689 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_nwl9d)
690 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_mod_airy)
691 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_andrae)
692 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_aust_sa)
693 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_grs67)
694 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_bessel)
695 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_bess_nam)
696 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_clrk66)
697 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_clrk80)
698 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_clrk80ign)
699 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_cpm)
700 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_delmbr)
701 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_engelis)
702 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst30)
703 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst48)
704 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst56)
705 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrst69)
706 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_evrstss)
707 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_fschr60)
708 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_fschr60m)
709 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_fschr68)
710 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_helmert)
711 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_hough)
712 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_intl)
713 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_krass)
714 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_kaula)
715 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_lerch)
716 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_mprts)
717 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_new_intl)
718 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_plessis)
719 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_seasia)
720 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_walbeck)
721 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs60)
722 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs66)
723 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs72)
724 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ELLPS(ellps_wgs84)
725 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SPHERE(ellps_sphere)
726 
727 template <typename M>
728 struct mode_traits
729 {
730     static const bool is_specialized = false;
731     typedef void type;
732 };
733 
734 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(NAME) \
735 template <> \
736 struct mode_traits<spar::NAME> \
737 { \
738     static const bool is_specialized = true; \
739     typedef spar::NAME type; \
740 };
741 
742 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_plane)
743 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_di)
744 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_dd)
745 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(mode_hex)
746 
747 template <typename O>
748 struct orient_traits
749 {
750     static const bool is_specialized = false;
751     typedef void type;
752 };
753 
754 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(NAME) \
755 template <> \
756 struct orient_traits<spar::NAME> \
757 { \
758     static const bool is_specialized = true; \
759     typedef spar::NAME type; \
760 };
761 
762 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(orient_isea)
763 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(orient_pole)
764 
765 template <typename M>
766 struct pm_traits
767 {
768     static const bool is_specialized = false;
769     typedef void type;
770 };
771 
772 template <typename T>
773 struct pm_traits<spar::pm<T> >
774 {
775     static const bool is_specialized = true;
776     typedef T type;
valueboost::geometry::srs::spar::detail::pm_traits777     static T const& value(spar::pm<T> const& p) { return p.value; }
778 };
779 
780 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(NAME, INDEX) \
781 template <> \
782 struct pm_traits<spar::NAME> \
783 { \
784     static const bool is_specialized = true; \
785     typedef double type; \
786     static double value(spar::NAME const& ) { return projections::detail::pj_prime_meridians[INDEX].deg; } \
787 };
788 
789 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_greenwich, 0)
790 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_lisbon,    1)
791 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_paris,     2)
792 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_bogota,    3)
793 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_madrid,    4)
794 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_rome,      5)
795 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_bern,      6)
796 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_jakarta,   7)
797 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_ferro,     8)
798 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_brussels,  9)
799 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_stockholm, 10)
800 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_athens,    11)
801 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(pm_oslo,      12)
802 
803 template <typename P>
804 struct proj_traits
805 {
806     static const bool is_specialized = false;
807     typedef void type;
808 };
809 
810 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(NAME) \
811 template <> \
812 struct proj_traits<spar::NAME> \
813 { \
814     static const bool is_specialized = true; \
815     typedef spar::NAME type; \
816     static const srs::dpar::value_proj id = dpar::NAME; \
817 };
818 
819 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_aea)
820 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_leac)
821 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_aeqd)
822 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_airy)
823 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_aitoff)
824 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wintri)
825 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_august)
826 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_apian)
827 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ortel)
828 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_bacon)
829 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_bipc)
830 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_boggs)
831 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_bonne)
832 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_cass)
833 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_cc)
834 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_cea)
835 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_chamb)
836 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_collg)
837 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_crast)
838 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_denoy)
839 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck1)
840 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck2)
841 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck3)
842 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp1)
843 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag6)
844 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_kav7)
845 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck4)
846 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck5)
847 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eqc)
848 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eqdc)
849 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_etmerc)
850 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_utm)
851 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_fahey)
852 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_fouc_s)
853 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gall)
854 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_geocent)
855 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_geos)
856 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gins8)
857 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gn_sinu)
858 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_sinu)
859 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_eck6)
860 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbtfps)
861 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gnom)
862 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_goode)
863 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gstmerc)
864 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_hammer)
865 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_hatano)
866 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_healpix)
867 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_rhealpix)
868 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_igh)
869 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_imw_p)
870 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_isea)
871 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_krovak)
872 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_labrd)
873 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_laea)
874 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lagrng)
875 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_larr)
876 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lask)
877 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lonlat)
878 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_latlon)
879 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_latlong)
880 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_longlat)
881 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lcc)
882 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lcca)
883 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_loxim)
884 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lsat)
885 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbt_fps)
886 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbtfpp)
887 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbtfpq)
888 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_merc)
889 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mill)
890 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mil_os)
891 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_lee_os)
892 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gs48)
893 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_alsk)
894 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_gs50)
895 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_moll)
896 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag4)
897 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag5)
898 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_natearth)
899 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nell)
900 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nell_h)
901 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nicol)
902 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nsper)
903 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tpers)
904 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_nzmg)
905 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ob_tran)
906 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ocea)
907 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_oea)
908 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_omerc)
909 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ortho)
910 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_poly)
911 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp2)
912 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp3)
913 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp3p)
914 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp4p)
915 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_weren)
916 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp5)
917 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp5p)
918 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp6)
919 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_putp6p)
920 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_qsc)
921 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_robin)
922 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_rouss)
923 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_rpoly)
924 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_euler)
925 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_murd1)
926 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_murd2)
927 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_murd3)
928 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_pconic)
929 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tissot)
930 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vitk1)
931 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_somerc)
932 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_stere)
933 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_ups)
934 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_sterea)
935 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_kav5)
936 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_qua_aut)
937 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_fouc)
938 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_mbt_s)
939 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tcc)
940 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tcea)
941 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tmerc)
942 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_tpeqd)
943 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_urm5)
944 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_urmfps)
945 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag1)
946 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg)
947 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg2)
948 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg3)
949 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_vandg4)
950 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag2)
951 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag3)
952 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wag7)
953 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wink1)
954 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(proj_wink2)
955 
956 template <typename S>
957 struct sweep_traits
958 {
959     static const bool is_specialized = false;
960     typedef void type;
961 };
962 
963 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(NAME) \
964 template <> \
965 struct sweep_traits<spar::NAME> \
966 { \
967     static const bool is_specialized = true; \
968     typedef spar::NAME type; \
969 };
970 
971 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(sweep_x)
972 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(sweep_y)
973 
974 template <typename S>
975 struct units_traits
976 {
977     static const bool is_specialized = false;
978     typedef void type;
979 };
980 
981 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(NAME) \
982 template <> \
983 struct units_traits<spar::NAME> \
984 { \
985     static const bool is_specialized = true; \
986     typedef spar::NAME type; \
987     static const srs::dpar::value_units id = dpar::NAME; \
988 };
989 
990 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_km)
991 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_m)
992 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_dm)
993 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_cm)
994 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_mm)
995 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_kmi)
996 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_in)
997 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ft)
998 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_yd)
999 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_mi)
1000 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_fath)
1001 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ch)
1002 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_link)
1003 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_in)
1004 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_ft)
1005 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_yd)
1006 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_ch)
1007 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_us_mi)
1008 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ind_yd)
1009 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ind_ft)
1010 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(units_ind_ch)
1011 
1012 
1013 template <typename T, template <typename> class Param>
1014 struct is_same_t : boost::false_type {};
1015 template <typename T, template <typename> class Param>
1016 struct is_same_t<Param<T>, Param> : boost::true_type {};
1017 
1018 template <typename T, template <int> class Param>
1019 struct is_same_i : boost::false_type {};
1020 template <int I, template <int> class Param>
1021 struct is_same_i<Param<I>, Param> : boost::true_type {};
1022 
1023 template <typename T, template <typename> class Traits>
1024 struct it_traits_specialized
1025     : boost::mpl::if_c
1026         <
1027             Traits<T>::is_specialized,
1028             boost::true_type,
1029             boost::false_type
1030         >::type
1031 {};
1032 
1033 template <typename Param>
1034 struct is_param
1035 {
1036     template <typename T>
1037     struct pred : boost::is_same<T, Param> {};
1038 };
1039 
1040 template <template <typename> class Param>
1041 struct is_param_t
1042 {
1043     template <typename T>
1044     struct pred : is_same_t<T, Param> {};
1045 };
1046 
1047 template <template <int> class Param>
1048 struct is_param_i
1049 {
1050     template <typename T>
1051     struct pred : is_same_i<T, Param> {};
1052 };
1053 
1054 template <template <typename> class Traits>
1055 struct is_param_tr
1056 {
1057     template <typename T>
1058     struct pred : it_traits_specialized<T, Traits> {};
1059 };
1060 
1061 //template <typename IsParam1, typename IsParam2>
1062 //struct is_param_or
1063 //{
1064 //    template <typename T>
1065 //    struct pred : boost::mpl::or_<IsParam1::pred<T>, IsParam2::pred<T> > {};
1066 //};
1067 
1068 // pick proj static name
1069 
1070 template <typename Tuple>
1071 struct pick_proj_tag
1072 {
1073     typedef typename geometry::tuples::find_if
1074         <
1075             Tuple,
1076             is_param_tr<proj_traits>::pred
1077         >::type proj_type;
1078 
1079     static const bool is_found = geometry::tuples::is_found<proj_type>::value;
1080 
1081     BOOST_MPL_ASSERT_MSG((is_found), PROJECTION_NOT_NAMED, (Tuple));
1082 
1083     typedef proj_traits<proj_type> traits_type;
1084     typedef typename traits_type::type type;
1085 };
1086 
1087 template <typename Tuple>
1088 struct pick_o_proj_tag
1089 {
1090     typedef typename geometry::tuples::find_if
1091         <
1092             Tuple,
1093             is_param_t<o_proj>::pred
1094         >::type o_proj_type;
1095 
1096     static const bool is_found = geometry::tuples::is_found<o_proj_type>::value;
1097 
1098     BOOST_MPL_ASSERT_MSG((is_found), NO_O_PROJ_PARAMETER, (Tuple));
1099 
1100     typedef proj_traits<typename o_proj_type::type> traits_type;
1101     typedef typename traits_type::type type;
1102 };
1103 
1104 
1105 } // namespace detail
1106 #endif // DOXYGEN_NO_DETAIL
1107 
1108 } // namespace spar
1109 
1110 }}} // namespace boost::geometry::srs
1111 
1112 
1113 #endif // BOOST_GEOMETRY_SRS_PROJECTIONS_SPAR_HPP
1114