code.hpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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_PROJECTIONS_CODE_HPP
  8. #define BOOST_GEOMETRY_PROJECTIONS_CODE_HPP
  9. #include <cmath>
  10. #include <boost/geometry/srs/projections/dpar.hpp>
  11. namespace boost { namespace geometry { namespace projections
  12. {
  13. #ifndef DOXYGEN_NO_DETAIL
  14. namespace detail
  15. {
  16. struct code_parameter {
  17. constexpr code_parameter() : id{-1}, val_i{-1} {}
  18. constexpr code_parameter(srs::dpar::name_f n, double v) : id{n}, val_d{v}, var_type{2} {}
  19. constexpr code_parameter(srs::dpar::name_r n, double v) : id{n}, val_d{v}, var_type{2} {}
  20. constexpr code_parameter(srs::dpar::name_i n, int v) : id{n}, val_i{v} {}
  21. constexpr code_parameter(srs::dpar::name_be n, bool v = true) : id{n}, val_b{v} {}
  22. constexpr code_parameter(srs::dpar::name_datum n, srs::dpar::value_datum v) : id{n}, val_i{v} {}
  23. constexpr code_parameter(srs::dpar::value_datum v) : id{srs::dpar::datum}, val_i{v} {}
  24. constexpr code_parameter(srs::dpar::name_ellps n, srs::dpar::value_ellps v) : id{n}, val_i{v} {}
  25. constexpr code_parameter(srs::dpar::value_ellps v) : id{srs::dpar::ellps}, val_i{v} {}
  26. constexpr code_parameter(srs::dpar::name_mode n, srs::dpar::value_mode v) : id{n}, val_i{v} {}
  27. constexpr code_parameter(srs::dpar::value_mode v) : id{srs::dpar::mode}, val_i{v} {}
  28. constexpr code_parameter(srs::dpar::name_orient n, srs::dpar::value_orient v) : id{srs::dpar::mode}, val_i{v} {}
  29. constexpr code_parameter(srs::dpar::value_orient v) : id{srs::dpar::orient}, val_i{v} {}
  30. constexpr code_parameter(srs::dpar::name_pm n, srs::dpar::value_pm v) : id{n}, val_i{v} {}
  31. constexpr code_parameter(srs::dpar::value_pm v) : id{srs::dpar::pm}, val_i{v} {}
  32. constexpr code_parameter(srs::dpar::name_pm n, double v) : id{n}, val_d{v}, var_type{2} {}
  33. constexpr code_parameter(srs::dpar::name_proj n, srs::dpar::value_proj v) : id{n}, val_i{v} {}
  34. constexpr code_parameter(srs::dpar::value_proj v) : id{srs::dpar::proj}, val_i{v} {}
  35. constexpr code_parameter(srs::dpar::name_sweep n, srs::dpar::value_sweep v) : id{n}, val_i{v} {}
  36. constexpr code_parameter(srs::dpar::value_sweep v) : id{srs::dpar::sweep}, val_i{v} {}
  37. constexpr code_parameter(srs::dpar::name_units n, srs::dpar::value_units v) : id{n}, val_i{v} {}
  38. constexpr code_parameter(srs::dpar::value_units v) : id{srs::dpar::units}, val_i{v} {}
  39. int id;
  40. union {
  41. bool val_b;
  42. int val_i;
  43. double val_d;
  44. };
  45. int var_type = 1;
  46. inline explicit operator srs::dpar::parameter<double>() const {
  47. using namespace srs::dpar;
  48. using p = parameter<double>;
  49. if (id == -1) return p{};
  50. if (id <= y_0) return p(static_cast<name_f>(id), val_d);
  51. if (id <= tilt) return p(static_cast<name_r>(id), val_d);
  52. if (id <= zone) return p(static_cast<name_i>(id), val_i);
  53. if (id <= south) return p(static_cast<name_be>(id), val_b);
  54. if (id == datum) return p(static_cast<name_datum>(id), static_cast<value_datum>(val_i));
  55. if (id == ellps) return p(static_cast<name_ellps>(id), static_cast<value_ellps>(val_i));
  56. if (id == mode) return p(static_cast<name_mode>(id), static_cast<value_mode>(val_i));
  57. if (id == orient) return p(static_cast<name_orient>(id), static_cast<value_orient>(val_i));
  58. if (id == pm && var_type == 1) return p(static_cast<name_pm>(id), static_cast<value_pm>(val_i));
  59. if (id == pm && var_type == 2) return p(static_cast<name_pm>(id), val_d);
  60. if (id <= proj) return p(static_cast<name_proj>(id), static_cast<value_proj>(val_i));
  61. if (id == name_sweep::sweep) return p(static_cast<name_sweep>(id), static_cast<value_sweep>(val_i));
  62. if (id == units) return p(static_cast<name_units>(id), static_cast<value_units>(val_i));
  63. return p{};
  64. }
  65. };
  66. struct code_element
  67. {
  68. constexpr code_element(int code,
  69. std::array<code_parameter, 13> const& parameters,
  70. std::array<double, 7> towgs84 =
  71. {INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY})
  72. : code{code}, parameters{parameters}, towgs84{towgs84} {}
  73. constexpr code_element() : code{-1}, parameters{}, towgs84{} {}
  74. int code;
  75. std::array<code_parameter, 13> parameters;
  76. std::array<double, 7> towgs84;
  77. srs::dpar::parameters<double> to_parameters() const {
  78. srs::dpar::parameters<double> out;
  79. bool towgs84_to_be_inserted = towgs84[0] != INFINITY;
  80. for (const auto& p : parameters)
  81. {
  82. if (towgs84_to_be_inserted && (p.id == srs::dpar::units || p.id == srs::dpar::no_defs))
  83. {
  84. towgs84_to_be_inserted = false;
  85. out(srs::dpar::towgs84, towgs84);
  86. }
  87. out.add(p);
  88. if (p.id == srs::dpar::no_defs) break;
  89. }
  90. return out;
  91. }
  92. };
  93. struct code_element_less
  94. {
  95. inline bool operator()(code_element const& l, int code) const
  96. {
  97. return l.code < code;
  98. }
  99. };
  100. }
  101. #endif // DOXYGEN_NO_DETAIL
  102. }}} // namespace boost::geometry::projections
  103. #endif