boat
C++23 geospatial library
Loading...
Searching...
No Matches
vocabulary.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_GEOMETRY_VOCABULARY_HPP
4#define BOAT_GEOMETRY_VOCABULARY_HPP
5
6#include <boat/detail/utility.hpp>
7#include <boost/geometry.hpp>
8#include <boost/geometry/geometries/adapted/std_variant.hpp>
9#include <boost/geometry/srs/epsg.hpp>
10#include <boost/geometry/srs/transformation.hpp>
11#include <map>
12
13namespace boat::geometry {
14
15namespace model = boost::geometry::model;
16namespace srs = boost::geometry::srs;
17
18template <class T>
19using tag = boost::geometry::tag<T>::type;
20
21template <class T>
22constexpr bool has_tag = !std::is_same_v<tag<T>, void>;
23
24template <class... Ts>
25constexpr bool has_tag<std::variant<Ts...>> = (has_tag<Ts> && ...);
26
27template <class T>
29
30template <class T>
31constexpr bool is_srs_spec = std::is_constructible_v<srs::projection<>, T>;
32
33template <class... Ts>
34constexpr bool is_srs_spec<std::variant<Ts...>> = (is_srs_spec<Ts> && ...);
35
36template <class T>
38
39template <class T>
40concept box = std::same_as<tag<T>, boost::geometry::box_tag>;
41
42template <class T>
43concept dynamic = std::same_as<tag<T>, boost::geometry::dynamic_geometry_tag>;
44
45template <class T>
46concept linestring = std::same_as<tag<T>, boost::geometry::linestring_tag>;
47
48template <class T>
49concept multi = std::derived_from<tag<T>, boost::geometry::multi_tag>;
50
51template <class T>
52concept multi_point = std::same_as<tag<T>, boost::geometry::multi_point_tag>;
53
54template <class T>
55concept point = std::same_as<tag<T>, boost::geometry::point_tag>;
56
57template <class T>
58concept polygon = std::same_as<tag<T>, boost::geometry::polygon_tag>;
59
60template <class T, class U>
61concept same_tag = std::same_as<tag<T>, tag<U>>;
62
63template <class T>
64concept single = std::derived_from<tag<T>, boost::geometry::single_tag>;
65
66template <class T>
68
69template <class T>
71 specialized<T, srs::projection> || specialized<T, srs::transformation>;
72
73template <class CoordSys>
74struct d2 {
75 using point = model::d2::point_xy<double, CoordSys>;
76 using linestring = model::linestring<point>;
77 using polygon = model::polygon<point, false, true>;
78 using multi_point = model::multi_point<point>;
79 using multi_linestring = model::multi_linestring<linestring>;
80 using multi_polygon = model::multi_polygon<polygon>;
81 using box = model::box<point>;
82 using segment = model::segment<point>;
83 using grid = std::map<double, multi_point>;
84
86
87 using variant = std::variant< //
88 point,
90 polygon,
95
96 struct geometry_collection : model::geometry_collection<variant> {
97 using model::geometry_collection<variant>::geometry_collection;
98 using boat_geometry_tag = boost::geometry::geometry_collection_tag;
99 };
100
102 {
103 return {g.x(), g.y()};
104 }
105
107 {
108 return {(*this)(g.min_corner()), (*this)(g.max_corner())};
109 }
110};
111
114using matrix = boost::qvm::mat<double, 3, 3>;
115using srs_variant = std::variant<srs::epsg, srs::proj4>;
116
117template <class T>
119
120template <class T>
121concept ogc99 = tagged<T> && std::convertible_to<T, typename d2_of<T>::variant>;
122
123template <class T>
124constexpr auto variant_index_v = variant_index<typename d2_of<T>::variant, T>();
125
126} // namespace boat::geometry
127
128template <class T>
129 requires requires { typename T::boat_geometry_tag; }
130struct boost::geometry::traits::tag<T> {
131 using type = T::boat_geometry_tag;
132};
133
134#endif // BOAT_GEOMETRY_VOCABULARY_HPP
Definition vocabulary.hpp:40
Definition vocabulary.hpp:67
Definition vocabulary.hpp:43
Definition vocabulary.hpp:46
Definition vocabulary.hpp:52
Definition vocabulary.hpp:49
Definition vocabulary.hpp:121
Definition vocabulary.hpp:55
Definition vocabulary.hpp:58
Definition vocabulary.hpp:61
Definition vocabulary.hpp:64
Definition vocabulary.hpp:37
Definition vocabulary.hpp:28
Definition algorithm.hpp:9
constexpr bool is_srs_spec
Definition vocabulary.hpp:31
std::variant< srs::epsg, srs::proj4 > srs_variant
Definition vocabulary.hpp:115
d2< boost::geometry::cs::geographic< boost::geometry::degree > > geographic
Definition vocabulary.hpp:113
constexpr bool has_tag
Definition vocabulary.hpp:22
constexpr auto variant_index_v
Definition vocabulary.hpp:124
d2< typename boost::geometry::coordinate_system< T >::type > d2_of
Definition vocabulary.hpp:118
boost::geometry::tag< T >::type tag
Definition vocabulary.hpp:19
d2< boost::geometry::cs::cartesian > cartesian
Definition vocabulary.hpp:112
boost::qvm::mat< double, 3, 3 > matrix
Definition vocabulary.hpp:114
Definition vocabulary.hpp:96
boost::geometry::geometry_collection_tag boat_geometry_tag
Definition vocabulary.hpp:98
Definition vocabulary.hpp:74
model::multi_polygon< polygon > multi_polygon
Definition vocabulary.hpp:80
d2< CoordSys >::box operator()(geometry::box auto const &g) const
Definition vocabulary.hpp:106
std::variant< point, linestring, polygon, multi_point, multi_linestring, multi_polygon, geometry_collection > variant
Definition vocabulary.hpp:87
model::d2::point_xy< double, CoordSys > point
Definition vocabulary.hpp:75
model::segment< point > segment
Definition vocabulary.hpp:82
std::map< double, multi_point > grid
Definition vocabulary.hpp:83
d2< CoordSys >::point operator()(geometry::point auto const &g) const
Definition vocabulary.hpp:101
model::multi_linestring< linestring > multi_linestring
Definition vocabulary.hpp:79
model::box< point > box
Definition vocabulary.hpp:81
T::boat_geometry_tag type
Definition vocabulary.hpp:131