QGIS API Documentation  3.20.0-Odense (decaadbb31)
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,
187  Create = 1 << 2,
188  Remove = 1 << 3,
189  BuildPyramids = 1 << 4,
190  Identify = 1 << 5,
191  IdentifyValue = 1 << 6,
192  IdentifyText = 1 << 7,
193  IdentifyHtml = 1 << 8,
194  IdentifyFeature = 1 << 9,
195  Prefetch = 1 << 10,
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::DataType::UnknownDataType; }
224 
229  virtual QgsRectangle extent() const { return mInput ? mInput->extent() : QgsRectangle(); }
230 
234  int dataTypeSize( int bandNo ) const { return QgsRasterBlock::typeSize( dataType( bandNo ) ); }
235 
237  virtual int bandCount() const = 0;
238 
240  virtual int xBlockSize() const { return mInput ? mInput->xBlockSize() : 0; }
241  virtual int yBlockSize() const { return mInput ? mInput->yBlockSize() : 0; }
242 
244  virtual int xSize() const { return mInput ? mInput->xSize() : 0; }
245  virtual int ySize() const { return mInput ? mInput->ySize() : 0; }
246 
248  virtual QString generateBandName( int bandNumber ) const;
249 
255  virtual QString colorInterpretationName( int bandNumber ) const;
256 
262  QString displayBandName( int bandNumber ) const;
263 
274  virtual QgsRasterBlock *block( int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) = 0 SIP_FACTORY;
275 
280  virtual bool setInput( QgsRasterInterface *input ) { mInput = input; return true; }
281 
283  virtual QgsRasterInterface *input() const { return mInput; }
284 
286  virtual bool on() const { return mOn; }
287 
289  virtual void setOn( bool on ) { mOn = on; }
290 
297  virtual const QgsRasterInterface *sourceInput() const SIP_SKIP
298  {
299  QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 );
300  return mInput ? mInput->sourceInput() : this;
301  }
302 
309  {
310  QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 );
311  return mInput ? mInput->sourceInput() : this;
312  }
313 
322  virtual QgsRasterBandStats bandStatistics( int bandNo,
323  int stats = QgsRasterBandStats::All,
324  const QgsRectangle &extent = QgsRectangle(),
325  int sampleSize = 0, QgsRasterBlockFeedback *feedback = nullptr );
326 
331  virtual bool hasStatistics( int bandNo,
332  int stats = QgsRasterBandStats::All,
333  const QgsRectangle &extent = QgsRectangle(),
334  int sampleSize = 0 );
335 
336 
350 #ifndef SIP_RUN
351  virtual QgsRasterHistogram histogram( int bandNo,
352  int binCount = 0,
353  double minimum = std::numeric_limits<double>::quiet_NaN(),
354  double maximum = std::numeric_limits<double>::quiet_NaN(),
355  const QgsRectangle &extent = QgsRectangle(),
356  int sampleSize = 0,
357  bool includeOutOfRange = false,
358  QgsRasterBlockFeedback *feedback = nullptr );
359 #else
360  virtual QgsRasterHistogram histogram( int bandNo,
361  int binCount = 0,
362  SIP_PYOBJECT minimum = Py_None,
363  SIP_PYOBJECT maximum = Py_None,
364  const QgsRectangle &extent = QgsRectangle(),
365  int sampleSize = 0,
366  bool includeOutOfRange = false,
367  QgsRasterBlockFeedback *feedback = nullptr )
368  [QgsRasterHistogram( int bandNo,
369  int binCount = 0,
370  double minimum = 0.0,
371  double maximum = 0.0,
372  const QgsRectangle &extent = QgsRectangle(),
373  int sampleSize = 0,
374  bool includeOutOfRange = false,
375  QgsRasterBlockFeedback *feedback = nullptr )];
376  % MethodCode
377  double minimum;
378  double maximum;
379  if ( a2 == Py_None )
380  {
381  minimum = std::numeric_limits<double>::quiet_NaN();
382  }
383  else
384  {
385  minimum = PyFloat_AsDouble( a2 );
386  }
387 
388  if ( a3 == Py_None )
389  {
390  maximum = std::numeric_limits<double>::quiet_NaN();
391  }
392  else
393  {
394  maximum = PyFloat_AsDouble( a3 );
395  }
396 
397  QgsRasterHistogram *h = new QgsRasterHistogram( sipCpp->histogram( a0, a1, minimum, maximum, *a4, a5, a6, a7 ) );
398  return sipConvertFromType( h, sipType_QgsRasterHistogram, Py_None );
399  % End
400 #endif
401 
402 
407 #ifndef SIP_RUN
408  virtual bool hasHistogram( int bandNo,
409  int binCount,
410  double minimum = std::numeric_limits<double>::quiet_NaN(),
411  double maximum = std::numeric_limits<double>::quiet_NaN(),
412  const QgsRectangle &extent = QgsRectangle(),
413  int sampleSize = 0,
414  bool includeOutOfRange = false );
415 #else
416  virtual bool hasHistogram( int bandNo,
417  int binCount,
418  SIP_PYOBJECT minimum = Py_None,
419  SIP_PYOBJECT maximum = Py_None,
420  const QgsRectangle &extent = QgsRectangle(),
421  int sampleSize = 0,
422  bool includeOutOfRange = false )
423  [bool( int bandNo,
424  int binCount,
425  double minimum = 0.0,
426  double maximum = 0.0,
427  const QgsRectangle &extent = QgsRectangle(),
428  int sampleSize = 0,
429  bool includeOutOfRange = false )];
430  % MethodCode
431  double minimum;
432  double maximum;
433  if ( a2 == Py_None )
434  {
435  minimum = std::numeric_limits<double>::quiet_NaN();
436  }
437  else
438  {
439  minimum = PyFloat_AsDouble( a2 );
440  }
441 
442  if ( a3 == Py_None )
443  {
444  maximum = std::numeric_limits<double>::quiet_NaN();
445  }
446  else
447  {
448  maximum = PyFloat_AsDouble( a3 );
449  }
450 
451  sipRes = sipCpp->hasHistogram( a0, a1, minimum, maximum, *a4, a5, a6 );
452  % End
453 #endif
454 
455 
466  virtual void cumulativeCut( int bandNo,
467  double lowerCount,
468  double upperCount,
469  double &lowerValue,
470  double &upperValue,
471  const QgsRectangle &extent = QgsRectangle(),
472  int sampleSize = 0 );
473 
475  virtual void writeXml( QDomDocument &doc, QDomElement &parentElem ) const { Q_UNUSED( doc ) Q_UNUSED( parentElem ); }
477  virtual void readXml( const QDomElement &filterElem ) { Q_UNUSED( filterElem ) }
478 
479  protected:
480  // QgsRasterInterface used as input
481  QgsRasterInterface *mInput = nullptr;
482 
484  QList<QgsRasterBandStats> mStatistics;
485 
487  QList<QgsRasterHistogram> mHistograms;
488 
489  // On/off state, if off, it does not do anything, replicates input
490  bool mOn = true;
491 
496 #ifndef SIP_RUN
497  void initHistogram( QgsRasterHistogram &histogram,
498  int bandNo,
499  int binCount,
500  double minimum = std::numeric_limits<double>::quiet_NaN(),
501  double maximum = std::numeric_limits<double>::quiet_NaN(),
502  const QgsRectangle &boundingBox = QgsRectangle(),
503  int sampleSize = 0,
504  bool includeOutOfRange = false );
505 #else
506  void initHistogram( QgsRasterHistogram &histogram,
507  int bandNo,
508  int binCount,
509  SIP_PYOBJECT minimum = Py_None,
510  SIP_PYOBJECT maximum = Py_None,
511  const QgsRectangle &boundingBox = QgsRectangle(),
512  int sampleSize = 0,
513  bool includeOutOfRange = false )
514  [void ( QgsRasterHistogram & histogram,
515  int bandNo,
516  int binCount,
517  double minimum = 0.0,
518  double maximum = 0.0,
519  const QgsRectangle &boundingBox = QgsRectangle(),
520  int sampleSize = 0,
521  bool includeOutOfRange = false )];
522  % MethodCode
523  double minimum;
524  double maximum;
525  if ( a3 == Py_None )
526  {
527  minimum = std::numeric_limits<double>::quiet_NaN();
528  }
529  else
530  {
531  minimum = PyFloat_AsDouble( a3 );
532  }
533 
534  if ( a4 == Py_None )
535  {
536  maximum = std::numeric_limits<double>::quiet_NaN();
537  }
538  else
539  {
540  maximum = PyFloat_AsDouble( a4 );
541  }
542 
543 #if defined(SIP_PROTECTED_IS_PUBLIC)
544  sipCpp->initHistogram( *a0, a1, a2, minimum, maximum, *a5, a6, a7 );
545 #else
546  sipCpp->sipProtect_initHistogram( *a0, a1, a2, minimum, maximum, *a5, a6, a7 );
547 #endif
548  % End
549 #endif
550 
551 
552 
554  void initStatistics( QgsRasterBandStats &statistics, int bandNo,
555  int stats = QgsRasterBandStats::All,
556  const QgsRectangle &boundingBox = QgsRectangle(),
557  int binCount = 0 );
558 
559  private:
560 #ifdef SIP_RUN
562  QgsRasterInterface &operator=( const QgsRasterInterface & );
563 #endif
564 
565  Q_DISABLE_COPY( QgsRasterInterface ) // there is clone() for copying
566 };
567 
568 #endif
569 
570 
DataType
Raster data types.
Definition: qgis.h:119
@ UnknownDataType
Unknown or unspecified type.
Brightness/contrast and gamma correction filter pipe for rasters.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
A renderer for generating live hillshade models.
Color and saturation filter pipe for rasters.
Renderer for multiband images with the color components.
Renderer for paletted raster images.
The RasterBandStats struct is a container for statistics about a single raster band.
Feedback object tailored for raster block reading.
bool isPreviewOnly() const
Whether the raster provider should return only data that are already available without waiting for fu...
QStringList errors() const
Returns a list of any errors encountered while retrieving the raster block.
virtual void onNewData()
May be emitted by raster data provider to indicate that some partial data are available and a new pre...
QgsRasterBlockFeedback(QObject *parent=nullptr)
Construct a new raster block feedback object.
void setPreviewOnly(bool preview)
set flag whether the block request is for preview purposes only
bool renderPartialOutput() const
Whether our painter is drawing to a temporary image used just by this layer.
void appendError(const QString &error)
Appends an error message to the stored list of errors.
void setRenderPartialOutput(bool enable)
Set whether our painter is drawing to a temporary image used just by this layer.
Raster data container.
static int typeSize(Qgis::DataType dataType) SIP_HOLDGIL
Returns the size in bytes for the specified dataType.
Base class for raster data providers.
The QgsRasterHistogram is a container for histogram of a single raster band.
Base class for processing filters like renderers, reprojector, resampler etc.
virtual QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr)=0
Read block of data using given extent and size.
virtual QgsRasterInterface * clone() const =0
Clone itself, create deep copy.
virtual int yBlockSize() const
virtual QgsRasterInterface * sourceInput()
Gets source / raw input, the first in pipe, usually provider.
virtual Qgis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
QList< QgsRasterBandStats > mStatistics
List of cached statistics, all bands mixed.
Capability
If you add to this, please also add to capabilitiesString()
virtual QgsRasterInterface * input() const
Current input.
virtual int xSize() const
Gets raster size.
virtual void setOn(bool on)
Sets whether the interface is on or off.
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...
virtual int xBlockSize() const
Gets block size.
virtual const QgsRasterInterface * sourceInput() const
Gets source / raw input, the first in pipe, usually provider.
virtual int bandCount() const =0
Gets number of bands.
virtual bool on() const
Returns whether the interface is on or off.
virtual ~QgsRasterInterface()=default
int dataTypeSize(int bandNo) const
Returns the size (in bytes) for the data type for the specified band.
virtual void readXml(const QDomElement &filterElem)
Sets base class members from xml. Usually called from create() methods of subclasses.
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
virtual int ySize() const
virtual QgsRectangle extent() const
Gets the extent of the interface.
QList< QgsRasterHistogram > mHistograms
List of cached histograms, all bands mixed.
virtual void writeXml(QDomDocument &doc, QDomElement &parentElem) const
Write base class members to xml.
virtual bool setInput(QgsRasterInterface *input)
Set input.
Raster pipe that deals with null values.
QgsRasterProjector implements approximate projection support for it calculates grid of points in sour...
Raster renderer pipe that applies colors to a raster.
Resample filter pipe for rasters.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Raster renderer pipe for single band color.
Raster renderer pipe for single band gray.
Raster renderer pipe for single band pseudocolor.
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:177
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_END
Definition: qgis_sip.h:194
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39