123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655 |
- #ifndef BOOST_GEOMETRY_PROJECTIONS_PJ_PARAM_HPP
- #define BOOST_GEOMETRY_PROJECTIONS_PJ_PARAM_HPP
- #include <iterator>
- #include <string>
- #include <type_traits>
- #include <vector>
- #include <boost/geometry/core/static_assert.hpp>
- #include <boost/geometry/srs/projections/exception.hpp>
- #include <boost/geometry/srs/projections/impl/dms_parser.hpp>
- #include <boost/geometry/srs/projections/impl/projects.hpp>
- #include <boost/geometry/srs/projections/proj4.hpp>
- #include <boost/geometry/srs/projections/dpar.hpp>
- #include <boost/geometry/srs/projections/spar.hpp>
- namespace boost { namespace geometry { namespace projections {
- namespace detail {
- inline bool pj_param_pred(srs::detail::proj4_parameter const& p, std::string const& name)
- {
- return p.name == name;
- }
- template
- <
- typename T, typename Id,
- std::enable_if_t<! std::is_convertible<Id, std::string>::value, int> = 0
- >
- inline bool pj_param_pred(srs::dpar::parameter<T> const& p, Id const& id)
- {
- return p.is_id_equal(id);
- }
- template <typename Params, typename Name>
- inline typename Params::const_iterator
- pj_param_find(Params const& params, Name const& name)
- {
- typedef typename Params::const_iterator iterator;
- for (iterator it = params.begin(); it != params.end(); it++)
- {
- if (pj_param_pred(*it, name))
- {
-
- return it;
- }
-
-
- }
- return params.end();
- }
- template <typename Params, typename Name>
- inline bool pj_param_exists(Params const& params, Name const& name)
- {
- return pj_param_find(params, name) != params.end();
- }
- template <typename Param, typename ...Ps>
- inline bool pj_param_exists(srs::spar::parameters<Ps...> const& )
- {
- return geometry::tuples::is_found
- <
- typename geometry::tuples::find_if
- <
- srs::spar::parameters<Ps...>,
- srs::spar::detail::is_param<Param>::template pred
- >::type
- >::value;
- }
- template <template <typename> class Param, typename ...Ps>
- inline bool pj_param_exists(srs::spar::parameters<Ps...> const& )
- {
- return geometry::tuples::is_found
- <
- typename geometry::tuples::find_if
- <
- srs::spar::parameters<Ps...>,
- srs::spar::detail::is_param_t<Param>::template pred
- >::type
- >::value;
- }
- template <typename T>
- inline void set_value(T & val, srs::detail::proj4_parameter const& p)
- {
- val = geometry::str_cast<T>(p.value);
- }
- template <typename T, typename T2>
- inline void set_value(T & val, srs::dpar::parameter<T2> const& p)
- {
- val = p.template get_value<T>();
- }
- template <typename T>
- inline void set_value_r(T & val, srs::detail::proj4_parameter const& p)
- {
- val = dms_parser<T, true>::apply(p.value.c_str()).angle();
- }
- template <typename T>
- inline void set_value_r(T & val, srs::dpar::parameter<T> const& p)
- {
- val = p.template get_value<T>() * math::d2r<T>();
- }
- template <typename Name>
- inline void check_name(Name const&)
- {
- static const bool is_ok = std::is_convertible<Name, std::string>::value
- || std::is_same<Name, srs::dpar::name_i>::value
- || std::is_same<Name, srs::dpar::name_f>::value
- || std::is_same<Name, srs::dpar::name_r>::value;
- BOOST_GEOMETRY_STATIC_ASSERT((is_ok), "Invalid argument.", Name);
- }
- template <typename Params, typename Name>
- inline bool _pj_param_i(Params const& params, Name const& name, int & par)
- {
- check_name(name);
- typename Params::const_iterator it = pj_param_find(params, name);
- if (it != params.end())
- {
- set_value(par, *it);
- return true;
- }
- return false;
- }
- template <typename T, typename Params, typename Name>
- inline bool _pj_param_f(Params const& params, Name const& name, T & par)
- {
- check_name(name);
- typename Params::const_iterator it = pj_param_find(params, name);
- if (it != params.end())
- {
- set_value(par, *it);
- return true;
- }
- return false;
- }
- template <typename T, typename Params, typename Name>
- inline bool _pj_param_r(Params const& params, Name const& name, T & par)
- {
- check_name(name);
- typename Params::const_iterator it = pj_param_find(params, name);
- if (it != params.end())
- {
- set_value_r(par, *it);
- return true;
- }
- return false;
- }
- inline bool _pj_get_param_b(srs::detail::proj4_parameters const& pl, std::string const& name)
- {
- srs::detail::proj4_parameters::const_iterator it = pj_param_find(pl, name);
- if (it != pl.end())
- {
- switch (it->value[0])
- {
- case '\0': case 'T': case 't':
- return true;
- case 'F': case 'f':
- return false;
- default:
- BOOST_THROW_EXCEPTION( projection_exception(error_invalid_boolean_param) );
- return false;
- }
- }
- return false;
- }
- template <typename T>
- inline bool _pj_get_param_b(srs::dpar::parameters<T> const& pl, srs::dpar::name_be const& name)
- {
- bool result = false;
- typename srs::dpar::parameters<T>::const_iterator it = pj_param_find(pl, name);
- if (it != pl.end())
- set_value(result, *it);
- return result;
- }
- inline bool pj_param_s(srs::detail::proj4_parameters const& pl, std::string const& name, std::string & par)
- {
- srs::detail::proj4_parameters::const_iterator it = pj_param_find(pl, name);
- if (it != pl.end())
- {
- par = it->value;
- return true;
- }
- return false;
- }
- template
- <
- typename Params,
- template <typename> class IsSamePred,
- int I = geometry::tuples::find_index_if<Params, IsSamePred>::value,
- int N = geometry::tuples::size<Params>::value
- >
- struct _pj_param_x_static
- {
- static const bool result = true;
- template <typename T>
- static void apply(Params const& params, T & out)
- {
-
- out = geometry::tuples::get<I>(params).value;
- }
- };
- template
- <
- typename Params,
- template <typename> class IsSamePred,
- int N
- >
- struct _pj_param_x_static<Params, IsSamePred, N, N>
- {
- static const bool result = false;
- template <typename T>
- static void apply(Params const& , T & )
- {}
- };
- template <template <int> class Param, typename ...Ps>
- inline bool _pj_param_i(srs::spar::parameters<Ps...> const& params, int & par)
- {
- typedef _pj_param_x_static
- <
- srs::spar::parameters<Ps...>,
- srs::spar::detail::is_param_i<Param>::template pred
- > impl;
- impl::apply(params, par);
- return impl::result;
- }
- template <template <typename> class Param, typename ...Ps, typename T>
- inline bool _pj_param_f(srs::spar::parameters<Ps...> const& params, T & par)
- {
- typedef _pj_param_x_static
- <
- srs::spar::parameters<Ps...>,
- srs::spar::detail::is_param_t<Param>::template pred
- > impl;
- impl::apply(params, par);
- return impl::result;
- }
- template <template <typename> class Param, typename ...Ps, typename T>
- inline bool _pj_param_r(srs::spar::parameters<Ps...> const& params, T & par)
- {
- typedef _pj_param_x_static
- <
- srs::spar::parameters<Ps...>,
- srs::spar::detail::is_param_t<Param>::template pred
- > impl;
- impl::apply(params, par);
- if (impl::result)
- par *= math::d2r<T>();
- return impl::result;
- }
- template <typename Param, typename ...Ps>
- inline bool _pj_get_param_b(srs::spar::parameters<Ps...> const& params)
- {
- return pj_param_exists<Param>(params);
- }
- template <typename Params, typename Name>
- inline int _pj_get_param_i(Params const& pl, Name const& name)
- {
- int res = 0;
- _pj_param_i(pl, name, res);
- return res;
- }
- template <template <int> class Param, typename Params>
- inline int _pj_get_param_i(Params const& pl)
- {
- int res = 0;
- _pj_param_i<Param>(pl, res);
- return res;
- }
- template <typename T, typename Params, typename Name>
- inline T _pj_get_param_f(Params const& pl, Name const& name)
- {
- T res = 0;
- _pj_param_f(pl, name, res);
- return res;
- }
- template <typename T, template <typename> class Param, typename Params>
- inline T _pj_get_param_f(Params const& pl)
- {
- T res = 0;
- _pj_param_f<Param>(pl, res);
- return res;
- }
- template <typename T, typename Params, typename Name>
- inline T _pj_get_param_r(Params const& pl, Name const& name)
- {
- T res = 0;
- _pj_param_r(pl, name, res);
- return res;
- }
- template <typename T, template <typename> class Param, typename Params>
- inline T _pj_get_param_r(Params const& pl)
- {
- T res = 0;
- _pj_param_r<Param>(pl, res);
- return res;
- }
- inline std::string pj_get_param_s(srs::detail::proj4_parameters const& pl, std::string const& name)
- {
- std::string res;
- pj_param_s(pl, name, res);
- return res;
- }
- template <typename Param, typename Name>
- inline bool pj_param_exists(srs::detail::proj4_parameters const& pl,
- std::string const& sn,
- Name const& )
- {
- return pj_param_exists(pl, sn);
- }
- template <template <typename> class Param, typename Name>
- inline bool pj_param_exists(srs::detail::proj4_parameters const& pl,
- std::string const& sn,
- Name const& )
- {
- return pj_param_exists(pl, sn);
- }
- template <typename Param, typename T, typename Name>
- inline bool pj_param_exists(srs::dpar::parameters<T> const& pl,
- std::string const& ,
- Name const& n)
- {
- return pj_param_exists(pl, n);
- }
- template <template <typename> class Param, typename T, typename Name>
- inline bool pj_param_exists(srs::dpar::parameters<T> const& pl,
- std::string const& ,
- Name const& n)
- {
- return pj_param_exists(pl, n);
- }
- template <typename Param, typename ...Ps, typename Name>
- inline bool pj_param_exists(srs::spar::parameters<Ps...> const& pl,
- std::string const& ,
- Name const& )
- {
- return pj_param_exists<Param>(pl);
- }
- template <template <typename> class Param, typename ...Ps, typename Name>
- inline bool pj_param_exists(srs::spar::parameters<Ps...> const& pl,
- std::string const& ,
- Name const& )
- {
- return pj_param_exists<Param>(pl);
- }
- template <typename Param>
- inline bool pj_get_param_b(srs::detail::proj4_parameters const& pl,
- std::string const& sn,
- srs::dpar::name_be const& )
- {
- return _pj_get_param_b(pl, sn);
- }
- template <typename Param, typename T>
- inline bool pj_get_param_b(srs::dpar::parameters<T> const& pl,
- std::string const& ,
- srs::dpar::name_be const& n)
- {
- return _pj_get_param_b(pl, n);
- }
- template <typename Param, typename ...Ps>
- inline bool pj_get_param_b(srs::spar::parameters<Ps...> const& pl,
- std::string const& ,
- srs::dpar::name_be const& )
- {
- return _pj_get_param_b<Param>(pl);
- }
- template <template <int> class Param>
- inline bool pj_param_i(srs::detail::proj4_parameters const& pl,
- std::string const& sn,
- srs::dpar::name_i const& ,
- int & par)
- {
- return _pj_param_i(pl, sn, par);
- }
- template <template <int> class Param, typename T>
- inline bool pj_param_i(srs::dpar::parameters<T> const& pl,
- std::string const& ,
- srs::dpar::name_i const& n,
- int & par)
- {
- return _pj_param_i(pl, n, par);
- }
- template <template <int> class Param, typename ...Ps>
- inline bool pj_param_i(srs::spar::parameters<Ps...> const& pl,
- std::string const& ,
- srs::dpar::name_i const& ,
- int & par)
- {
- return _pj_param_i<Param>(pl, par);
- }
- template <template <int> class Param>
- inline int pj_get_param_i(srs::detail::proj4_parameters const& pl,
- std::string const& sn,
- srs::dpar::name_i const& )
- {
- return _pj_get_param_i(pl, sn);
- }
- template <template <int> class Param, typename T>
- inline int pj_get_param_i(srs::dpar::parameters<T> const& pl,
- std::string const& ,
- srs::dpar::name_i const& n)
- {
- return _pj_get_param_i(pl, n);
- }
- template <template <int> class Param, typename ...Ps>
- inline bool pj_get_param_i(srs::spar::parameters<Ps...> const& pl,
- std::string const& ,
- srs::dpar::name_i const& )
- {
- return _pj_get_param_i<Param>(pl);
- }
- template <template <typename> class Param, typename T>
- inline bool pj_param_f(srs::detail::proj4_parameters const& pl,
- std::string const& sn,
- srs::dpar::name_f const& ,
- T & par)
- {
- return _pj_param_f(pl, sn, par);
- }
- template <template <typename> class Param, typename T>
- inline bool pj_param_f(srs::dpar::parameters<T> const& pl,
- std::string const& ,
- srs::dpar::name_f const& n,
- T & par)
- {
- return _pj_param_f(pl, n, par);
- }
- template <template <typename> class Param, typename ...Ps, typename T>
- inline bool pj_param_f(srs::spar::parameters<Ps...> const& pl,
- std::string const& ,
- srs::dpar::name_f const& ,
- T & par)
- {
- return _pj_param_f<Param>(pl, par);
- }
- template <typename T, template <typename> class Param>
- inline T pj_get_param_f(srs::detail::proj4_parameters const& pl,
- std::string const& sn,
- srs::dpar::name_f const& )
- {
- return _pj_get_param_f<T>(pl, sn);
- }
- template <typename T, template <typename> class Param>
- inline T pj_get_param_f(srs::dpar::parameters<T> const& pl,
- std::string const& ,
- srs::dpar::name_f const& n)
- {
- return _pj_get_param_f<T>(pl, n);
- }
- template <typename T, template <typename> class Param, typename ...Ps>
- inline T pj_get_param_f(srs::spar::parameters<Ps...> const& pl,
- std::string const& ,
- srs::dpar::name_f const& )
- {
- return _pj_get_param_f<T, Param>(pl);
- }
- template <template <typename> class Param, typename T>
- inline bool pj_param_r(srs::detail::proj4_parameters const& pl,
- std::string const& sn,
- srs::dpar::name_r const& ,
- T & par)
- {
- return _pj_param_r(pl, sn, par);
- }
- template <template <typename> class Param, typename T>
- inline bool pj_param_r(srs::dpar::parameters<T> const& pl,
- std::string const& ,
- srs::dpar::name_r const& n,
- T & par)
- {
- return _pj_param_r(pl, n, par);
- }
- template <template <typename> class Param, typename ...Ps, typename T>
- inline bool pj_param_r(srs::spar::parameters<Ps...> const& pl,
- std::string const& ,
- srs::dpar::name_r const& ,
- T & par)
- {
- return _pj_param_r<Param>(pl, par);
- }
- template <typename T, template <typename> class Param>
- inline T pj_get_param_r(srs::detail::proj4_parameters const& pl,
- std::string const& sn,
- srs::dpar::name_r const& )
- {
- return _pj_get_param_r<T>(pl, sn);
- }
- template <typename T, template <typename> class Param>
- inline T pj_get_param_r(srs::dpar::parameters<T> const& pl,
- std::string const& ,
- srs::dpar::name_r const& n)
- {
- return _pj_get_param_r<T>(pl, n);
- }
- template <typename T, template <typename> class Param, typename ...Ps>
- inline T pj_get_param_r(srs::spar::parameters<Ps...> const& pl,
- std::string const& ,
- srs::dpar::name_r const& )
- {
- return _pj_get_param_r<T, Param>(pl);
- }
- }
- }}}
- #endif
|