Shapes
GIS made easy, a lightweight header-only planar geometry library for Modern C++
utils.hpp
1 #pragma once
2 
3 #include <ciso646>
4 #include <simo/geom/detail/types.hpp>
5 
6 namespace simo
7 {
8 namespace shapes
9 {
10 namespace utils
11 {
12 
21 dimension_type get_dim(geometry_type geom_type) noexcept
22 {
23  int value = static_cast<int>(geom_type);
24  if (value >= 1000 and value < 2000)
25  {
26  return dimension_type::XYZ;
27  }
28  if (value >= 2000 and value < 3000)
29  {
30  return dimension_type::XYM;
31  }
32  if (value >= 3000)
33  {
34  return dimension_type::XYZM;
35  }
36  return dimension_type::XY;
37 }
38 
47 dimension_type get_dim(int8_t ndim) noexcept
48 {
49  switch (ndim)
50  {
51  case 3:
52  return dimension_type::XYZ;
53  case 4:
54  return dimension_type::XYZM;
55  default:
56  return dimension_type::XY;
57  }
58 }
59 
68 int8_t get_ndim(dimension_type dim_type) noexcept
69 {
70  switch (dim_type)
71  {
72  case dimension_type::XYZM:
73  return 4;
74  case dimension_type::XYZ:
75  case dimension_type::XYM:
76  return 3;
77  default:
78  return 2;
79  }
80 }
81 
90 int8_t get_ndim(geometry_type geom_type) noexcept
91 {
92  return get_ndim(get_dim(geom_type));
93 }
94 
103 geometry_type get_geom_type(geometry_type geom_type) noexcept
104 {
105  switch (geom_type)
106  {
107  case geometry_type::POINT:
108  case geometry_type::POINTZ:
109  case geometry_type::POINTM:
110  case geometry_type::POINTZM:
111  return geometry_type::POINT;
112  case geometry_type::MULTIPOINT:
113  case geometry_type::MULTIPOINTZ:
114  case geometry_type::MULTIPOINTM:
115  case geometry_type::MULTIPOINTZM:
116  return geometry_type::MULTIPOINT;
117  case geometry_type::LINESTRING:
118  case geometry_type::LINESTRINGZ:
119  case geometry_type::LINESTRINGM:
120  case geometry_type::LINESTRINGZM:
121  return geometry_type::LINESTRING;
122  case geometry_type::MULTILINESTRING:
123  case geometry_type::MULTILINESTRINGZ:
124  case geometry_type::MULTILINESTRINGM:
125  case geometry_type::MULTILINESTRINGZM:
126  return geometry_type::MULTILINESTRING;
127  case geometry_type::POLYGON:
128  case geometry_type::POLYGONZ:
129  case geometry_type::POLYGONM:
130  case geometry_type::POLYGONZM:
131  return geometry_type::POLYGON;
132  case geometry_type::MULTIPOLYGON:
133  case geometry_type::MULTIPOLYGONZ:
134  case geometry_type::MULTIPOLYGONM:
135  case geometry_type::MULTIPOLYGONZM:
136  return geometry_type::MULTIPOLYGON;
137  case geometry_type::GEOMETRYCOLLECTION:
138  case geometry_type::GEOMETRYCOLLECTIONZ:
139  case geometry_type::GEOMETRYCOLLECTIONM:
140  case geometry_type::GEOMETRYCOLLECTIONZM:
141  return geometry_type::GEOMETRYCOLLECTION;
142  case geometry_type::CIRCULARSTRING:
143  case geometry_type::CIRCULARSTRINGZ:
144  case geometry_type::CIRCULARSTRINGM:
145  case geometry_type::CIRCULARSTRINGZM:
146  return geometry_type::CIRCULARSTRING;
147  case geometry_type::COMPOUNDCURVE:
148  case geometry_type::COMPOUNDCURVEZ:
149  case geometry_type::COMPOUNDCURVEM:
150  case geometry_type::COMPOUNDCURVEZM:
151  return geometry_type::COMPOUNDCURVE;
152  case geometry_type::CURVEPOLYGON:
153  case geometry_type::CURVEPOLYGONZ:
154  case geometry_type::CURVEPOLYGONM:
155  case geometry_type::CURVEPOLYGONZM:
156  return geometry_type::CURVEPOLYGON;
157  case geometry_type::MULTICURVE:
158  case geometry_type::MULTICURVEZ:
159  case geometry_type::MULTICURVEM:
160  case geometry_type::MULTICURVEZM:
161  return geometry_type::MULTICURVE;
162  case geometry_type::MULTISURFACE:
163  case geometry_type::MULTISURFACEZ:
164  case geometry_type::MULTISURFACEM:
165  case geometry_type::MULTISURFACEZM:
166  return geometry_type::MULTISURFACE;
167  case geometry_type::CURVE:
168  case geometry_type::CURVEZ:
169  case geometry_type::CURVEM:
170  case geometry_type::CURVEZM:
171  return geometry_type::CURVE;
172  case geometry_type::SURFACE:
173  case geometry_type::SURFACEZ:
174  case geometry_type::SURFACEM:
175  case geometry_type::SURFACEZM:
176  return geometry_type::SURFACE;
177  case geometry_type::POLYHEDRALSURFACE:
178  case geometry_type::POLYHEDRALSURFACEZ:
179  case geometry_type::POLYHEDRALSURFACEM:
180  case geometry_type::POLYHEDRALSURFACEZM:
181  return geometry_type::POLYHEDRALSURFACE;
182  case geometry_type::TIN:
183  case geometry_type::TINZ:
184  case geometry_type::TINM:
185  case geometry_type::TINZM:
186  return geometry_type::TIN;
187  default:
188  return geometry_type::GEOMETRY;
189  }
190 }
191 
198 bool is_point(geometry_type geom_type) noexcept
199 {
200  return geom_type == geometry_type::POINT or geom_type == geometry_type::POINTZ or geom_type == geometry_type::POINTM or geom_type == geometry_type::POINTZM;
201 }
202 
209 bool is_multipoint(geometry_type geom_type) noexcept
210 {
211  return geom_type == geometry_type::MULTIPOINT or geom_type == geometry_type::MULTIPOINTZ or geom_type == geometry_type::MULTIPOINTM or geom_type == geometry_type::MULTIPOINTZM;
212 }
213 
220 bool is_linestring(geometry_type geom_type) noexcept
221 {
222  return geom_type == geometry_type::LINESTRING or geom_type == geometry_type::LINESTRINGZ or geom_type == geometry_type::LINESTRINGM or geom_type == geometry_type::LINESTRINGZM;
223 }
224 
231 bool is_multilinestring(geometry_type geom_type) noexcept
232 {
233  return geom_type == geometry_type::MULTILINESTRING or geom_type == geometry_type::MULTILINESTRINGZ or geom_type == geometry_type::MULTILINESTRINGM or geom_type == geometry_type::MULTILINESTRINGZM;
234 }
235 
242 bool is_polygon(geometry_type geom_type) noexcept
243 {
244  return geom_type == geometry_type::POLYGON or geom_type == geometry_type::POLYGONZ or geom_type == geometry_type::POLYGONM or geom_type == geometry_type::POLYGONZM;
245 }
246 
253 bool is_multipolygon(geometry_type geom_type) noexcept
254 {
255  return geom_type == geometry_type::MULTIPOLYGON or geom_type == geometry_type::MULTIPOLYGONZ or geom_type == geometry_type::MULTIPOLYGONM or geom_type == geometry_type::MULTIPOLYGONZM;
256 }
257 
258 } // namespace utils
259 } // namespace shapes
260 } // namespace simo