QGIS API Documentation 3.99.0-Master (e9821da5c6b)
Loading...
Searching...
No Matches
qgsmaphittest.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsmaphittest.h
3 ---------------------
4 begin : September 2014
5 copyright : (C) 2014 by Martin Dobias
6 email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15#ifndef QGSMAPHITTEST_H
16#define QGSMAPHITTEST_H
17
18#include <utility>
19
20#include "qgis_core.h"
21#include "qgis_sip.h"
23#include "qgsgeometry.h"
25#include "qgsmapsettings.h"
26#include "qgsmeshlayer.h"
29#include "qgstaskmanager.h"
30
31#include <QSet>
32
34class QgsSymbol;
35class QgsVectorLayer;
36class QgsExpression;
40
48class CORE_EXPORT QgsMapHitTest
49{
50 public:
52 typedef QMap<QString, QString> LayerFilterExpression;
53
61 QgsMapHitTest( const QgsMapSettings &settings, const QgsGeometry &polygon = QgsGeometry(), const QgsMapHitTest::LayerFilterExpression &layerFilterExpression = QgsMapHitTest::LayerFilterExpression() );
62
64 QgsMapHitTest( const QgsMapSettings &settings, const QgsMapHitTest::LayerFilterExpression &layerFilterExpression );
65
72
74 void run();
75
83 QMap<QString, QSet<QString>> results() const SIP_SKIP;
84
86
93 QMap<QString, QList<QString>> resultsPy() const SIP_PYNAME( results );
95
102 QMap<QString, std::pair<double, double>> resultsRenderersUpdatedCanvas() const SIP_SKIP { return mHitTestRenderersUpdatedCanvas; }
103
104
105#ifdef SIP_RUN
112 SIP_PYOBJECT resultsRenderersUpdatedCanvasPy() const SIP_PYNAME( resultsRenderersUpdatedCanvas ) SIP_TYPEHINT( Dict[str, Tuple[float, float]] );
113 % MethodCode
114 QMap<QString, std::pair<double, double>> results = sipCpp->resultsRenderersUpdatedCanvas();
115 sipRes = PyDict_New();
116
117 for ( auto it = results.constBegin(); it != results.constEnd(); ++it )
118 {
119 PyObject *tuple = PyTuple_New( 2 );
120 PyTuple_SET_ITEM( tuple, 0, PyFloat_FromDouble( it.value().first ) );
121 PyTuple_SET_ITEM( tuple, 1, PyFloat_FromDouble( it.value().second ) );
122 PyDict_SetItem( sipRes, PyUnicode_FromString( it.key().toUtf8().constData() ), tuple );
123 Py_DECREF( tuple );
124 }
125 % End
126#endif
127
134 bool symbolVisible( QgsSymbol *symbol, QgsVectorLayer *layer ) const;
135
142 bool legendKeyVisible( const QString &ruleKey, QgsVectorLayer *layer ) const;
143
144 private:
145
147 typedef QSet<QString> SymbolSet;
148
150 typedef QMap<QString, SymbolSet> HitTest;
151
165 void runHitTestFeatureSource( QgsAbstractFeatureSource *source,
166 const QString &layerId,
167 const QgsFields &fields,
168 const QgsFeatureRenderer *renderer,
169 SymbolSet &usedSymbols,
170 SymbolSet &usedSymbolsRuleKey,
171 QgsRenderContext &context,
172 QgsFeedback *feedback,
173 const QgsGeometry &visibleExtent );
174
187 void runHitTestRasterSource( QgsRasterDataProvider *provider,
188 const QString &layerId,
189 const int band,
190 const QgsRasterMinMaxOrigin minMaxOrigin,
191 const Qgis::RasterRangeLimit rangeLimit,
192 const QgsRenderContext &context,
193 QgsFeedback *feedback,
194 const QgsGeometry &visibleExtent );
195
206 void runHitTestMeshSource( QgsMeshLayer *layer,
207 const QString &layerId,
208 const QgsMeshDatasetIndex datasetIndex,
209 const QgsRenderContext &context,
210 QgsFeedback *feedback,
211 const QgsGeometry &visibleExtent );
213 HitTest mHitTest;
214
216 HitTest mHitTestRuleKey;
217
218 QgsLayerTreeFilterSettings mSettings;
219
220 QMap<QString, std::pair<double, double>> mHitTestRenderersUpdatedCanvas;
221
222 friend class QgsMapHitTestTask;
223};
224
225
232class CORE_EXPORT QgsMapHitTestTask : public QgsTask
233{
234 Q_OBJECT
235
236 public:
237
242
248 QMap<QString, QSet<QString>> results() const SIP_SKIP;
249
251
256 QMap<QString, QList<QString>> resultsPy() const SIP_PYNAME( results );
258
259 void cancel() override;
260
267 QMap<QString, std::pair<double, double>> resultsRenderersUpdatedCanvas() const SIP_SKIP { return mResultsRenderersUpdatedCanvas; };
268
269#ifdef SIP_RUN
276 SIP_PYOBJECT resultsRenderersUpdatedCanvasPy() const SIP_PYNAME( resultsRenderersUpdatedCanvas ) SIP_TYPEHINT( Dict[str, Tuple[float, float]] );
277 % MethodCode
278 QMap<QString, std::pair<double, double>> results = sipCpp->resultsRenderersUpdatedCanvas();
279 sipRes = PyDict_New();
280
281 for ( auto it = results.constBegin(); it != results.constEnd(); ++it )
282 {
283 PyObject *tuple = PyTuple_New( 2 );
284 PyTuple_SET_ITEM( tuple, 0, PyFloat_FromDouble( it.value().first ) );
285 PyTuple_SET_ITEM( tuple, 1, PyFloat_FromDouble( it.value().second ) );
286 PyDict_SetItem( sipRes, PyUnicode_FromString( it.key().toUtf8().constData() ), tuple );
287 Py_DECREF( tuple );
288 }
289 % End
290#endif
291
292 protected:
293
294 bool run() override;
295
296 private:
297
298 void prepare();
299
300 struct PreparedLayerData
301 {
302 std::unique_ptr< QgsAbstractFeatureSource > source;
303 QString layerId;
304 QgsFields fields;
305 std::unique_ptr< QgsFeatureRenderer > renderer;
306 QgsGeometry extent;
307 QgsCoordinateTransform transform;
308 std::unique_ptr< QgsExpressionContextScope > layerScope;
309 };
310
311 struct PreparedRasterData
312 {
313 std::unique_ptr< QgsRasterDataProvider > provider;
314 QString layerId;
315 int band;
316 QgsRasterMinMaxOrigin minMaxOrigin;
317 Qgis::RasterRangeLimit rangeLimit;
318 QgsCoordinateTransform transform;
319 QgsGeometry extent;
320 };
321
322 struct PreparedMeshData
323 {
324 std::unique_ptr< QgsMeshLayer > layer;
325 QString layerId;
326 QgsMeshDatasetIndex datasetIndex;
327 QgsCoordinateTransform transform;
328 QgsGeometry extent;
329 };
330
331 std::vector< PreparedLayerData > mPreparedData;
332
333 std::vector< PreparedRasterData > mPreparedRasterData;
334
335 std::vector< PreparedMeshData > mPreparedMeshData;
336
337 QgsLayerTreeFilterSettings mSettings;
338
339 QMap<QString, QSet<QString>> mResults;
340
341 QMap<QString, std::pair<double, double>> mResultsRenderersUpdatedCanvas;
342
343 std::unique_ptr< QgsFeedback > mFeedback;
344};
345
346#endif // QGSMAPHITTEST_H
RasterRangeLimit
Describes the limits used to compute raster ranges (min/max values).
Definition qgis.h:1602
Base class that can be used for any class that is capable of returning features.
Handles parsing and evaluation of expressions (formerly called "search strings").
Abstract base class for all 2D vector feature renderers.
A geometry is the spatial representation of a feature.
Contains settings relating to filtering the contents of QgsLayerTreeModel and views.
QMap< QString, QSet< QString > > results() const
Returns the hit test results, which are a map of layer ID to visible symbol legend keys.
QgsMapHitTestTask(const QgsLayerTreeFilterSettings &settings)
Constructor for QgsMapHitTestTask, using the specified filter settings.
PRIVATE void cancel() override
Notifies the task that it should terminate.
QMap< QString, std::pair< double, double > > resultsRenderersUpdatedCanvas() const
Returns the hit test results, for layers with UpdatedCanvas renderers (raster/mesh layers).
void run()
Runs the map hit test.
friend class QgsMapHitTestTask
PRIVATE QMap< QString, std::pair< double, double > > resultsRenderersUpdatedCanvas() const
Returns the hit test results, for layers with UpdatedCanvas renderers (raster/mesh layers).
QgsMapHitTest(const QgsMapSettings &settings, const QgsGeometry &polygon=QgsGeometry(), const QgsMapHitTest::LayerFilterExpression &layerFilterExpression=QgsMapHitTest::LayerFilterExpression())
Constructor for QgsMapHitTest.
QMap< QString, QSet< QString > > results() const
Returns the hit test results, which are a map of layer ID to visible symbol legend keys.
QMap< QString, QString > LayerFilterExpression
Maps an expression string to a layer id.
Contains configuration for rendering maps.
Contains information about the context of a rendering operation.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:231
QgsTask(const QString &description=QString(), QgsTask::Flags flags=AllFlags)
Constructor for QgsTask.
Represents a vector layer which manages a vector based dataset.
#define SIP_TYPEHINT(type)
Definition qgis_sip.h:240
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_PYNAME(name)
Definition qgis_sip.h:89