spar.hpp 42 KB

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