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
dtmthinner.h
Go to the documentation of this file.
1
57#ifndef OPENSWMMVIS_MESH_DTMTHINNER_H
58#define OPENSWMMVIS_MESH_DTMTHINNER_H
59
60#include "map/mapextent.h"
61
62#include <QPointF>
63#include <QString>
64#include <QVector>
65
66#include <functional>
67
68class GDALDataset;
69
70namespace mesh {
71
78using DTMProgressFn = std::function<bool(double)>;
79
86{
87 qint64 maxGridBytes = qint64(2048) * 1024 * 1024;
88 qint64 maxRetainedPoints = 64ll * 1024 * 1024;
89};
90
93{
94 double gridSpacing = 0.0;
95 double normalDotThreshold = 0.95;
98 bool useAverageDot = false;
99 int maxPoints = 0;
104
105 // ── Poisson-disk minimum spacing (post-thinning reduction only) ──────────
106 // NOTE: these two fields are NOT consumed by DTMThinner. They are read by
107 // the mesh-generation pipeline, which applies the Poisson-disk filter in
108 // the MESH CRS after generatePoints()/readPixels() has returned and the
109 // candidates have been reprojected. Only ever removes surviving points.
110 bool useMinSpacing = false;
111 double minSpacing = 0.0;
112};
113
132{
133public:
134 DTMThinner();
135 ~DTMThinner();
136
137 DTMThinner(const DTMThinner &) = delete;
138 DTMThinner &operator=(const DTMThinner &) = delete;
139
140 bool open(const QString &filePath, int band = 1);
141 void close();
142 [[nodiscard]] bool isOpen() const noexcept;
143
161 [[nodiscard]] QVector<QPointF> generatePoints(const MapExtent &domain,
162 const DTMThinnerOptions &opts = {},
163 QVector<double> *outZ = nullptr,
164 const DTMProgressFn &progress = {},
165 const DTMThinnerLimits &limits = {}) const;
166
167 [[nodiscard]] double pixelSize() const;
168 [[nodiscard]] QString crsWkt() const;
169 [[nodiscard]] QString errorMsg() const { return m_errorMsg; }
170
173 [[nodiscard]] double sampleAt(double x, double y) const;
174
176 static constexpr qint64 kMaxReadBufBytesDefault = qint64(256) * 1024 * 1024;
177
178 // NOTE: these three constants shape multi-band thinning geometry and thus
179 // its OUTPUT for configurations that engage banding. Changing any of them
180 // requires bumping MeshStageCache::kFormatVersion (meshstagecache.h) so
181 // stale terrain-cache entries cannot be served.
183 static constexpr qint64 kMaxGridBytesDefault = qint64(2048) * 1024 * 1024;
185 static constexpr qint64 kMaxRetainedPointsDefault = 64ll * 1024 * 1024;
188 static constexpr int kMaxThinningHalo = 64;
189
201 void sampleMany(const QVector<QPointF> &xy,
202 QVector<double> *outZ,
203 qint64 maxBufBytes = kMaxReadBufBytesDefault) const;
204
225 void readPixels(const MapExtent &bbox,
226 QVector<QPointF> &xyOut,
227 QVector<double> &zOut) const;
228
229private:
230
237 bool fillBandGrid(double x0, double y0, double step, int cols, qint64 rows64,
238 qint64 rBegG, qint64 rEndG,
239 QVector<float> &gx, QVector<float> &gy, QVector<float> &gz,
240 QVector<quint8> &active, qint64 *nActiveOut,
241 const std::function<bool(double)> &tick) const;
242
243 GDALDataset *m_ds = nullptr;
244 int m_band = 1;
245 double m_geo[6] = {};
246 double m_invGeo[6] = {};
247 int m_w = 0;
248 int m_h = 0;
249 double m_noData = 0.0;
250 bool m_hasNoData = false;
251 mutable QString m_errorMsg;
252};
253
254} // namespace mesh
255
256#endif // OPENSWMMVIS_MESH_DTMTHINNER_H
An axis-aligned bounding box in the coordinate space of a given CRS.
Definition mapextent.h:26
Terrain-adaptive Steiner point selector from a DTM raster.
Definition dtmthinner.h:132
void readPixels(const MapExtent &bbox, QVector< QPointF > &xyOut, QVector< double > &zOut) const
Read every valid raster pixel whose centre falls within bbox.
Definition dtmthinner.cpp:579
double sampleAt(double x, double y) const
Sample the DTM at a single map-CRS coordinate. Returns NaN when out-of-bounds or NoData.
Definition dtmthinner.cpp:373
bool open(const QString &filePath, int band=1)
Definition dtmthinner.cpp:319
bool isOpen() const noexcept
Definition dtmthinner.cpp:317
static constexpr int kMaxThinningHalo
Definition dtmthinner.h:188
DTMThinner & operator=(const DTMThinner &)=delete
DTMThinner()
Definition dtmthinner.cpp:306
~DTMThinner()
Definition dtmthinner.cpp:307
double pixelSize() const
Definition dtmthinner.cpp:363
QString errorMsg() const
Definition dtmthinner.h:169
DTMThinner(const DTMThinner &)=delete
void close()
Definition dtmthinner.cpp:309
QString crsWkt() const
Definition dtmthinner.cpp:356
void sampleMany(const QVector< QPointF > &xy, QVector< double > *outZ, qint64 maxBufBytes=kMaxReadBufBytesDefault) const
Batch bilinear sampling at many DTM-CRS coordinates.
Definition dtmthinner.cpp:428
static constexpr qint64 kMaxGridBytesDefault
Definition dtmthinner.h:183
static constexpr qint64 kMaxReadBufBytesDefault
Definition dtmthinner.h:176
QVector< QPointF > generatePoints(const MapExtent &domain, const DTMThinnerOptions &opts={}, QVector< double > *outZ=nullptr, const DTMProgressFn &progress={}, const DTMThinnerLimits &limits={}) const
Generate terrain-significant sample points within domain.
Definition dtmthinner.cpp:693
static constexpr qint64 kMaxRetainedPointsDefault
Definition dtmthinner.h:185
Axis-aligned bounding box in a map coordinate system, used by MapCanvas and all layer types to define...
double step
Definition meshcellparams.cpp:28
QRectF bbox
Definition meshgenerator.cpp:166
Definition meshcommands.h:302
std::function< bool(double)> DTMProgressFn
Progress/cancel callback for DTMThinner::generatePoints().
Definition dtmthinner.h:78
Test-injectable resource limits for generatePoints().
Definition dtmthinner.h:86
qint64 maxGridBytes
per-BAND working set
Definition dtmthinner.h:87
qint64 maxRetainedPoints
total output cap
Definition dtmthinner.h:88
Parameters for the normal-deviation terrain thinning.
Definition dtmthinner.h:93
double gridSpacing
Sampling step in map units. 0 = native pixel size.
Definition dtmthinner.h:94
double minSpacing
Min inter-point distance, map units. 0 = auto (2×pixelSize).
Definition dtmthinner.h:111
bool useAverageDot
true = use average dot product; false = minimum.
Definition dtmthinner.h:98
int maxIterations
Number of thinning passes. 0 = unlimited (convergence).
Definition dtmthinner.h:103
double normalDotThreshold
Definition dtmthinner.h:95
bool useMinSpacing
Enable Poisson-disk minimum-spacing filter.
Definition dtmthinner.h:110
int maxPoints
Definition dtmthinner.h:99