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