]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/geometry/srs/projections/spar.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / geometry / srs / projections / spar.hpp
1 // Boost.Geometry
2
3 // Copyright (c) 2017-2018, 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 // TODO: move this functionality
26 #include <boost/geometry/index/detail/tuples.hpp>
27
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>
37
38 #include <string>
39 #include <vector>
40
41 namespace boost { namespace geometry { namespace srs
42 {
43
44 namespace spar
45 {
46
47 // Static parameters holder
48
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
53
54 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX \
55 P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14
56
57 #ifndef DOXYGEN_NO_DETAIL
58 namespace detail
59 {
60
61 template <BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
62 struct map_params_to_cons
63 {
64 typedef boost::tuples::cons
65 <
66 P0,
67 typename map_params_to_cons
68 <
69 P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14,
70 boost::tuples::null_type
71 >::type
72 > type;
73 };
74
75 template <>
76 struct map_params_to_cons
77 <
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
81 >
82 {
83 typedef boost::tuples::null_type type;
84 };
85
86 } // namespace detail
87 #endif // DOXYGEN_NO_DETAIL
88
89 template
90 <
91 // null_type -> void?
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
107 >
108 struct parameters
109 : detail::map_params_to_cons<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>::type
110 {
111 private:
112 typedef typename detail::map_params_to_cons<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>::type base_type;
113
114 public:
115 typedef typename base_type::tail_type tail_type;
116
117 parameters()
118 : base_type()
119 {}
120
121 explicit parameters(P0 const& p0)
122 : base_type(p0, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
123 {}
124
125 parameters(P0 const& p0, P1 const& p1)
126 : base_type(p0, p1, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
127 {}
128
129 parameters(P0 const& p0, P1 const& p1, P2 const& p2)
130 : base_type(p0, p1, p2, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
131 {}
132
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())
135 {}
136
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())
139 {}
140
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())
143 {}
144
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())
147 {}
148
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())
151 {}
152
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())
155 {}
156
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)
159 {}
160
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)
162 : base_type(p0,
163 tail_type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10))
164 {}
165
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)
167 : base_type(p0,
168 tail_type(p1,
169 typename tail_type::tail_type(p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)))
170 {}
171
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)
173 : base_type(p0,
174 tail_type(p1,
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))))
177 {}
178
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)
180 : base_type(p0,
181 tail_type(p1,
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)))))
185 {}
186
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)
188 : base_type(p0,
189 tail_type(p1,
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))))))
194 {}
195
196 private:
197 static inline const boost::tuples::null_type cnull()
198 {
199 return boost::tuples::null_type();
200 }
201 };
202
203
204 #ifndef DOXYGEN_NO_DETAIL
205 namespace detail
206 {
207
208 template <typename Parameters, typename Parameter>
209 struct add_parameter
210 {
211 BOOST_MPL_ASSERT_MSG((false), INVALID_ARGUMENT, (Parameters));
212 };
213
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
218 <
219 typename detail::map_params_to_cons<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>::type,
220 Parameter
221 >
222 {};
223
224 template <typename Head, typename Tail, typename Parameter>
225 struct add_parameter<boost::tuples::cons<Head, Tail>, Parameter>
226 : index::detail::tuples::push_back
227 <
228 boost::tuples::cons<Head, Tail>,
229 Parameter
230 >
231 {};
232
233 } // namespace detail
234 #endif // DOXYGEN_NO_DETAIL
235
236
237 // Static parameters values
238
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 {};
249
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 {};
266 struct ellps_cpm {};
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 {};
293
294 struct mode_plane {};
295 struct mode_di {};
296 struct mode_dd {};
297 struct mode_hex {};
298
299 struct orient_isea {};
300 struct orient_pole {};
301
302 struct pm_greenwich {};
303 struct pm_lisbon {};
304 struct pm_paris {};
305 struct pm_bogota {};
306 struct pm_madrid {};
307 struct pm_rome {};
308 struct pm_bern {};
309 struct pm_jakarta {};
310 struct pm_ferro {};
311 struct pm_brussels {};
312 struct pm_stockholm {};
313 struct pm_athens {};
314 struct pm_oslo {};
315
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 {};
322 struct proj_bipc {};
323 struct proj_boggs {};
324 struct proj_bonne {};
325 struct proj_cass {};
326 struct proj_cc {};
327 struct proj_cea {};
328 struct proj_chamb {};
329 struct proj_collg {};
330 struct proj_crast {};
331 struct proj_denoy {};
332 struct proj_eck1 {};
333 struct proj_eck2 {};
334 struct proj_eck3 {}; struct proj_putp1 {}; struct proj_wag6 {}; struct proj_kav7 {};
335 struct proj_eck4 {};
336 struct proj_eck5 {};
337 struct proj_eqc {};
338 struct proj_eqdc {};
339 struct proj_etmerc {}; struct proj_utm {};
340 struct proj_fahey {};
341 struct proj_fouc_s {};
342 struct proj_gall {};
343 struct proj_geocent {};
344 struct proj_geos {};
345 struct proj_gins8 {};
346 struct proj_gn_sinu {}; struct proj_sinu {}; struct proj_eck6 {}; struct proj_mbtfps {};
347 struct proj_gnom {};
348 struct proj_goode {};
349 struct proj_gstmerc {};
350 struct proj_hammer {};
351 struct proj_hatano {};
352 struct proj_healpix {};
353 struct proj_rhealpix {};
354 struct proj_igh {};
355 struct proj_imw_p {};
356 struct proj_isea {};
357 struct proj_krovak {};
358 struct proj_labrd {};
359 struct proj_laea {};
360 struct proj_lagrng {};
361 struct proj_larr {};
362 struct proj_lask {};
363 struct proj_lonlat {}; struct proj_latlon {}; struct proj_latlong {}; struct proj_longlat {};
364 struct proj_lcc {};
365 struct proj_lcca {};
366 struct proj_loxim {};
367 struct proj_lsat {};
368 struct proj_mbt_fps {};
369 struct proj_mbtfpp {};
370 struct proj_mbtfpq {};
371 struct proj_merc {};
372 struct proj_mill {};
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 {};
376 struct proj_nell {};
377 struct proj_nell_h {};
378 struct proj_nicol {};
379 struct proj_nsper {}; struct proj_tpers {};
380 struct proj_nzmg {};
381 struct proj_ob_tran {};
382 struct proj_ocea {};
383 struct proj_oea {};
384 struct proj_omerc {};
385 struct proj_ortho {};
386 struct proj_poly {};
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 {};
392 struct proj_qsc {};
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 {};
401 struct proj_tcc {};
402 struct proj_tcea {};
403 struct proj_tmerc {};
404 struct proj_tpeqd {};
405 struct proj_urm5 {};
406 struct proj_urmfps {}; struct proj_wag1 {};
407 struct proj_vandg {};
408 struct proj_vandg2 {}; struct proj_vandg3 {};
409 struct proj_vandg4 {};
410 struct proj_wag2 {};
411 struct proj_wag3 {};
412 struct proj_wag7 {};
413 struct proj_wink1 {};
414 struct proj_wink2 {};
415
416 struct sweep_x {};
417 struct sweep_y {};
418
419 struct units_km {};
420 struct units_m {};
421 struct units_dm {};
422 struct units_cm {};
423 struct units_mm {};
424 struct units_kmi {};
425 struct units_in {};
426 struct units_ft {};
427 struct units_yd {};
428 struct units_mi {};
429 struct units_fath {};
430 struct units_ch {};
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 {};
440
441 // Static parameters names
442
443 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(NAME) \
444 template <typename T = double> \
445 struct NAME \
446 { \
447 NAME() : value(0) {} \
448 explicit NAME(T const& v) : value(v) {} \
449 T value; \
450 };
451
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)
471
472 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_R(NAME) \
473 BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_F(NAME)
474
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)
501
502 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_I(NAME) \
503 template <int I> struct NAME { static const int value = I; };
504
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)
512
513 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PARAM_BE(NAME) \
514 struct NAME {};
515
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)
531
532 template
533 <
534 typename SpheroidOrSphere
535 >
536 struct ellps
537 {
538 typedef SpheroidOrSphere model_type;
539
540 ellps() : model() {}
541 explicit ellps(SpheroidOrSphere const& sph) : model(sph) {}
542
543 SpheroidOrSphere model;
544 };
545
546 struct nadgrids
547 : srs::detail::nadgrids
548 {
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) {}
557 #endif
558 };
559
560 template <typename Proj>
561 struct o_proj
562 {
563 typedef Proj type;
564 };
565
566 template <typename T = double>
567 struct towgs84
568 : srs::detail::towgs84<T>
569 {
570 typedef srs::detail::towgs84<T> base_t;
571
572 towgs84(T const& v0, T const& v1, T const& v2)
573 : base_t(v0, v1, v2)
574 {}
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)
577 {}
578 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
579 towgs84(std::initializer_list<T> l) : base_t(l) {}
580 #endif
581 };
582
583 template <typename Units>
584 struct vunits
585 {
586 typedef Units type;
587 };
588
589 // Static parameters traits
590
591 #ifndef DOXYGEN_NO_DETAIL
592 namespace detail
593 {
594
595 template <typename D>
596 struct datum_traits
597 {
598 static const bool is_specialized = false;
599 typedef void ellps_type;
600 typedef void def_type;
601 };
602
603 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_DATUM(NAME, ELLPS, DEF_T, DEF_V) \
604 template <> \
605 struct datum_traits<spar::NAME> \
606 { \
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; \
612 };
613
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))
624
625
626 template <typename E>
627 struct ellps_traits
628 {
629 static const bool is_specialized = false;
630 template <typename T> struct model_type
631 {
632 typedef void type;
633 };
634 };
635
636 template <typename E>
637 struct ellps_traits<spar::ellps<E> >
638 {
639 static const bool is_specialized = true;
640 template <typename T> struct model_type
641 {
642 // TODO: transform to spheroid<T> or sphere<T>
643 typedef typename spar::ellps<E>::model_type type;
644 };
645
646 template <typename T>
647 static typename spar::ellps<E>::model_type const& model(spar::ellps<E> const& e)
648 {
649 return e.model;
650 }
651 };
652
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) \
656 template <> \
657 struct ellps_traits<spar::NAME> \
658 { \
659 static const bool is_specialized = true; \
660 template <typename T> struct model_type \
661 { \
662 typedef srs::spheroid<T> type; \
663 }; \
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); \
668 } \
669 };
670
671 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SPHERE(NAME) \
672 template <> \
673 struct ellps_traits<spar::NAME> \
674 { \
675 static const bool is_specialized = true; \
676 template <typename T> struct model_type \
677 { \
678 typedef srs::sphere<T> type; \
679 }; \
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); \
683 } \
684 };
685
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)
729
730 template <typename M>
731 struct mode_traits
732 {
733 static const bool is_specialized = false;
734 typedef void type;
735 };
736
737 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_MODE(NAME) \
738 template <> \
739 struct mode_traits<spar::NAME> \
740 { \
741 static const bool is_specialized = true; \
742 typedef spar::NAME type; \
743 };
744
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)
749
750 template <typename O>
751 struct orient_traits
752 {
753 static const bool is_specialized = false;
754 typedef void type;
755 };
756
757 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(NAME) \
758 template <> \
759 struct orient_traits<spar::NAME> \
760 { \
761 static const bool is_specialized = true; \
762 typedef spar::NAME type; \
763 };
764
765 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(orient_isea)
766 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_ORIENT(orient_pole)
767
768 template <typename M>
769 struct pm_traits
770 {
771 static const bool is_specialized = false;
772 typedef void type;
773 };
774
775 template <typename T>
776 struct pm_traits<spar::pm<T> >
777 {
778 static const bool is_specialized = true;
779 typedef T type;
780 static T const& value(spar::pm<T> const& p) { return p.value; }
781 };
782
783 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PM(NAME, INDEX) \
784 template <> \
785 struct pm_traits<spar::NAME> \
786 { \
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; } \
790 };
791
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)
805
806 template <typename P>
807 struct proj_traits
808 {
809 static const bool is_specialized = false;
810 typedef void type;
811 };
812
813 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_PROJ(NAME) \
814 template <> \
815 struct proj_traits<spar::NAME> \
816 { \
817 static const bool is_specialized = true; \
818 typedef spar::NAME type; \
819 static const srs::dpar::value_proj id = dpar::NAME; \
820 };
821
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)
958
959 template <typename S>
960 struct sweep_traits
961 {
962 static const bool is_specialized = false;
963 typedef void type;
964 };
965
966 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(NAME) \
967 template <> \
968 struct sweep_traits<spar::NAME> \
969 { \
970 static const bool is_specialized = true; \
971 typedef spar::NAME type; \
972 };
973
974 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(sweep_x)
975 BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_SWEEP(sweep_y)
976
977 template <typename S>
978 struct units_traits
979 {
980 static const bool is_specialized = false;
981 typedef void type;
982 };
983
984 #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_REGISTER_UNITS(NAME) \
985 template <> \
986 struct units_traits<spar::NAME> \
987 { \
988 static const bool is_specialized = true; \
989 typedef spar::NAME type; \
990 static const srs::dpar::value_units id = dpar::NAME; \
991 };
992
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)
1014
1015
1016 template
1017 <
1018 typename Tuple,
1019 template <typename> class IsSamePred,
1020 int I = 0,
1021 int N = boost::tuples::length<Tuple>::value
1022 >
1023 struct tuples_find_index_if
1024 : boost::mpl::if_c
1025 <
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
1029 >::type
1030 {};
1031
1032 template
1033 <
1034 typename Tuple,
1035 template <typename> class IsSamePred,
1036 int N
1037 >
1038 struct tuples_find_index_if<Tuple, IsSamePred, N, N>
1039 : boost::integral_constant<int, N>
1040 {};
1041
1042 template
1043 <
1044 typename Tuple,
1045 template <typename> class IsSamePred,
1046 int I = tuples_find_index_if<Tuple, IsSamePred>::value,
1047 int N = boost::tuples::length<Tuple>::value
1048 >
1049 struct tuples_find_if
1050 : boost::tuples::element<I, Tuple>
1051 {};
1052
1053 template
1054 <
1055 typename Tuple,
1056 template <typename> class IsSamePred,
1057 int N
1058 >
1059 struct tuples_find_if<Tuple, IsSamePred, N, N>
1060 {
1061 typedef boost::tuples::null_type type;
1062 };
1063
1064 template <typename T>
1065 struct tuples_is_found
1066 : boost::mpl::not_<boost::is_same<T, boost::tuples::null_type> >
1067 {};
1068
1069 template <typename T>
1070 struct tuples_is_not_found
1071 : boost::is_same<T, boost::tuples::null_type>
1072 {};
1073
1074 template <typename Tuple, template <typename> class IsSamePred>
1075 struct tuples_exists_if
1076 : tuples_is_found
1077 <
1078 typename tuples_find_if<Tuple, IsSamePred>::type
1079 >
1080 {};
1081
1082
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 {};
1087
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 {};
1092
1093 template <typename T, template <typename> class Traits>
1094 struct it_traits_specialized
1095 : boost::mpl::if_c
1096 <
1097 Traits<T>::is_specialized,
1098 boost::true_type,
1099 boost::false_type
1100 >::type
1101 {};
1102
1103 template <typename Param>
1104 struct is_param
1105 {
1106 template <typename T>
1107 struct pred : boost::is_same<T, Param> {};
1108 };
1109
1110 template <template <typename> class Param>
1111 struct is_param_t
1112 {
1113 template <typename T>
1114 struct pred : is_same_t<T, Param> {};
1115 };
1116
1117 template <template <int> class Param>
1118 struct is_param_i
1119 {
1120 template <typename T>
1121 struct pred : is_same_i<T, Param> {};
1122 };
1123
1124 template <template <typename> class Traits>
1125 struct is_param_tr
1126 {
1127 template <typename T>
1128 struct pred : it_traits_specialized<T, Traits> {};
1129 };
1130
1131 //template <typename IsParam1, typename IsParam2>
1132 //struct is_param_or
1133 //{
1134 // template <typename T>
1135 // struct pred : boost::mpl::or_<IsParam1::pred<T>, IsParam2::pred<T> > {};
1136 //};
1137
1138 // pick proj static name
1139
1140 template <typename Tuple>
1141 struct pick_proj_tag
1142 {
1143 typedef typename tuples_find_if
1144 <
1145 Tuple,
1146 is_param_tr<proj_traits>::pred
1147 >::type proj_type;
1148
1149 static const bool is_found = tuples_is_found<proj_type>::value;
1150
1151 BOOST_MPL_ASSERT_MSG((is_found), PROJECTION_NOT_NAMED, (Tuple));
1152
1153 typedef proj_traits<proj_type> traits_type;
1154 typedef typename traits_type::type type;
1155 };
1156
1157 template <typename Tuple>
1158 struct pick_o_proj_tag
1159 {
1160 typedef typename tuples_find_if
1161 <
1162 Tuple,
1163 is_param_t<o_proj>::pred
1164 >::type o_proj_type;
1165
1166 static const bool is_found = tuples_is_found<o_proj_type>::value;
1167
1168 BOOST_MPL_ASSERT_MSG((is_found), NO_O_PROJ_PARAMETER, (Tuple));
1169
1170 typedef proj_traits<typename o_proj_type::type> traits_type;
1171 typedef typename traits_type::type type;
1172 };
1173
1174
1175 } // namespace detail
1176 #endif // DOXYGEN_NO_DETAIL
1177
1178 } // namespace spar
1179
1180 }}} // namespace boost::geometry::srs
1181
1182
1183 #endif // BOOST_GEOMETRY_SRS_PROJECTIONS_SPAR_HPP