QGIS API Documentation  3.15.0-Master (dbe1ef8aa2)
qgsrasterinterface.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrasterface.h - Internal raster processing modules interface
3  --------------------------------------
4  Date : Jun 21, 2012
5  Copyright : (C) 2012 by Radim Blazek
6  email : radim dot blazek at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #ifndef QGSRASTERINTERFACE_H
19 #define QGSRASTERINTERFACE_H
20 
21 #include "qgis_core.h"
22 #include "qgis_sip.h"
23 #include <limits>
24 
25 #include <QCoreApplication> // for tr()
26 #include <QImage>
27 
28 #include "qgsfeedback.h"
29 #include "qgsrasterbandstats.h"
30 #include "qgsrasterblock.h"
31 #include "qgsrasterhistogram.h"
32 #include "qgsrectangle.h"
33 
40 class CORE_EXPORT QgsRasterBlockFeedback : public QgsFeedback
41 {
42  Q_OBJECT
43 
44  public:
46  QgsRasterBlockFeedback( QObject *parent = nullptr ) : QgsFeedback( parent ) {}
47 
52  virtual void onNewData() {}
53 
59  bool isPreviewOnly() const { return mPreviewOnly; }
60 
65  void setPreviewOnly( bool preview ) { mPreviewOnly = preview; }
66 
71  bool renderPartialOutput() const { return mRenderPartialOutput; }
72 
77  void setRenderPartialOutput( bool enable ) { mRenderPartialOutput = enable; }
78 
86  void appendError( const QString &error ) { mErrors.append( error ); }
87 
94  QStringList errors() const { return mErrors; }
95 
96  private:
97 
102  bool mPreviewOnly = false;
103 
105  bool mRenderPartialOutput = false;
106 
108  QStringList mErrors;
109 };
110 
111 
116 class CORE_EXPORT QgsRasterInterface
117 {
118 #ifdef SIP_RUN
119 // QgsRasterInterface subclasses
121 #include <qgshuesaturationfilter.h>
122 #include <qgsrasterdataprovider.h>
123 #include <qgsrasternuller.h>
124 #include <qgsrasterprojector.h>
125 #include <qgsrasterrenderer.h>
126 #include <qgsrasterresamplefilter.h>
127 
128 // QgsRasterRenderer subclasses
129 #include <qgshillshaderenderer.h>
135 #endif
136 
137 
138 #ifdef SIP_RUN
140  if ( dynamic_cast<QgsBrightnessContrastFilter *>( sipCpp ) )
141  sipType = sipType_QgsBrightnessContrastFilter;
142  else if ( dynamic_cast<QgsHueSaturationFilter *>( sipCpp ) )
143  sipType = sipType_QgsHueSaturationFilter;
144  else if ( dynamic_cast<QgsRasterDataProvider *>( sipCpp ) )
145  {
146  sipType = sipType_QgsRasterDataProvider;
147  // use static cast because QgsRasterDataProvider has multiple inheritance
148  // and we would end up with bad pointer otherwise!
149  *sipCppRet = static_cast<QgsRasterDataProvider *>( sipCpp );
150  }
151  else if ( dynamic_cast<QgsRasterNuller *>( sipCpp ) )
152  sipType = sipType_QgsRasterNuller;
153  else if ( dynamic_cast<QgsRasterProjector *>( sipCpp ) )
154  sipType = sipType_QgsRasterProjector;
155  else if ( dynamic_cast<QgsRasterRenderer *>( sipCpp ) )
156  {
157  if ( dynamic_cast<QgsHillshadeRenderer *>( sipCpp ) )
158  sipType = sipType_QgsHillshadeRenderer;
159  else if ( dynamic_cast<QgsMultiBandColorRenderer *>( sipCpp ) )
160  sipType = sipType_QgsMultiBandColorRenderer;
161  else if ( dynamic_cast<QgsPalettedRasterRenderer *>( sipCpp ) )
162  sipType = sipType_QgsPalettedRasterRenderer;
163  else if ( dynamic_cast<QgsSingleBandColorDataRenderer *>( sipCpp ) )
164  sipType = sipType_QgsSingleBandColorDataRenderer;
165  else if ( dynamic_cast<QgsSingleBandGrayRenderer *>( sipCpp ) )
166  sipType = sipType_QgsSingleBandGrayRenderer;
167  else if ( dynamic_cast<QgsSingleBandPseudoColorRenderer *>( sipCpp ) )
168  sipType = sipType_QgsSingleBandPseudoColorRenderer;
169  else
170  sipType = sipType_QgsRasterRenderer;
171  }
172  else if ( dynamic_cast<QgsRasterResampleFilter *>( sipCpp ) )
173  sipType = sipType_QgsRasterResampleFilter;
174  else
175  sipType = 0;
176  SIP_END
177 #endif
178 
179  Q_DECLARE_TR_FUNCTIONS( QgsRasterInterface )
180 
181  public:
184  {
185  NoCapabilities = 0,
186  Size = 1 << 1, // original data source size (and thus resolution) is known, it is not always available, for example for WMS
187  Create = 1 << 2, // create new datasets
188  Remove = 1 << 3, // delete datasets
189  BuildPyramids = 1 << 4, // supports building of pyramids (overviews)
190  Identify = 1 << 5, // at least one identify format supported
191  IdentifyValue = 1 << 6, // numerical values
192  IdentifyText = 1 << 7, // WMS text
193  IdentifyHtml = 1 << 8, // WMS HTML
194  IdentifyFeature = 1 << 9, // WMS GML -> feature
195  Prefetch = 1 << 10, // allow prefetching of out-of-view images
196  };
197 
198  QgsRasterInterface( QgsRasterInterface *input = nullptr );
199 
200  virtual ~QgsRasterInterface() = default;
201 
203  virtual QgsRasterInterface *clone() const = 0 SIP_FACTORY;
204 
206  virtual int capabilities() const
207  {
209  }
210 
214  QString capabilitiesString() const;
215 
217  virtual Qgis::DataType dataType( int bandNo ) const = 0;
218 
223  virtual Qgis::DataType sourceDataType( int bandNo ) const { return mInput ? mInput->sourceDataType( bandNo ) : Qgis::UnknownDataType; }
224 
229  virtual QgsRectangle extent() const { return mInput ? mInput->extent() : QgsRectangle(); }
230 
231  int dataTypeSize( int bandNo ) { return QgsRasterBlock::typeSize( dataType( bandNo ) ); }
232 
234  virtual int bandCount() const = 0;
235 
237  virtual int xBlockSize() const { return mInput ? mInput->xBlockSize() : 0; }
238  virtual int yBlockSize() const { return mInput ? mInput->yBlockSize() : 0; }
239 
241  virtual int xSize() const { return mInput ? mInput->xSize() : 0; }
242  virtual int ySize() const { return mInput ? mInput->ySize() : 0; }
243 
245  virtual QString generateBandName( int bandNumber ) const
246  {
247  return tr( "Band" ) + QStringLiteral( " %1" ) .arg( bandNumber, 1 + static_cast< int >( std::log10( static_cast< double >( bandCount() ) ) ), 10, QChar( '0' ) );
248  }
249 
260  virtual QgsRasterBlock *block( int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) = 0 SIP_FACTORY;
261 
266  virtual bool setInput( QgsRasterInterface *input ) { mInput = input; return true; }
267 
269  virtual QgsRasterInterface *input() const { return mInput; }
270 
272  virtual bool on() const { return mOn; }
273 
275  virtual void setOn( bool on ) { mOn = on; }
276 
283  virtual const QgsRasterInterface *sourceInput() const SIP_SKIP
284  {
285  QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 );
286  return mInput ? mInput->sourceInput() : this;
287  }
288 
295  {
296  QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 );
297  return mInput ? mInput->sourceInput() : this;
298  }
299 
308  virtual QgsRasterBandStats bandStatistics( int bandNo,
309  int stats = QgsRasterBandStats::All,
310  const QgsRectangle &extent = QgsRectangle(),
311  int sampleSize = 0, QgsRasterBlockFeedback *feedback = nullptr );
312 
317  virtual bool hasStatistics( int bandNo,
318  int stats = QgsRasterBandStats::All,
319  const QgsRectangle &extent = QgsRectangle(),
320  int sampleSize = 0 );
321 
322 
336 #ifndef SIP_RUN
337  virtual QgsRasterHistogram histogram( int bandNo,
338  int binCount = 0,
339  double minimum = std::numeric_limits<double>::quiet_NaN(),
340  double maximum = std::numeric_limits<double>::quiet_NaN(),
341  const QgsRectangle &extent = QgsRectangle(),
342  int sampleSize = 0,
343  bool includeOutOfRange = false,
344  QgsRasterBlockFeedback *feedback = nullptr );
345 #else
346  virtual QgsRasterHistogram histogram( int bandNo,
347  int binCount = 0,
348  SIP_PYOBJECT minimum = Py_None,
349  SIP_PYOBJECT maximum = Py_None,
350  const QgsRectangle &extent = QgsRectangle(),
351  int sampleSize = 0,
352  bool includeOutOfRange = false,
353  QgsRasterBlockFeedback *feedback = nullptr )
354  [QgsRasterHistogram( int bandNo,
355  int binCount = 0,
356  double minimum = 0.0,
357  double maximum = 0.0,
358  const QgsRectangle &extent = QgsRectangle(),
359  int sampleSize = 0,
360  bool includeOutOfRange = false,
361  QgsRasterBlockFeedback *feedback = nullptr )];
362  % MethodCode
363  double minimum;
364  double maximum;
365  if ( a2 == Py_None )
366  {
367  minimum = std::numeric_limits<double>::quiet_NaN();
368  }
369  else
370  {
371  minimum = PyFloat_AsDouble( a2 );
372  }
373 
374  if ( a3 == Py_None )
375  {
376  maximum = std::numeric_limits<double>::quiet_NaN();
377  }
378  else
379  {
380  maximum = PyFloat_AsDouble( a3 );
381  }
382 
383  QgsRasterHistogram *h = new QgsRasterHistogram( sipCpp->histogram( a0, a1, minimum, maximum, *a4, a5, a6, a7 ) );
384  return sipConvertFromType( h, sipType_QgsRasterHistogram, Py_None );
385  % End
386 #endif
387 
388 
393 #ifndef SIP_RUN
394  virtual bool hasHistogram( int bandNo,
395  int binCount,
396  double minimum = std::numeric_limits<double>::quiet_NaN(),
397  double maximum = std::numeric_limits<double>::quiet_NaN(),
398  const QgsRectangle &extent = QgsRectangle(),
399  int sampleSize = 0,
400  bool includeOutOfRange = false );
401 #else
402  virtual bool hasHistogram( int bandNo,
403  int binCount,
404  SIP_PYOBJECT minimum = Py_None,
405  SIP_PYOBJECT maximum = Py_None,
406  const QgsRectangle &extent = QgsRectangle(),
407  int sampleSize = 0,
408  bool includeOutOfRange = false )
409  [bool( int bandNo,
410  int binCount,
411  double minimum = 0.0,
412  double maximum = 0.0,
413  const QgsRectangle &extent = QgsRectangle(),
414  int sampleSize = 0,
415  bool includeOutOfRange = false )];
416  % MethodCode
417  double minimum;
418  double maximum;
419  if ( a2 == Py_None )
420  {
421  minimum = std::numeric_limits<double>::quiet_NaN();
422  }
423  else
424  {
425  minimum = PyFloat_AsDouble( a2 );
426  }
427 
428  if ( a3 == Py_None )
429  {
430  maximum = std::numeric_limits<double>::quiet_NaN();
431  }
432  else
433  {
434  maximum = PyFloat_AsDouble( a3 );
435  }
436 
437  sipRes = sipCpp->hasHistogram( a0, a1, minimum, maximum, *a4, a5, a6 );
438  % End
439 #endif
440 
441 
452  virtual void cumulativeCut( int bandNo,
453  double lowerCount,
454  double upperCount,
455  double &lowerValue,
456  double &upperValue,
457  const QgsRectangle &extent = QgsRectangle(),
458  int sampleSize = 0 );
459 
461  virtual void writeXml( QDomDocument &doc, QDomElement &parentElem ) const { Q_UNUSED( doc ) Q_UNUSED( parentElem ); }
463  virtual void readXml( const QDomElement &filterElem ) { Q_UNUSED( filterElem ) }
464 
465  protected:
466  // QgsRasterInterface used as input
467  QgsRasterInterface *mInput = nullptr;
468 
470  QList<QgsRasterBandStats> mStatistics;
471 
473  QList<QgsRasterHistogram> mHistograms;
474 
475  // On/off state, if off, it does not do anything, replicates input
476  bool mOn = true;
477 
482 #ifndef SIP_RUN
483  void initHistogram( QgsRasterHistogram &histogram,
484  int bandNo,
485  int binCount,
486  double minimum = std::numeric_limits<double>::quiet_NaN(),
487  double maximum = std::numeric_limits<double>::quiet_NaN(),
488  const QgsRectangle &boundingBox = QgsRectangle(),
489  int sampleSize = 0,
490  bool includeOutOfRange = false );
491 #else
492  void initHistogram( QgsRasterHistogram &histogram,
493  int bandNo,
494  int binCount,
495  SIP_PYOBJECT minimum = Py_None,
496  SIP_PYOBJECT maximum = Py_None,
497  const QgsRectangle &boundingBox = QgsRectangle(),
498  int sampleSize = 0,
499  bool includeOutOfRange = false )
500  [void ( QgsRasterHistogram & histogram,
501  int bandNo,
502  int binCount,
503  double minimum = 0.0,
504  double maximum = 0.0,
505  const QgsRectangle &boundingBox = QgsRectangle(),
506  int sampleSize = 0,
507  bool includeOutOfRange = false )];
508  % MethodCode
509  double minimum;
510  double maximum;
511  if ( a3 == Py_None )
512  {
513  minimum = std::numeric_limits<double>::quiet_NaN();
514  }
515  else
516  {
517  minimum = PyFloat_AsDouble( a3 );
518  }
519 
520  if ( a4 == Py_None )
521  {
522  maximum = std::numeric_limits<double>::quiet_NaN();
523  }
524  else
525  {
526  maximum = PyFloat_AsDouble( a4 );
527  }
528 
529 #if defined(SIP_PROTECTED_IS_PUBLIC)
530  sipCpp->initHistogram( *a0, a1, a2, minimum, maximum, *a5, a6, a7 );
531 #else
532  sipCpp->sipProtect_initHistogram( *a0, a1, a2, minimum, maximum, *a5, a6, a7 );
533 #endif
534  % End
535 #endif
536 
537 
538 
540  void initStatistics( QgsRasterBandStats &statistics, int bandNo,
541  int stats = QgsRasterBandStats::All,
542  const QgsRectangle &boundingBox = QgsRectangle(),
543  int binCount = 0 );
544 
545  private:
546 #ifdef SIP_RUN
548  QgsRasterInterface &operator=( const QgsRasterInterface & );
549 #endif
550 
551  Q_DISABLE_COPY( QgsRasterInterface ) // there is clone() for copying
552 };
553 
554 #endif
555 
556 
virtual void onNewData()
May be emitted by raster data provider to indicate that some partial data are available and a new pre...
A rectangle specified with double values.
Definition: qgsrectangle.h:41
virtual void readXml(const QDomElement &filterElem)
Sets base class members from xml. Usually called from create() methods of subclasses.
bool renderPartialOutput() const
Whether our painter is drawing to a temporary image used just by this layer.
virtual QgsRectangle extent() const
Gets the extent of the interface.
virtual QgsRasterInterface * input() const
Current input.
DataType
Raster data types.
Definition: qgis.h:101
virtual int ySize() const
Capability
If you add to this, please also add to capabilitiesString()
void setRenderPartialOutput(bool enable)
Set whether our painter is drawing to a temporary image used just by this layer.
virtual QgsRasterInterface * sourceInput()
Gets source / raw input, the first in pipe, usually provider.
virtual int xBlockSize() const
Gets block size.
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:43
The RasterBandStats struct is a container for statistics about a single raster band.
Raster data container.
void setPreviewOnly(bool preview)
set flag whether the block request is for preview purposes only
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
#define SIP_SKIP
Definition: qgis_sip.h:126
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
virtual void setOn(bool on)
Sets whether the interface is on or off.
QList< QgsRasterHistogram > mHistograms
List of cached histograms, all bands mixed.
void appendError(const QString &error)
Appends an error message to the stored list of errors.
#define SIP_END
Definition: qgis_sip.h:189
Unknown or unspecified type.
Definition: qgis.h:103
virtual Qgis::DataType sourceDataType(int bandNo) const
Returns source data type for the band specified by number, source data type may be shorter than dataT...
QgsRasterBlockFeedback(QObject *parent=nullptr)
Construct a new raster block feedback object.
static int typeSize(int dataType)
#define SIP_FACTORY
Definition: qgis_sip.h:76
Base class for processing filters like renderers, reprojector, resampler etc.
virtual bool setInput(QgsRasterInterface *input)
Set input.
virtual bool on() const
Returns whether the interface is on or off.
virtual int yBlockSize() const
QStringList errors() const
Returns a list of any errors encountered while retrieving the raster block.
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:172
bool isPreviewOnly() const
Whether the raster provider should return only data that are already available without waiting for fu...
int dataTypeSize(int bandNo)
The QgsRasterHistogram is a container for histogram of a single raster band.
QList< QgsRasterBandStats > mStatistics
List of cached statistics, all bands mixed.
virtual void writeXml(QDomDocument &doc, QDomElement &parentElem) const
Write base class members to xml.
virtual QString generateBandName(int bandNumber) const
helper function to create zero padded band names
Feedback object tailored for raster block reading.
virtual int xSize() const
Gets raster size.
virtual const QgsRasterInterface * sourceInput() const
Gets source / raw input, the first in pipe, usually provider.
Base class for raster data providers.