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
wcslayer.h
Go to the documentation of this file.
1
16#ifndef WCSLAYER_H
17#define WCSLAYER_H
18
21
22#include <QImage>
23#include <QList>
24#include <QMap>
25#include <QMutex>
26#include <QNetworkAccessManager>
27#include <QNetworkReply>
28#include <QString>
29#include <QUrl>
30
33class RasterTileItem;
34class OGRSpatialReference;
35class OGRCoordinateTransformation;
36
37// ---------------------------------------------------------------------------
38// Service-info structs
39// ---------------------------------------------------------------------------
40
46{
47 QString identifier;
48 QString description;
49};
50
56{
57 QString identifier;
58 QString title;
59 QString abstractText;
61 QStringList supportedCrs;
62 QStringList supportedFormats;
63 QList<WCSFieldInfo> fields;
64 QStringList interpolations;
65};
66
72{
73 QString title;
74 QString abstractText;
75 QString version;
76 QList<WCSCoverageInfo> coverages;
77};
78
79// ---------------------------------------------------------------------------
80// WCSLayer
81// ---------------------------------------------------------------------------
82
103{
104 Q_OBJECT
105
106public:
107 explicit WCSLayer(const QUrl &serviceUrl,
108 OpenSWMMVisWorkspace *parent = nullptr);
109 ~WCSLayer() override;
110
111 // ----- Service metadata --------------------------------------------------
112
113 [[nodiscard]] QUrl serviceUrl() const { return m_serviceUrl; }
114 [[nodiscard]] QString wcsVersion() const { return m_version; }
115 [[nodiscard]] WCSServiceInfo serviceInfo() const { return m_serviceInfo; }
116 [[nodiscard]] bool capabilitiesReady() const { return m_capsReady; }
117
118 [[nodiscard]] QString sourceDescription() const override
119 { return m_serviceUrl.toString(); }
120
125 void fetchCapabilities();
126
131 void setServiceInfo(const WCSServiceInfo &info);
132
133 // ----- Active coverage / request parameters ------------------------------
134
135 [[nodiscard]] QString activeCoverageId() const { return m_coverageId; }
136 void setActiveCoverageId(const QString &id);
137
138 [[nodiscard]] QString outputCrs() const { return m_outputCrs; }
139 void setOutputCrs(const QString &crs);
140
141 [[nodiscard]] QString outputFormat() const { return m_outputFormat; }
142 void setOutputFormat(const QString &fmt);
143
144 [[nodiscard]] QString rangeSubset() const { return m_rangeSubset; }
145 void setRangeSubset(const QString &subset);
146
147 [[nodiscard]] QString interpolation() const { return m_interpolation; }
148 void setInterpolation(const QString &interp);
149
150 // ----- OpenSWMMVisLayer interface ----------------------------------------
151
152 [[nodiscard]] bool isRasterLayer() const override { return true; }
153 [[nodiscard]] bool isBasemapLayer() const override { return false; }
154
155 void fetchCache(const MapExtent &extent,
156 const QSize &viewportSize,
157 const SpatialReferenceSystem *srs) override;
158
159 void render(QPainter *painter,
160 const MapExtent &extent,
161 const QSize &imageSize,
162 const SpatialReferenceSystem *srs) override;
163
164 void populateScene(QGraphicsScene *,
165 const MapExtent &,
166 const SpatialReferenceSystem *) override {}
167
168 void depopulateScene(QGraphicsScene *scene) override;
169
170 void refreshScene(QGraphicsScene *scene,
171 const MapExtent &canvasExtent,
172 const SpatialReferenceSystem *canvasSRS) override;
173
174 void onCanvasCRSChanged(const SpatialReferenceSystem *newCanvasSRS) override;
175
176signals:
178 void capabilitiesError(const QString &errorMessage);
180
183
184public:
186 [[nodiscard]] const OpenSWMM::Render::BasemapRenderParams &basemapRenderParams() const { return m_renderParams; }
188
189private slots:
190 void onCapabilitiesReply(QNetworkReply *reply);
191 void onGetCoverageReply(QNetworkReply *reply,
192 const MapExtent &trackingExtent,
193 const MapExtent &requestExtent,
194 const QString &requestCrs,
195 const QString &usedVersion,
196 int w, int h);
197
198private:
199 // --- Network / URL helpers ---
200 [[nodiscard]] QUrl buildGetCoverageUrl(const MapExtent &requestExtent,
201 const QString &requestCrs,
202 int w, int h,
203 const QString &versionOverride = {}) const;
204 void requestCoverage(const MapExtent &trackingExtent,
205 const MapExtent &requestExtent,
206 const QString &requestCrs,
207 int w, int h);
208 void invalidateCache();
209
210 // --- Capabilities parsing ---
211 WCSServiceInfo parseCapabilities(const QByteArray &xml) const;
212 WCSCoverageInfo parseCoverageSummary(class QXmlStreamReader &r,
213 const QString &version) const;
214 QString negotiateNextVersion(const QString &failedVersion) const;
215 QString nextGetCoverageVersion(const QString &failedVersion) const;
216
217 // --- GDAL decode ---
218 QImage decodeGdalImage(const QByteArray &data) const;
219
220 // --- OGR transforms (canvas ↔ request CRS) ---
221 void rebuildTransforms(const SpatialReferenceSystem *canvasSRS);
222
223 // ----- Members -----------------------------------------------------------
224
225 QUrl m_serviceUrl;
226 QString m_version = QStringLiteral("2.0.1");
227 WCSServiceInfo m_serviceInfo;
228 bool m_capsReady = false;
229
230 QString m_coverageId;
231 QString m_outputCrs; // empty = use canvas CRS (like WMS)
232 QString m_outputFormat = QStringLiteral("image/tiff");
233 QString m_rangeSubset;
234 QString m_interpolation = QStringLiteral("nearest");
235
236 QNetworkAccessManager *m_nam = nullptr;
237 QNetworkReply *m_pendingReply = nullptr;
238
239 // Separately tracks the GetCoverage wire format version, which may be
240 // downgraded independently of the capabilities version when the server
241 // returns 404 for a given format (e.g. ArcGIS rejects SCALESIZE in 2.0).
242 QString m_getCoverageVersion; // "" = use m_version
243
244 // Cached coverage (WMS-style: one image per viewport)
245 QImage m_cachedImage;
247 MapExtent m_cacheExtent;
248 int m_cacheWidth = 0;
249 int m_cacheHeight = 0;
250
251 // In-flight request guard
252 MapExtent m_requestedExtent;
253 int m_requestedWidth = 0;
254 int m_requestedHeight = 0;
255
256 // Scene item (placeholder while new coverage loads)
257 RasterTileItem *m_sceneItem = nullptr;
258
259 // OGR transforms
260 OGRSpatialReference *m_wgs84 = nullptr;
261 OGRCoordinateTransformation *m_canvasToReq = nullptr;
262 OGRCoordinateTransformation *m_reqToCanvas = nullptr;
263 mutable QMutex m_transformMutex;
264};
265
266Q_DECLARE_METATYPE(WCSLayer *)
267Q_DECLARE_METATYPE(WCSServiceInfo)
268Q_DECLARE_METATYPE(WCSCoverageInfo)
269
270#endif // WCSLAYER_H
Shared visual-adjustment parameters for raster basemaps.
An axis-aligned bounding box in the coordinate space of a given CRS.
Definition mapextent.h:26
Abstract base class for all layers displayed in the MapCanvas.
Definition openswmmvislayer.h:116
SpatialReferenceSystem * srs() const
Returns the spatial reference system for this layer, or nullptr if the layer has no known CRS.
Definition openswmmvislayer.cpp:201
MapExtent extent() const
Returns the layer extent in the layer's own CRS.
Definition openswmmvislayer.cpp:252
Top-level project container managing sessions, the SWMM model layer, and persistence paths for one SW...
Definition openswmmvisworkspace.h:42
Definition graphicsitems.h:300
Represents a coordinate reference system backed by a GDAL OGRSpatialReference.
Definition spatialreferencesystem.h:28
Renders a selected coverage from an OGC Web Coverage Service as a raster basemap layer.
Definition wcslayer.h:103
bool capabilitiesReady() const
Definition wcslayer.h:116
~WCSLayer() override
Definition wcslayer.cpp:51
void coverageReady()
QString outputCrs() const
Definition wcslayer.h:138
void setInterpolation(const QString &interp)
Definition wcslayer.cpp:117
void basemapRenderParamsChanged()
void setBasemapRenderParams(const OpenSWMM::Render::BasemapRenderParams &p)
Definition wcslayer.cpp:1154
QString interpolation() const
Definition wcslayer.h:147
void fetchCapabilities()
Asynchronously fetches GetCapabilities; emits capabilitiesFetched() or capabilitiesError() when done.
Definition wcslayer.cpp:135
QString rangeSubset() const
Definition wcslayer.h:144
QString sourceDescription() const override
Human-readable source of this layer: a file path, a service URL, or a description for in-memory / der...
Definition wcslayer.h:118
void depopulateScene(QGraphicsScene *scene) override
Removes all QGraphicsItems belonging to this layer from the scene.
Definition wcslayer.cpp:1167
QUrl serviceUrl() const
Definition wcslayer.h:113
void fetchCache(const MapExtent &extent, const QSize &viewportSize, const SpatialReferenceSystem *srs) override
Triggers any asynchronous (or synchronous) tile/data fetch needed to populate this layer's internal c...
Definition wcslayer.cpp:421
void setOutputCrs(const QString &crs)
Definition wcslayer.cpp:98
void setOutputFormat(const QString &fmt)
Definition wcslayer.cpp:105
void setServiceInfo(const WCSServiceInfo &info)
Injects already-fetched service info (from the dialog) so the layer can render immediately without a ...
Definition wcslayer.cpp:70
QString activeCoverageId() const
Definition wcslayer.h:135
QString outputFormat() const
Definition wcslayer.h:141
void capabilitiesError(const QString &errorMessage)
WCSServiceInfo serviceInfo() const
Definition wcslayer.h:115
bool isRasterLayer() const override
Returns true for layers that render into a raster buffer (WMS, WMTS, GISRaster) rather than populatin...
Definition wcslayer.h:152
void render(QPainter *painter, const MapExtent &extent, const QSize &imageSize, const SpatialReferenceSystem *srs) override
Renders this layer's content directly into painter.
Definition wcslayer.cpp:1081
void refreshScene(QGraphicsScene *scene, const MapExtent &canvasExtent, const SpatialReferenceSystem *canvasSRS) override
Smart scene refresh — updates existing items instead of destroying and recreating.
Definition wcslayer.cpp:1176
void onCanvasCRSChanged(const SpatialReferenceSystem *newCanvasSRS) override
Called when the user changes the canvas CRS so layers can pre-compute any CRS-dependent transform cac...
Definition wcslayer.cpp:1190
void setRangeSubset(const QString &subset)
Definition wcslayer.cpp:111
void setActiveCoverageId(const QString &id)
Definition wcslayer.cpp:78
void populateScene(QGraphicsScene *, const MapExtent &, const SpatialReferenceSystem *) override
Creates / updates QGraphicsItems representing this layer in the scene.
Definition wcslayer.h:164
bool isBasemapLayer() const override
Returns true for world-spanning basemap layers (XYZ tile providers, WMS/WMTS services covering the wh...
Definition wcslayer.h:153
const OpenSWMM::Render::BasemapRenderParams & basemapRenderParams() const
Definition wcslayer.h:186
QString wcsVersion() const
Definition wcslayer.h:114
void capabilitiesFetched(const WCSServiceInfo &info)
QGraphicsScene * scene
Definition inletdrawingview.cpp:78
ArrowPlacement p
Definition linesymbollayer.cpp:27
int h
Definition mesh2dresultsexport.cpp:387
int w
Definition mesh2dresultsexport.cpp:387
Abstract base class for all map layers displayed in the MapCanvas.
QVector< int > parent
union-find
Definition pslgminsize.cpp:176
Brightness / contrast / saturation / resampling for a basemap.
Definition basemaprenderparams.h:32
Metadata for one coverage returned by GetCapabilities / DescribeCoverage.
Definition wcslayer.h:56
MapExtent wgs84BoundingBox
Definition wcslayer.h:60
QString title
Definition wcslayer.h:58
QString identifier
Definition wcslayer.h:57
QStringList supportedFormats
Definition wcslayer.h:62
QList< WCSFieldInfo > fields
Definition wcslayer.h:63
QStringList interpolations
Definition wcslayer.h:64
QString abstractText
Definition wcslayer.h:59
QStringList supportedCrs
Definition wcslayer.h:61
One field (band / variable) advertised by a WCS DescribeCoverage response.
Definition wcslayer.h:46
QString description
Definition wcslayer.h:48
QString identifier
Definition wcslayer.h:47
Top-level metadata returned by a WCS GetCapabilities request.
Definition wcslayer.h:72
QString title
Definition wcslayer.h:73
QString abstractText
Definition wcslayer.h:74
QString version
Definition wcslayer.h:75
QList< WCSCoverageInfo > coverages
Definition wcslayer.h:76