3#ifndef BOAT_GEOMETRY_TRANSFORM_HPP
4#define BOAT_GEOMETRY_TRANSFORM_HPP
6#include <boat/detail/numbers.hpp>
7#include <boat/detail/string.hpp>
9#include <boost/geometry/strategies/transform/srs_transformer.hpp>
14static auto const lonlat = srs::proj4{
" +proj=lonlat +datum=WGS84 +no_defs"};
19 return srs::proj4{concat(
20 " +proj=ortho +x_0=0 +y_0=0 +units=m +no_defs +a=",
21 numbers::earth::equatorial_radius,
23 numbers::earth::polar_radius,
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");
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);
46 return srs::transformation<>(a, b);
55template <projection_or_transformation T>
58 return boost::geometry::strategy::transform::srs_forward_transformer<T>{v};
61template <projection_or_transformation T>
64 return boost::geometry::strategy::transform::srs_inverse_transformer<T>{v};
68 boost::geometry::strategy::transform::matrix_transformer<double, 2, 2>;
75template <tagged T1, same_tag<T1> T2,
class Strategy>
76bool transform(T1
const& geom1, T2& geom2, Strategy
const& strategy)
80 return boost::geometry::transform(a, b = {}, strategy);
82 [](
this auto&& self,
multi auto const& a,
multi auto& b) ->
bool {
84 for (
auto const& v : a)
85 if (!self(v, b.emplace_back()))
89 [](
this auto&& self,
dynamic auto const& a,
dynamic auto& b) ->
bool {
90 auto vis = [&]<
class T>(T const& v) {
93 return std::visit(vis, a);
100 return [=]<
tagged T>(T a) {
102 return (... && (b = std::move(a),
transform(b, a, strategies)))
103 ? std::optional{std::move(a)}
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