SWMMVis  6.0.0-alpha.4
Qt6/C++ GIS-based graphical user interface for the SWMMVis engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
featuregeometry.h
Go to the documentation of this file.
1
28#ifndef FEATUREGEOMETRY_H
29#define FEATUREGEOMETRY_H
30
31#include <QPointF>
32#include <QPolygonF>
33#include <QRectF>
34#include <QString>
35#include <QVector>
36
37class OGRGeometry;
38class OGRSpatialReference;
39
41
51enum class GeometryType
52{
53 None = 0,
54 Point,
56 Polygon,
60};
61
63[[nodiscard]] QString geometryTypeLabel(GeometryType t);
64
67[[nodiscard]] QString geometryTypeToken(GeometryType t);
68
70[[nodiscard]] GeometryType geometryTypeFromToken(const QString &token);
71
73[[nodiscard]] bool isMultiType(GeometryType t);
74
77
89struct Ring
90{
91 QVector<QPointF> pts;
94 QVector<double> z;
95
96 [[nodiscard]] bool isEmpty() const { return pts.isEmpty(); }
97 [[nodiscard]] int size() const { return pts.size(); }
98
102 [[nodiscard]] bool hasZ() const
103 { return !pts.isEmpty() && z.size() == pts.size(); }
104
106 [[nodiscard]] double zAt(int i) const;
107
110 void syncZLength();
111
113 void clearZ() { z.clear(); }
114
116 void ensureZ();
117
118 [[nodiscard]] QPolygonF toPolygon() const;
119 [[nodiscard]] QRectF boundingRect() const;
120
123 [[nodiscard]] double signedArea() const;
124
126 [[nodiscard]] double length2D() const;
127
130 [[nodiscard]] bool isSimpleRing() const;
131
135 void normalizeCCW();
136
138 [[nodiscard]] bool containsPoint(const QPointF &p) const;
139
141 void insertVertex(int index, const QPointF &p, double zVal);
142
144 void removeVertex(int index);
145
147 void moveVertex(int index, const QPointF &p);
148
158 int densify(double spacing);
159
160 [[nodiscard]] bool operator==(const Ring &o) const;
161 [[nodiscard]] bool operator!=(const Ring &o) const { return !(*this == o); }
162};
163
172struct Part
173{
175 QVector<Ring> holes;
176
177 [[nodiscard]] bool isEmpty() const { return exterior.isEmpty(); }
178 [[nodiscard]] QRectF boundingRect() const;
179
182 [[nodiscard]] double netArea() const;
183
186 [[nodiscard]] bool containsPoint(const QPointF &p) const;
187
191
192 [[nodiscard]] bool operator==(const Part &o) const;
193 [[nodiscard]] bool operator!=(const Part &o) const { return !(*this == o); }
194};
195
205{
206public:
207 FeatureGeometry() = default;
208 explicit FeatureGeometry(GeometryType type) : m_type(type) {}
209
210 [[nodiscard]] GeometryType type() const { return m_type; }
211 void setType(GeometryType t) { m_type = t; }
212
213 [[nodiscard]] bool isEmpty() const;
214 [[nodiscard]] bool isValid() const { return m_type != GeometryType::None && !isEmpty(); }
215
216 [[nodiscard]] const QVector<Part> &parts() const { return m_parts; }
217 [[nodiscard]] QVector<Part> &parts() { return m_parts; }
218 [[nodiscard]] int partCount() const { return m_parts.size(); }
219
220 void addPart(const Part &p) { m_parts.append(p); }
221 void clear() { m_parts.clear(); }
222
224 [[nodiscard]] int vertexCount() const;
225
227 [[nodiscard]] bool hasZ() const;
228
231 [[nodiscard]] int unsampledZCount() const;
232
234 [[nodiscard]] bool zRange(double &minZ, double &maxZ) const;
235
236 [[nodiscard]] QRectF boundingRect() const;
237
239 [[nodiscard]] double area() const;
240
242 [[nodiscard]] double length() const;
243
245 void setHasZ(bool on);
246
249 int densify(double spacing);
250
252
264 [[nodiscard]] bool validate(GeometryType expected, QString *reason = nullptr) const;
265
266 // ----- OGR bridge -----------------------------------------------------
267
274 [[nodiscard]] static FeatureGeometry fromOGR(const OGRGeometry *g);
275
282 [[nodiscard]] OGRGeometry *toOGR(OGRSpatialReference *srs = nullptr) const;
283
286 [[nodiscard]] static int ogrTypeFor(GeometryType t, bool withZ);
287
288 [[nodiscard]] bool operator==(const FeatureGeometry &o) const;
289 [[nodiscard]] bool operator!=(const FeatureGeometry &o) const { return !(*this == o); }
290
291private:
293 QVector<Part> m_parts;
294};
295
296} // namespace openswmmvis::feature
297
298#endif // FEATUREGEOMETRY_H
A complete feature geometry: a type plus zero or more parts.
Definition featuregeometry.h:205
void addPart(const Part &p)
Definition featuregeometry.h:220
OGRGeometry * toOGR(OGRSpatialReference *srs=nullptr) const
Build a new OGR geometry. The CALLER OWNS the result and must release it with OGRGeometryFactory::des...
Definition featuregeometry.cpp:669
bool operator==(const FeatureGeometry &o) const
Definition featuregeometry.cpp:748
bool validate(GeometryType expected, QString *reason=nullptr) const
Structural check against expected.
Definition featuregeometry.cpp:427
bool operator!=(const FeatureGeometry &o) const
Definition featuregeometry.h:289
void setHasZ(bool on)
Definition featuregeometry.cpp:404
static FeatureGeometry fromOGR(const OGRGeometry *g)
Build a FeatureGeometry from g.
Definition featuregeometry.cpp:591
void normalizeOrientation()
Definition featuregeometry.cpp:422
int vertexCount() const
Definition featuregeometry.cpp:314
int densify(double spacing)
Definition featuregeometry.cpp:412
bool isValid() const
Definition featuregeometry.h:214
static int ogrTypeFor(GeometryType t, bool withZ)
Definition featuregeometry.cpp:733
int unsampledZCount() const
Definition featuregeometry.cpp:341
void setType(GeometryType t)
Definition featuregeometry.h:211
bool isEmpty() const
Definition featuregeometry.cpp:306
double length() const
Definition featuregeometry.cpp:397
QRectF boundingRect() const
Definition featuregeometry.cpp:379
QVector< Part > & parts()
Definition featuregeometry.h:217
FeatureGeometry(GeometryType type)
Definition featuregeometry.h:208
bool zRange(double &minZ, double &maxZ) const
Definition featuregeometry.cpp:355
const QVector< Part > & parts() const
Definition featuregeometry.h:216
GeometryType type() const
Definition featuregeometry.h:210
double area() const
Definition featuregeometry.cpp:390
bool hasZ() const
Definition featuregeometry.cpp:324
int partCount() const
Definition featuregeometry.h:218
void clear()
Definition featuregeometry.h:221
size_t i
Definition contourjob.cpp:27
const char * token
Definition diagramspec.cpp:20
DiagramType t
Definition diagramspec.cpp:20
ArrowPlacement p
Definition linesymbollayer.cpp:27
int index
Position in m_quadRegions / m_quadReports.
Definition meshgenerator.cpp:153
Definition featuregeometry.h:40
bool isMultiType(GeometryType t)
True when t is one of the Multi* kinds.
Definition featuregeometry.cpp:98
QString geometryTypeLabel(GeometryType t)
Human label for t, for combo boxes and metadata rows.
Definition featuregeometry.cpp:56
QString geometryTypeToken(GeometryType t)
Stable token for t, for .oswp persistence. Round-trips through geometryTypeFromToken.
Definition featuregeometry.cpp:70
GeometryType geometryTypeFromToken(const QString &token)
Inverse of geometryTypeToken; GeometryType::None when unknown.
Definition featuregeometry.cpp:84
GeometryType toMultiType(GeometryType t)
The Multi* kind corresponding to t (identity for Multi* inputs).
Definition featuregeometry.cpp:105
GeometryType
Geometry kinds an editable feature layer can hold.
Definition featuregeometry.h:52
One part of a geometry: a polygon (exterior + holes), a line run, or a single point.
Definition featuregeometry.h:173
bool operator==(const Part &o) const
Definition featuregeometry.cpp:297
bool operator!=(const Part &o) const
Definition featuregeometry.h:193
bool containsPoint(const QPointF &p) const
Definition featuregeometry.cpp:279
Ring exterior
Definition featuregeometry.h:174
QRectF boundingRect() const
Definition featuregeometry.cpp:266
double netArea() const
Definition featuregeometry.cpp:271
QVector< Ring > holes
Interior rings; polygon parts only.
Definition featuregeometry.h:175
bool isEmpty() const
Definition featuregeometry.h:177
void normalizeOrientation()
Definition featuregeometry.cpp:287
One ordered run of vertices, with optional per-vertex Z.
Definition featuregeometry.h:90
int densify(double spacing)
Insert intermediate vertices so no segment is longer than spacing map units.
Definition featuregeometry.cpp:208
void insertVertex(int index, const QPointF &p, double zVal)
Definition featuregeometry.cpp:188
void moveVertex(int index, const QPointF &p)
Definition featuregeometry.cpp:202
void syncZLength()
Definition featuregeometry.cpp:125
bool operator==(const Ring &o) const
Definition featuregeometry.cpp:249
double signedArea() const
Definition featuregeometry.cpp:151
bool containsPoint(const QPointF &p) const
Definition featuregeometry.cpp:182
bool operator!=(const Ring &o) const
Definition featuregeometry.h:161
QPolygonF toPolygon() const
Definition featuregeometry.cpp:138
QVector< QPointF > pts
Definition featuregeometry.h:91
void normalizeCCW()
Definition featuregeometry.cpp:171
void ensureZ()
Definition featuregeometry.cpp:132
QVector< double > z
Definition featuregeometry.h:94
int size() const
Definition featuregeometry.h:97
void clearZ()
Definition featuregeometry.h:113
bool isSimpleRing() const
Definition featuregeometry.cpp:165
double length2D() const
Definition featuregeometry.cpp:157
bool isEmpty() const
Definition featuregeometry.h:96
double zAt(int i) const
Definition featuregeometry.cpp:119
QRectF boundingRect() const
Definition featuregeometry.cpp:146
void removeVertex(int index)
Definition featuregeometry.cpp:195
bool hasZ() const
Definition featuregeometry.h:102