pj_param.hpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // This file is manually converted from PROJ4
  3. // Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands.
  4. // This file was modified by Oracle on 2017-2020.
  5. // Modifications copyright (c) 2017-2020, Oracle and/or its affiliates.
  6. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  7. // Use, modification and distribution is subject to the Boost Software License,
  8. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. // This file is converted from PROJ4, http://trac.osgeo.org/proj
  11. // PROJ4 is originally written by Gerald Evenden (then of the USGS)
  12. // PROJ4 is maintained by Frank Warmerdam
  13. // PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
  14. // Original copyright notice:
  15. // Permission is hereby granted, free of charge, to any person obtaining a
  16. // copy of this software and associated documentation files (the "Software"),
  17. // to deal in the Software without restriction, including without limitation
  18. // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  19. // and/or sell copies of the Software, and to permit persons to whom the
  20. // Software is furnished to do so, subject to the following conditions:
  21. // The above copyright notice and this permission notice shall be included
  22. // in all copies or substantial portions of the Software.
  23. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  24. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  25. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  26. // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  27. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  28. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  29. // DEALINGS IN THE SOFTWARE.
  30. #ifndef BOOST_GEOMETRY_PROJECTIONS_PJ_PARAM_HPP
  31. #define BOOST_GEOMETRY_PROJECTIONS_PJ_PARAM_HPP
  32. #include <iterator>
  33. #include <string>
  34. #include <type_traits>
  35. #include <vector>
  36. #include <boost/geometry/core/static_assert.hpp>
  37. #include <boost/geometry/srs/projections/exception.hpp>
  38. #include <boost/geometry/srs/projections/impl/dms_parser.hpp>
  39. #include <boost/geometry/srs/projections/impl/projects.hpp>
  40. #include <boost/geometry/srs/projections/proj4.hpp>
  41. #include <boost/geometry/srs/projections/dpar.hpp>
  42. #include <boost/geometry/srs/projections/spar.hpp>
  43. namespace boost { namespace geometry { namespace projections {
  44. namespace detail {
  45. inline bool pj_param_pred(srs::detail::proj4_parameter const& p, std::string const& name)
  46. {
  47. return p.name == name;
  48. }
  49. template
  50. <
  51. typename T, typename Id,
  52. std::enable_if_t<! std::is_convertible<Id, std::string>::value, int> = 0
  53. >
  54. inline bool pj_param_pred(srs::dpar::parameter<T> const& p, Id const& id)
  55. {
  56. return p.is_id_equal(id);
  57. }
  58. /* input exists */
  59. template <typename Params, typename Name>
  60. inline typename Params::const_iterator
  61. pj_param_find(Params const& params, Name const& name)
  62. {
  63. typedef typename Params::const_iterator iterator;
  64. for (iterator it = params.begin(); it != params.end(); it++)
  65. {
  66. if (pj_param_pred(*it, name))
  67. {
  68. //it->used = true;
  69. return it;
  70. }
  71. // TODO: needed for pipeline
  72. /*else if (it->name == "step")
  73. {
  74. return pl.end();
  75. }*/
  76. }
  77. return params.end();
  78. }
  79. /*
  80. template
  81. <
  82. typename StaticParams,
  83. typename IsParamPred,
  84. int I = tuples_find_index_if<StaticParams, typename IsParamPred::pred>::value,
  85. int N = geometry::tuples::size<StaticParams>::value
  86. >
  87. struct pj_param_find_static
  88. {
  89. typedef geometry::tuples::element<I, StaticParams> type;
  90. typedef const type* result_type;
  91. static result_type get(StaticParams const& params)
  92. {
  93. return boost::addressof(boost::get<I>(params));
  94. }
  95. };
  96. template <typename StaticParams, typename IsParamPred, int N>
  97. struct pj_param_find_static<StaticParams, IsParamPred, N>
  98. {
  99. typedef void type;
  100. typedef const type* result_type;
  101. static result_type get(StaticParams const& ) { return NULL; }
  102. };*/
  103. /* input exists */
  104. template <typename Params, typename Name>
  105. inline bool pj_param_exists(Params const& params, Name const& name)
  106. {
  107. return pj_param_find(params, name) != params.end();
  108. }
  109. template <typename Param, typename ...Ps>
  110. inline bool pj_param_exists(srs::spar::parameters<Ps...> const& )
  111. {
  112. return geometry::tuples::is_found
  113. <
  114. typename geometry::tuples::find_if
  115. <
  116. srs::spar::parameters<Ps...>,
  117. srs::spar::detail::is_param<Param>::template pred
  118. >::type
  119. >::value;
  120. }
  121. template <template <typename> class Param, typename ...Ps>
  122. inline bool pj_param_exists(srs::spar::parameters<Ps...> const& )
  123. {
  124. return geometry::tuples::is_found
  125. <
  126. typename geometry::tuples::find_if
  127. <
  128. srs::spar::parameters<Ps...>,
  129. srs::spar::detail::is_param_t<Param>::template pred
  130. >::type
  131. >::value;
  132. }
  133. template <typename T>
  134. inline void set_value(T & val, srs::detail::proj4_parameter const& p)
  135. {
  136. val = geometry::str_cast<T>(p.value);
  137. }
  138. template <typename T, typename T2>
  139. inline void set_value(T & val, srs::dpar::parameter<T2> const& p)
  140. {
  141. val = p.template get_value<T>();
  142. }
  143. template <typename T>
  144. inline void set_value_r(T & val, srs::detail::proj4_parameter const& p)
  145. {
  146. val = dms_parser<T, true>::apply(p.value.c_str()).angle();
  147. }
  148. template <typename T>
  149. inline void set_value_r(T & val, srs::dpar::parameter<T> const& p)
  150. {
  151. val = p.template get_value<T>() * math::d2r<T>();
  152. }
  153. template <typename Name>
  154. inline void check_name(Name const&)
  155. {
  156. static const bool is_ok = std::is_convertible<Name, std::string>::value
  157. || std::is_same<Name, srs::dpar::name_i>::value
  158. || std::is_same<Name, srs::dpar::name_f>::value
  159. || std::is_same<Name, srs::dpar::name_r>::value;
  160. BOOST_GEOMETRY_STATIC_ASSERT((is_ok), "Invalid argument.", Name);
  161. }
  162. /* integer input */
  163. template <typename Params, typename Name>
  164. inline bool _pj_param_i(Params const& params, Name const& name, int & par)
  165. {
  166. check_name(name);
  167. typename Params::const_iterator it = pj_param_find(params, name);
  168. if (it != params.end())
  169. {
  170. set_value(par, *it);
  171. return true;
  172. }
  173. return false;
  174. }
  175. /* floating point input */
  176. template <typename T, typename Params, typename Name>
  177. inline bool _pj_param_f(Params const& params, Name const& name, T & par)
  178. {
  179. check_name(name);
  180. typename Params::const_iterator it = pj_param_find(params, name);
  181. if (it != params.end())
  182. {
  183. set_value(par, *it);
  184. return true;
  185. }
  186. return false;
  187. }
  188. /* radians input */
  189. template <typename T, typename Params, typename Name>
  190. inline bool _pj_param_r(Params const& params, Name const& name, T & par)
  191. {
  192. check_name(name);
  193. typename Params::const_iterator it = pj_param_find(params, name);
  194. if (it != params.end())
  195. {
  196. set_value_r(par, *it);
  197. return true;
  198. }
  199. return false;
  200. }
  201. /* bool input */
  202. inline bool _pj_get_param_b(srs::detail::proj4_parameters const& pl, std::string const& name)
  203. {
  204. srs::detail::proj4_parameters::const_iterator it = pj_param_find(pl, name);
  205. if (it != pl.end())
  206. {
  207. switch (it->value[0])
  208. {
  209. case '\0': case 'T': case 't':
  210. return true;
  211. case 'F': case 'f':
  212. return false;
  213. default:
  214. BOOST_THROW_EXCEPTION( projection_exception(error_invalid_boolean_param) );
  215. return false;
  216. }
  217. }
  218. return false;
  219. }
  220. template <typename T>
  221. inline bool _pj_get_param_b(srs::dpar::parameters<T> const& pl, srs::dpar::name_be const& name)
  222. {
  223. bool result = false;
  224. typename srs::dpar::parameters<T>::const_iterator it = pj_param_find(pl, name);
  225. if (it != pl.end())
  226. set_value(result, *it);
  227. return result;
  228. }
  229. /* string input */
  230. inline bool pj_param_s(srs::detail::proj4_parameters const& pl, std::string const& name, std::string & par)
  231. {
  232. srs::detail::proj4_parameters::const_iterator it = pj_param_find(pl, name);
  233. if (it != pl.end())
  234. {
  235. par = it->value;
  236. return true;
  237. }
  238. return false;
  239. }
  240. template
  241. <
  242. typename Params,
  243. template <typename> class IsSamePred,
  244. int I = geometry::tuples::find_index_if<Params, IsSamePred>::value,
  245. int N = geometry::tuples::size<Params>::value
  246. >
  247. struct _pj_param_x_static
  248. {
  249. static const bool result = true;
  250. template <typename T>
  251. static void apply(Params const& params, T & out)
  252. {
  253. // TODO: int values could be extracted directly from the type
  254. out = geometry::tuples::get<I>(params).value;
  255. }
  256. };
  257. template
  258. <
  259. typename Params,
  260. template <typename> class IsSamePred,
  261. int N
  262. >
  263. struct _pj_param_x_static<Params, IsSamePred, N, N>
  264. {
  265. static const bool result = false;
  266. template <typename T>
  267. static void apply(Params const& , T & )
  268. {}
  269. };
  270. template <template <int> class Param, typename ...Ps>
  271. inline bool _pj_param_i(srs::spar::parameters<Ps...> const& params, int & par)
  272. {
  273. typedef _pj_param_x_static
  274. <
  275. srs::spar::parameters<Ps...>,
  276. srs::spar::detail::is_param_i<Param>::template pred
  277. > impl;
  278. impl::apply(params, par);
  279. return impl::result;
  280. }
  281. template <template <typename> class Param, typename ...Ps, typename T>
  282. inline bool _pj_param_f(srs::spar::parameters<Ps...> const& params, T & par)
  283. {
  284. typedef _pj_param_x_static
  285. <
  286. srs::spar::parameters<Ps...>,
  287. srs::spar::detail::is_param_t<Param>::template pred
  288. > impl;
  289. impl::apply(params, par);
  290. return impl::result;
  291. }
  292. template <template <typename> class Param, typename ...Ps, typename T>
  293. inline bool _pj_param_r(srs::spar::parameters<Ps...> const& params, T & par)
  294. {
  295. typedef _pj_param_x_static
  296. <
  297. srs::spar::parameters<Ps...>,
  298. srs::spar::detail::is_param_t<Param>::template pred
  299. > impl;
  300. impl::apply(params, par);
  301. if (impl::result)
  302. par *= math::d2r<T>();
  303. return impl::result;
  304. }
  305. template <typename Param, typename ...Ps>
  306. inline bool _pj_get_param_b(srs::spar::parameters<Ps...> const& params)
  307. {
  308. return pj_param_exists<Param>(params);
  309. }
  310. //template <typename T, typename Name, typename Value>
  311. //inline bool pj_param_id(srs::dpar::parameters<T> const& pl, Name const& name, Value & par)
  312. //{
  313. // typename srs::dpar::parameters<T>::const_iterator it = pj_param_find(pl, name);
  314. // if (it != pl.end())
  315. // {
  316. // par = static_cast<Value>(it->template get_value<int>());
  317. // return true;
  318. // }
  319. // return false;
  320. //}
  321. // NOTE: In the original code, in pl_ell_set.c there is a function pj_get_param
  322. // which behavior is similar to pj_param but it doesn't set `user` member to TRUE
  323. // while pj_param does in the original code. In Boost.Geometry this member is not used.
  324. template <typename Params, typename Name>
  325. inline int _pj_get_param_i(Params const& pl, Name const& name)
  326. {
  327. int res = 0;
  328. _pj_param_i(pl, name, res);
  329. return res;
  330. }
  331. template <template <int> class Param, typename Params>
  332. inline int _pj_get_param_i(Params const& pl)
  333. {
  334. int res = 0;
  335. _pj_param_i<Param>(pl, res);
  336. return res;
  337. }
  338. template <typename T, typename Params, typename Name>
  339. inline T _pj_get_param_f(Params const& pl, Name const& name)
  340. {
  341. T res = 0;
  342. _pj_param_f(pl, name, res);
  343. return res;
  344. }
  345. template <typename T, template <typename> class Param, typename Params>
  346. inline T _pj_get_param_f(Params const& pl)
  347. {
  348. T res = 0;
  349. _pj_param_f<Param>(pl, res);
  350. return res;
  351. }
  352. template <typename T, typename Params, typename Name>
  353. inline T _pj_get_param_r(Params const& pl, Name const& name)
  354. {
  355. T res = 0;
  356. _pj_param_r(pl, name, res);
  357. return res;
  358. }
  359. template <typename T, template <typename> class Param, typename Params>
  360. inline T _pj_get_param_r(Params const& pl)
  361. {
  362. T res = 0;
  363. _pj_param_r<Param>(pl, res);
  364. return res;
  365. }
  366. inline std::string pj_get_param_s(srs::detail::proj4_parameters const& pl, std::string const& name)
  367. {
  368. std::string res;
  369. pj_param_s(pl, name, res);
  370. return res;
  371. }
  372. // ------------------------------------------------------------------------- //
  373. template <typename Param, typename Name>
  374. inline bool pj_param_exists(srs::detail::proj4_parameters const& pl,
  375. std::string const& sn,
  376. Name const& )
  377. {
  378. return pj_param_exists(pl, sn);
  379. }
  380. template <template <typename> class Param, typename Name>
  381. inline bool pj_param_exists(srs::detail::proj4_parameters const& pl,
  382. std::string const& sn,
  383. Name const& )
  384. {
  385. return pj_param_exists(pl, sn);
  386. }
  387. template <typename Param, typename T, typename Name>
  388. inline bool pj_param_exists(srs::dpar::parameters<T> const& pl,
  389. std::string const& ,
  390. Name const& n)
  391. {
  392. return pj_param_exists(pl, n);
  393. }
  394. template <template <typename> class Param, typename T, typename Name>
  395. inline bool pj_param_exists(srs::dpar::parameters<T> const& pl,
  396. std::string const& ,
  397. Name const& n)
  398. {
  399. return pj_param_exists(pl, n);
  400. }
  401. template <typename Param, typename ...Ps, typename Name>
  402. inline bool pj_param_exists(srs::spar::parameters<Ps...> const& pl,
  403. std::string const& ,
  404. Name const& )
  405. {
  406. return pj_param_exists<Param>(pl);
  407. }
  408. template <template <typename> class Param, typename ...Ps, typename Name>
  409. inline bool pj_param_exists(srs::spar::parameters<Ps...> const& pl,
  410. std::string const& ,
  411. Name const& )
  412. {
  413. return pj_param_exists<Param>(pl);
  414. }
  415. template <typename Param>
  416. inline bool pj_get_param_b(srs::detail::proj4_parameters const& pl,
  417. std::string const& sn,
  418. srs::dpar::name_be const& )
  419. {
  420. return _pj_get_param_b(pl, sn);
  421. }
  422. template <typename Param, typename T>
  423. inline bool pj_get_param_b(srs::dpar::parameters<T> const& pl,
  424. std::string const& ,
  425. srs::dpar::name_be const& n)
  426. {
  427. return _pj_get_param_b(pl, n);
  428. }
  429. template <typename Param, typename ...Ps>
  430. inline bool pj_get_param_b(srs::spar::parameters<Ps...> const& pl,
  431. std::string const& ,
  432. srs::dpar::name_be const& )
  433. {
  434. return _pj_get_param_b<Param>(pl);
  435. }
  436. //#define BOOST_GEOMETRY_GET_PARAM_B(PARAMS, NAME) pj_get_param_b(PARAMS, #NAME, srs::dpar::NAME)
  437. template <template <int> class Param>
  438. inline bool pj_param_i(srs::detail::proj4_parameters const& pl,
  439. std::string const& sn,
  440. srs::dpar::name_i const& ,
  441. int & par)
  442. {
  443. return _pj_param_i(pl, sn, par);
  444. }
  445. template <template <int> class Param, typename T>
  446. inline bool pj_param_i(srs::dpar::parameters<T> const& pl,
  447. std::string const& ,
  448. srs::dpar::name_i const& n,
  449. int & par)
  450. {
  451. return _pj_param_i(pl, n, par);
  452. }
  453. template <template <int> class Param, typename ...Ps>
  454. inline bool pj_param_i(srs::spar::parameters<Ps...> const& pl,
  455. std::string const& ,
  456. srs::dpar::name_i const& ,
  457. int & par)
  458. {
  459. return _pj_param_i<Param>(pl, par);
  460. }
  461. //#define BOOST_GEOMETRY_PARAM_I(PARAMS, NAME, PAR) pj_param_i(PARAMS, #NAME, srs::dpar::NAME, PAR)
  462. template <template <int> class Param>
  463. inline int pj_get_param_i(srs::detail::proj4_parameters const& pl,
  464. std::string const& sn,
  465. srs::dpar::name_i const& )
  466. {
  467. return _pj_get_param_i(pl, sn);
  468. }
  469. template <template <int> class Param, typename T>
  470. inline int pj_get_param_i(srs::dpar::parameters<T> const& pl,
  471. std::string const& ,
  472. srs::dpar::name_i const& n)
  473. {
  474. return _pj_get_param_i(pl, n);
  475. }
  476. template <template <int> class Param, typename ...Ps>
  477. inline bool pj_get_param_i(srs::spar::parameters<Ps...> const& pl,
  478. std::string const& ,
  479. srs::dpar::name_i const& )
  480. {
  481. return _pj_get_param_i<Param>(pl);
  482. }
  483. //#define BOOST_GEOMETRY_GET_PARAM_I(PARAMS, NAME) pj_get_param_i(PARAMS, #NAME, srs::dpar::NAME)
  484. template <template <typename> class Param, typename T>
  485. inline bool pj_param_f(srs::detail::proj4_parameters const& pl,
  486. std::string const& sn,
  487. srs::dpar::name_f const& ,
  488. T & par)
  489. {
  490. return _pj_param_f(pl, sn, par);
  491. }
  492. template <template <typename> class Param, typename T>
  493. inline bool pj_param_f(srs::dpar::parameters<T> const& pl,
  494. std::string const& ,
  495. srs::dpar::name_f const& n,
  496. T & par)
  497. {
  498. return _pj_param_f(pl, n, par);
  499. }
  500. template <template <typename> class Param, typename ...Ps, typename T>
  501. inline bool pj_param_f(srs::spar::parameters<Ps...> const& pl,
  502. std::string const& ,
  503. srs::dpar::name_f const& ,
  504. T & par)
  505. {
  506. return _pj_param_f<Param>(pl, par);
  507. }
  508. //#define BOOST_GEOMETRY_PARAM_F(PARAMS, NAME, PAR) pj_param_f(PARAMS, #NAME, srs::dpar::NAME, PAR)
  509. template <typename T, template <typename> class Param>
  510. inline T pj_get_param_f(srs::detail::proj4_parameters const& pl,
  511. std::string const& sn,
  512. srs::dpar::name_f const& )
  513. {
  514. return _pj_get_param_f<T>(pl, sn);
  515. }
  516. template <typename T, template <typename> class Param>
  517. inline T pj_get_param_f(srs::dpar::parameters<T> const& pl,
  518. std::string const& ,
  519. srs::dpar::name_f const& n)
  520. {
  521. return _pj_get_param_f<T>(pl, n);
  522. }
  523. template <typename T, template <typename> class Param, typename ...Ps>
  524. inline T pj_get_param_f(srs::spar::parameters<Ps...> const& pl,
  525. std::string const& ,
  526. srs::dpar::name_f const& )
  527. {
  528. return _pj_get_param_f<T, Param>(pl);
  529. }
  530. //#define BOOST_GEOMETRY_GET_PARAM_F(PARAMS, NAME) pj_get_param_f<T>(PARAMS, #NAME, srs::dpar::NAME)
  531. template <template <typename> class Param, typename T>
  532. inline bool pj_param_r(srs::detail::proj4_parameters const& pl,
  533. std::string const& sn,
  534. srs::dpar::name_r const& ,
  535. T & par)
  536. {
  537. return _pj_param_r(pl, sn, par);
  538. }
  539. template <template <typename> class Param, typename T>
  540. inline bool pj_param_r(srs::dpar::parameters<T> const& pl,
  541. std::string const& ,
  542. srs::dpar::name_r const& n,
  543. T & par)
  544. {
  545. return _pj_param_r(pl, n, par);
  546. }
  547. template <template <typename> class Param, typename ...Ps, typename T>
  548. inline bool pj_param_r(srs::spar::parameters<Ps...> const& pl,
  549. std::string const& ,
  550. srs::dpar::name_r const& ,
  551. T & par)
  552. {
  553. return _pj_param_r<Param>(pl, par);
  554. }
  555. //#define BOOST_GEOMETRY_PARAM_R(PARAMS, NAME, PAR) pj_param_r(PARAMS, #NAME, srs::dpar::NAME, PAR)
  556. template <typename T, template <typename> class Param>
  557. inline T pj_get_param_r(srs::detail::proj4_parameters const& pl,
  558. std::string const& sn,
  559. srs::dpar::name_r const& )
  560. {
  561. return _pj_get_param_r<T>(pl, sn);
  562. }
  563. template <typename T, template <typename> class Param>
  564. inline T pj_get_param_r(srs::dpar::parameters<T> const& pl,
  565. std::string const& ,
  566. srs::dpar::name_r const& n)
  567. {
  568. return _pj_get_param_r<T>(pl, n);
  569. }
  570. template <typename T, template <typename> class Param, typename ...Ps>
  571. inline T pj_get_param_r(srs::spar::parameters<Ps...> const& pl,
  572. std::string const& ,
  573. srs::dpar::name_r const& )
  574. {
  575. return _pj_get_param_r<T, Param>(pl);
  576. }
  577. //#define BOOST_GEOMETRY_GET_PARAM_R(PARAMS, NAME) pj_get_param_r<T>(PARAMS, #NAME, srs::dpar::NAME)
  578. } // namespace detail
  579. }}} // namespace boost::geometry::projections
  580. #endif