QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
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
106 // clang-format off
113 SIP_PYOBJECT resultsRenderersUpdatedCanvasPy() const SIP_PYNAME( resultsRenderersUpdatedCanvas ) SIP_TYPEHINT( Dict[str, Tuple[float, float]] );
114 % MethodCode
115 QMap<QString, std::pair<double, double>> results = sipCpp->resultsRenderersUpdatedCanvas();
116 sipRes = PyDict_New();
117
118 for ( auto it = results.constBegin(); it != results.constEnd(); ++it )
119 {
120 PyObject *tuple = PyTuple_New( 2 );
121 PyTuple_SET_ITEM( tuple, 0, PyFloat_FromDouble( it.value().first ) );
122 PyTuple_SET_ITEM( tuple, 1, PyFloat_FromDouble( it.value().second ) );
123 PyDict_SetItem( sipRes, PyUnicode_FromString( it.key().toUtf8().constData() ), tuple );
124 Py_DECREF( tuple );
125 }
126 % End
127// clang-format on
128#endif
129
136 bool symbolVisible( QgsSymbol *symbol, QgsVectorLayer *layer ) const;
137
144 bool legendKeyVisible( const QString &ruleKey, QgsVectorLayer *layer ) const;
145
146 private:
148 typedef QSet<QString> SymbolSet;
149
151 typedef QMap<QString, SymbolSet> HitTest;
152
166 void runHitTestFeatureSource(
167 QgsAbstractFeatureSource *source,
168 const QString &layerId,
169 const QgsFields &fields,
170 const QgsFeatureRenderer *renderer,
171 SymbolSet &usedSymbols,
172 SymbolSet &usedSymbolsRuleKey,
173 QgsRenderContext &context,
174 QgsFeedback *feedback,
175 const QgsGeometry &visibleExtent
176 );
177
190 void runHitTestRasterSource(
191 QgsRasterDataProvider *provider,
192 const QString &layerId,
193 const int band,
194 const QgsRasterMinMaxOrigin minMaxOrigin,
195 const Qgis::RasterRangeLimit rangeLimit,
196 const QgsRenderContext &context,
197 QgsFeedback *feedback,
198 const QgsGeometry &visibleExtent
199 );
200
211 void runHitTestMeshSource( QgsMeshLayer *layer, const QString &layerId, const QgsMeshDatasetIndex datasetIndex, const QgsRenderContext &context, QgsFeedback *feedback, 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:
241
247 QMap<QString, QSet<QString>> results() const SIP_SKIP;
248
250
255 QMap<QString, QList<QString>> resultsPy() const SIP_PYNAME( results );
257
258 void cancel() override;
259
266 QMap<QString, std::pair<double, double>> resultsRenderersUpdatedCanvas() const SIP_SKIP { return mResultsRenderersUpdatedCanvas; };
267
268#ifdef SIP_RUN
269 // clang-format off
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// clang-format on
291#endif
292
293 // clang-format off
294 protected:
295 // clang-format on
296
297 bool run() override;
298
299 private:
300 void prepare();
301
302 struct PreparedLayerData
303 {
304 std::unique_ptr< QgsAbstractFeatureSource > source;
305 QString layerId;
306 QgsFields fields;
307 std::unique_ptr< QgsFeatureRenderer > renderer;
308 QgsGeometry extent;
309 QgsCoordinateTransform transform;
310 std::unique_ptr< QgsExpressionContextScope > layerScope;
311 };
312
313 struct PreparedRasterData
314 {
315 std::unique_ptr< QgsRasterDataProvider > provider;
316 QString layerId;
317 int band;
318 QgsRasterMinMaxOrigin minMaxOrigin;
319 Qgis::RasterRangeLimit rangeLimit;
320 QgsCoordinateTransform transform;
321 QgsGeometry extent;
322 };
323
324 struct PreparedMeshData
325 {
326 std::unique_ptr< QgsMeshLayer > layer;
327 QString layerId;
328 QgsMeshDatasetIndex datasetIndex;
329 QgsCoordinateTransform transform;
330 QgsGeometry extent;
331 };
332
333 std::vector< PreparedLayerData > mPreparedData;
334
335 std::vector< PreparedRasterData > mPreparedRasterData;
336
337 std::vector< PreparedMeshData > mPreparedMeshData;
338
339 QgsLayerTreeFilterSettings mSettings;
340
341 QMap<QString, QSet<QString>> mResults;
342
343 QMap<QString, std::pair<double, double>> mResultsRenderersUpdatedCanvas;
344
345 std::unique_ptr< QgsFeedback > mFeedback;
346};
347
348#endif // QGSMAPHITTEST_H
RasterRangeLimit
Describes the limits used to compute raster ranges (min/max values).
Definition qgis.h:1623
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:227
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:239
#define SIP_SKIP
Definition qgis_sip.h:133
#define SIP_PYNAME(name)
Definition qgis_sip.h:88