boat
C++23 geospatial library
Loading...
Searching...
No Matches
transform.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_GEOMETRY_TRANSFORM_HPP
4#define BOAT_GEOMETRY_TRANSFORM_HPP
5
6#include <boat/detail/numbers.hpp>
7#include <boat/detail/string.hpp>
9#include <boost/geometry/strategies/transform/srs_transformer.hpp>
10#include <optional>
11
12namespace boat::geometry {
13
14static auto const lonlat = srs::proj4{" +proj=lonlat +datum=WGS84 +no_defs"};
15
17inline auto ortho(geographic::point const& v)
18{
19 return srs::proj4{concat( //
20 " +proj=ortho +x_0=0 +y_0=0 +units=m +no_defs +a=",
21 numbers::earth::equatorial_radius,
22 " +b=",
23 numbers::earth::polar_radius,
24 " +lat_0=",
25 v.y(),
26 " +lon_0=",
27 v.x())};
28}
29
31inline srs_variant to_srs_variant(auto const& meta)
32{
33 return meta.epsg > 0 ? srs_variant{srs::epsg{meta.epsg}}
34 : !meta.proj4.empty() ? srs_variant{srs::proj4{meta.proj4}}
35 : throw std::runtime_error("no SRS");
36}
37
39auto transformation(srs_spec auto const& a, srs_spec auto const& b)
40{
41 if constexpr (specialized<decltype(a), std::variant>)
42 return std::visit([&](auto&& a) { return transformation(a, b); }, a);
43 else if constexpr (specialized<decltype(b), std::variant>)
44 return std::visit([&](auto&& b) { return transformation(a, b); }, b);
45 else
46 return srs::transformation<>(a, b);
47}
48
50auto transformation(srs_spec auto const& v)
51{
52 return transformation(lonlat, v);
53}
54
55template <projection_or_transformation T>
56auto srs_forward(T const& v)
57{
58 return boost::geometry::strategy::transform::srs_forward_transformer<T>{v};
59}
60
61template <projection_or_transformation T>
62auto srs_inverse(T const& v)
63{
64 return boost::geometry::strategy::transform::srs_inverse_transformer<T>{v};
65}
66
68 boost::geometry::strategy::transform::matrix_transformer<double, 2, 2>;
69
70inline auto mat_inverse(matrix const& v)
71{
72 return mat_forward{inverse(v)};
73}
74
75template <tagged T1, same_tag<T1> T2, class Strategy>
76bool transform(T1 const& geom1, T2& geom2, Strategy const& strategy)
77{
78 return overloaded{
79 [&](single auto const& a, single auto& b) {
80 return boost::geometry::transform(a, b = {}, strategy);
81 },
82 [](this auto&& self, multi auto const& a, multi auto& b) -> bool {
83 b = {};
84 for (auto const& v : a)
85 if (!self(v, b.emplace_back()))
86 b.pop_back();
87 return !b.empty();
88 },
89 [](this auto&& self, dynamic auto const& a, dynamic auto& b) -> bool {
90 auto vis = [&]<class T>(T const& v) {
91 return self(v, b.template emplace<variant_index_v<T>>());
92 };
93 return std::visit(vis, a);
94 }}(geom1, geom2);
95}
96
98auto transform(auto const&... strategies)
99{
100 return [=]<tagged T>(T a) {
101 T b;
102 return (... && (b = std::move(a), transform(b, a, strategies)))
103 ? std::optional{std::move(a)}
104 : std::nullopt;
105 };
106}
107
108} // namespace boat::geometry
109
110#endif // BOAT_GEOMETRY_TRANSFORM_HPP
Definition vocabulary.hpp:43
Definition vocabulary.hpp:49
Definition vocabulary.hpp:64
Definition vocabulary.hpp:37
Definition vocabulary.hpp:28
Definition algorithm.hpp:9
bool transform(T1 const &geom1, T2 &geom2, Strategy const &strategy)
Definition transform.hpp:76
std::variant< srs::epsg, srs::proj4 > srs_variant
Definition vocabulary.hpp:115
constexpr auto variant_index_v
Definition vocabulary.hpp:124
auto ortho(geographic::point const &v)
Orthographic SRS centered at v.
Definition transform.hpp:17
auto mat_inverse(matrix const &v)
Definition transform.hpp:70
boost::geometry::strategy::transform::matrix_transformer< double, 2, 2 > mat_forward
Definition transform.hpp:67
auto srs_forward(T const &v)
Definition transform.hpp:56
auto transformation(srs_spec auto const &a, srs_spec auto const &b)
Creates a transformation from source a to target b.
Definition transform.hpp:39
auto srs_inverse(T const &v)
Definition transform.hpp:62
boost::qvm::mat< double, 3, 3 > matrix
Definition vocabulary.hpp:114
srs_variant to_srs_variant(auto const &meta)
Prefers a positive epsg code to proj4; throws if neither is available.
Definition transform.hpp:31
model::d2::point_xy< double, boost::geometry::cs::geographic< boost::geometry::degree > > point
Definition vocabulary.hpp:75