QGIS API Documentation  3.26.3-Buenos Aires (65e4edfdad)
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 #include "qgsrendercontext.h"
34 
41 class CORE_EXPORT QgsRasterBlockFeedback : public QgsFeedback
42 {
43  Q_OBJECT
44 
45  public:
47  QgsRasterBlockFeedback( QObject *parent = nullptr ) : QgsFeedback( parent ) {}
48 
53  virtual void onNewData() {}
54 
60  bool isPreviewOnly() const { return mPreviewOnly; }
61 
66  void setPreviewOnly( bool preview ) { mPreviewOnly = preview; }
67 
72  bool renderPartialOutput() const { return mRenderPartialOutput; }
73 
78  void setRenderPartialOutput( bool enable ) { mRenderPartialOutput = enable; }
79 
87  void appendError( const QString &error ) { mErrors.append( error ); }
88 
95  QStringList errors() const { return mErrors; }
96 
103  QgsRenderContext renderContext() const;
104 
111  void setRenderContext( const QgsRenderContext &renderContext );
112 
113  private:
114 
119  bool mPreviewOnly = false;
120 
122  bool mRenderPartialOutput = false;
123 
125  QStringList mErrors;
126 
127  QgsRenderContext mRenderContext;
128 };
129 
130 
135 class CORE_EXPORT QgsRasterInterface
136 {
137 #ifdef SIP_RUN
138 // QgsRasterInterface subclasses
140 #include <qgshuesaturationfilter.h>
141 #include <qgsrasterdataprovider.h>
142 #include <qgsrasternuller.h>
143 #include <qgsrasterprojector.h>
144 #include <qgsrasterrenderer.h>
145 #include <qgsrasterresamplefilter.h>
146 
147 // QgsRasterRenderer subclasses
148 #include <qgshillshaderenderer.h>
154 #endif
155 
156 
157 #ifdef SIP_RUN
159  if ( dynamic_cast<QgsBrightnessContrastFilter *>( sipCpp ) )
160  sipType = sipType_QgsBrightnessContrastFilter;
161  else if ( dynamic_cast<QgsHueSaturationFilter *>( sipCpp ) )
162  sipType = sipType_QgsHueSaturationFilter;
163  else if ( dynamic_cast<QgsRasterDataProvider *>( sipCpp ) )
164  {
165  sipType = sipType_QgsRasterDataProvider;
166  // use static cast because QgsRasterDataProvider has multiple inheritance
167  // and we would end up with bad pointer otherwise!
168  *sipCppRet = static_cast<QgsRasterDataProvider *>( sipCpp );
169  }
170  else if ( dynamic_cast<QgsRasterNuller *>( sipCpp ) )
171  sipType = sipType_QgsRasterNuller;
172  else if ( dynamic_cast<QgsRasterProjector *>( sipCpp ) )
173  sipType = sipType_QgsRasterProjector;
174  else if ( dynamic_cast<QgsRasterRenderer *>( sipCpp ) )
175  {
176  if ( dynamic_cast<QgsHillshadeRenderer *>( sipCpp ) )
177  sipType = sipType_QgsHillshadeRenderer;
178  else if ( dynamic_cast<QgsMultiBandColorRenderer *>( sipCpp ) )
179  sipType = sipType_QgsMultiBandColorRenderer;
180  else if ( dynamic_cast<QgsPalettedRasterRenderer *>( sipCpp ) )
181  sipType = sipType_QgsPalettedRasterRenderer;
182  else if ( dynamic_cast<QgsSingleBandColorDataRenderer *>( sipCpp ) )
183  sipType = sipType_QgsSingleBandColorDataRenderer;
184  else if ( dynamic_cast<QgsSingleBandGrayRenderer *>( sipCpp ) )
185  sipType = sipType_QgsSingleBandGrayRenderer;
186  else if ( dynamic_cast<QgsSingleBandPseudoColorRenderer *>( sipCpp ) )
187  sipType = sipType_QgsSingleBandPseudoColorRenderer;
188  else
189  sipType = sipType_QgsRasterRenderer;
190  }
191  else if ( dynamic_cast<QgsRasterResampleFilter *>( sipCpp ) )
192  sipType = sipType_QgsRasterResampleFilter;
193  else
194  sipType = 0;
195  SIP_END
196 #endif
197 
198  Q_DECLARE_TR_FUNCTIONS( QgsRasterInterface )
199 
200  public:
203  {
204  NoCapabilities = 0,
205  Size = 1 << 1,
206  Create = 1 << 2,
207  Remove = 1 << 3,
208  BuildPyramids = 1 << 4,
209  Identify = 1 << 5,
210  IdentifyValue = 1 << 6,
211  IdentifyText = 1 << 7,
212  IdentifyHtml = 1 << 8,
213  IdentifyFeature = 1 << 9,
214  Prefetch = 1 << 10,
215  };
216 
217  QgsRasterInterface( QgsRasterInterface *input = nullptr );
218 
219  virtual ~QgsRasterInterface() = default;
220 
222  virtual QgsRasterInterface *clone() const = 0 SIP_FACTORY;
223 
225  virtual int capabilities() const
226  {
228  }
229 
233  QString capabilitiesString() const;
234 
236  virtual Qgis::DataType dataType( int bandNo ) const = 0;
237 
242  virtual Qgis::DataType sourceDataType( int bandNo ) const { return mInput ? mInput->sourceDataType( bandNo ) : Qgis::DataType::UnknownDataType; }
243 
248  virtual QgsRectangle extent() const { return mInput ? mInput->extent() : QgsRectangle(); }
249 
253  int dataTypeSize( int bandNo ) const { return QgsRasterBlock::typeSize( dataType( bandNo ) ); }
254 
256  virtual int bandCount() const = 0;
257 
259  virtual int xBlockSize() const { return mInput ? mInput->xBlockSize() : 0; }
260  virtual int yBlockSize() const { return mInput ? mInput->yBlockSize() : 0; }
261 
263  virtual int xSize() const { return mInput ? mInput->xSize() : 0; }
264  virtual int ySize() const { return mInput ? mInput->ySize() : 0; }
265 
267  virtual QString generateBandName( int bandNumber ) const;
268 
274  virtual QString colorInterpretationName( int bandNumber ) const;
275 
281  QString displayBandName( int bandNumber ) const;
282 
293  virtual QgsRasterBlock *block( int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) = 0 SIP_FACTORY;
294 
299  virtual bool setInput( QgsRasterInterface *input ) { mInput = input; return true; }
300 
302  virtual QgsRasterInterface *input() const { return mInput; }
303 
305  virtual bool on() const { return mOn; }
306 
308  virtual void setOn( bool on ) { mOn = on; }
309 
316  virtual const QgsRasterInterface *sourceInput() const SIP_SKIP
317  {
318  QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 );
319  return mInput ? mInput->sourceInput() : this;
320  }
321 
328  {
329  QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 );
330  return mInput ? mInput->sourceInput() : this;
331  }
332 
341  virtual QgsRasterBandStats bandStatistics( int bandNo,
342  int stats = QgsRasterBandStats::All,
343  const QgsRectangle &extent = QgsRectangle(),
344  int sampleSize = 0, QgsRasterBlockFeedback *feedback = nullptr );
345 
350  virtual bool hasStatistics( int bandNo,
351  int stats = QgsRasterBandStats::All,
352  const QgsRectangle &extent = QgsRectangle(),
353  int sampleSize = 0 );
354 
355 
369 #ifndef SIP_RUN
370  virtual QgsRasterHistogram histogram( int bandNo,
371  int binCount = 0,
372  double minimum = std::numeric_limits<double>::quiet_NaN(),
373  double maximum = std::numeric_limits<double>::quiet_NaN(),
374  const QgsRectangle &extent = QgsRectangle(),
375  int sampleSize = 0,
376  bool includeOutOfRange = false,
377  QgsRasterBlockFeedback *feedback = nullptr );
378 #else
379  virtual QgsRasterHistogram histogram( int bandNo,
380  int binCount = 0,
381  SIP_PYOBJECT minimum = Py_None,
382  SIP_PYOBJECT maximum = Py_None,
383  const QgsRectangle &extent = QgsRectangle(),
384  int sampleSize = 0,
385  bool includeOutOfRange = false,
386  QgsRasterBlockFeedback *feedback = nullptr )
387  [QgsRasterHistogram( int bandNo,
388  int binCount = 0,
389  double minimum = 0.0,
390  double maximum = 0.0,
391  const QgsRectangle &extent = QgsRectangle(),
392  int sampleSize = 0,
393  bool includeOutOfRange = false,
394  QgsRasterBlockFeedback *feedback = nullptr )];
395  % MethodCode
396  double minimum;
397  double maximum;
398  if ( a2 == Py_None )
399  {
400  minimum = std::numeric_limits<double>::quiet_NaN();
401  }
402  else
403  {
404  minimum = PyFloat_AsDouble( a2 );
405  }
406 
407  if ( a3 == Py_None )
408  {
409  maximum = std::numeric_limits<double>::quiet_NaN();
410  }
411  else
412  {
413  maximum = PyFloat_AsDouble( a3 );
414  }
415 
416  QgsRasterHistogram *h = new QgsRasterHistogram( sipCpp->histogram( a0, a1, minimum, maximum, *a4, a5, a6, a7 ) );
417  return sipConvertFromType( h, sipType_QgsRasterHistogram, Py_None );
418  % End
419 #endif
420 
421 
426 #ifndef SIP_RUN
427  virtual bool hasHistogram( int bandNo,
428  int binCount,
429  double minimum = std::numeric_limits<double>::quiet_NaN(),
430  double maximum = std::numeric_limits<double>::quiet_NaN(),
431  const QgsRectangle &extent = QgsRectangle(),
432  int sampleSize = 0,
433  bool includeOutOfRange = false );
434 #else
435  virtual bool hasHistogram( int bandNo,
436  int binCount,
437  SIP_PYOBJECT minimum = Py_None,
438  SIP_PYOBJECT maximum = Py_None,
439  const QgsRectangle &extent = QgsRectangle(),
440  int sampleSize = 0,
441  bool includeOutOfRange = false )
442  [bool( int bandNo,
443  int binCount,
444  double minimum = 0.0,
445  double maximum = 0.0,
446  const QgsRectangle &extent = QgsRectangle(),
447  int sampleSize = 0,
448  bool includeOutOfRange = false )];
449  % MethodCode
450  double minimum;
451  double maximum;
452  if ( a2 == Py_None )
453  {
454  minimum = std::numeric_limits<double>::quiet_NaN();
455  }
456  else
457  {
458  minimum = PyFloat_AsDouble( a2 );
459  }
460 
461  if ( a3 == Py_None )
462  {
463  maximum = std::numeric_limits<double>::quiet_NaN();
464  }
465  else
466  {
467  maximum = PyFloat_AsDouble( a3 );
468  }
469 
470  sipRes = sipCpp->hasHistogram( a0, a1, minimum, maximum, *a4, a5, a6 );
471  % End
472 #endif
473 
474 
485  virtual void cumulativeCut( int bandNo,
486  double lowerCount,
487  double upperCount,
488  double &lowerValue,
489  double &upperValue,
490  const QgsRectangle &extent = QgsRectangle(),
491  int sampleSize = 0 );
492 
494  virtual void writeXml( QDomDocument &doc, QDomElement &parentElem ) const { Q_UNUSED( doc ) Q_UNUSED( parentElem ); }
496  virtual void readXml( const QDomElement &filterElem ) { Q_UNUSED( filterElem ) }
497 
498  protected:
499  // QgsRasterInterface used as input
500  QgsRasterInterface *mInput = nullptr;
501 
503  QList<QgsRasterBandStats> mStatistics;
504 
506  QList<QgsRasterHistogram> mHistograms;
507 
508  // On/off state, if off, it does not do anything, replicates input
509  bool mOn = true;
510 
515 #ifndef SIP_RUN
516  void initHistogram( QgsRasterHistogram &histogram,
517  int bandNo,
518  int binCount,
519  double minimum = std::numeric_limits<double>::quiet_NaN(),
520  double maximum = std::numeric_limits<double>::quiet_NaN(),
521  const QgsRectangle &boundingBox = QgsRectangle(),
522  int sampleSize = 0,
523  bool includeOutOfRange = false );
524 #else
525  void initHistogram( QgsRasterHistogram &histogram,
526  int bandNo,
527  int binCount,
528  SIP_PYOBJECT minimum = Py_None,
529  SIP_PYOBJECT maximum = Py_None,
530  const QgsRectangle &boundingBox = QgsRectangle(),
531  int sampleSize = 0,
532  bool includeOutOfRange = false )
533  [void ( QgsRasterHistogram & histogram,
534  int bandNo,
535  int binCount,
536  double minimum = 0.0,
537  double maximum = 0.0,
538  const QgsRectangle &boundingBox = QgsRectangle(),
539  int sampleSize = 0,
540  bool includeOutOfRange = false )];
541  % MethodCode
542  double minimum;
543  double maximum;
544  if ( a3 == Py_None )
545  {
546  minimum = std::numeric_limits<double>::quiet_NaN();
547  }
548  else
549  {
550  minimum = PyFloat_AsDouble( a3 );
551  }
552 
553  if ( a4 == Py_None )
554  {
555  maximum = std::numeric_limits<double>::quiet_NaN();
556  }
557  else
558  {
559  maximum = PyFloat_AsDouble( a4 );
560  }
561 
562 #if defined(SIP_PROTECTED_IS_PUBLIC) || (SIP_VERSION >= 0x050000 && !defined(_MSC_VER))
563  sipCpp->initHistogram( *a0, a1, a2, minimum, maximum, *a5, a6, a7 );
564 #else
565  sipCpp->sipProtect_initHistogram( *a0, a1, a2, minimum, maximum, *a5, a6, a7 );
566 #endif
567  % End
568 #endif
569 
571  void initStatistics( QgsRasterBandStats &statistics, int bandNo,
572  int stats = QgsRasterBandStats::All,
573  const QgsRectangle &boundingBox = QgsRectangle(),
574  int binCount = 0 ) const;
575 
576  private:
577 #ifdef SIP_RUN
579  QgsRasterInterface &operator=( const QgsRasterInterface & );
580 #endif
581 
582  Q_DISABLE_COPY( QgsRasterInterface ) // there is clone() for copying
583 };
584 
585 #endif
qgsrasterbandstats.h
qgsrasterprojector.h
QgsRasterInterface::setOn
virtual void setOn(bool on)
Sets whether the interface is on or off.
Definition: qgsrasterinterface.h:308
QgsHillshadeRenderer
A renderer for generating live hillshade models.
Definition: qgshillshaderenderer.h:36
QgsRasterInterface::mStatistics
QList< QgsRasterBandStats > mStatistics
List of cached statistics, all bands mixed.
Definition: qgsrasterinterface.h:503
QgsRasterInterface::writeXml
virtual void writeXml(QDomDocument &doc, QDomElement &parentElem) const
Write base class members to xml.
Definition: qgsrasterinterface.h:494
QgsRasterInterface::sourceDataType
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...
Definition: qgsrasterinterface.h:242
qgsrectangle.h
qgsrasterhistogram.h
QgsDebugMsgLevel
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
QgsRasterBandStats
The RasterBandStats struct is a container for statistics about a single raster band.
Definition: qgsrasterbandstats.h:34
QgsRasterInterface::xBlockSize
virtual int xBlockSize() const
Gets block size.
Definition: qgsrasterinterface.h:259
Qgis::DataType
DataType
Raster data types.
Definition: qgis.h:128
QgsRasterInterface::yBlockSize
virtual int yBlockSize() const
Definition: qgsrasterinterface.h:260
QgsSingleBandGrayRenderer
Raster renderer pipe for single band gray.
Definition: qgssinglebandgrayrenderer.h:35
QgsRenderContext
Contains information about the context of a rendering operation.
Definition: qgsrendercontext.h:59
qgssinglebandcolordatarenderer.h
qgsrasterrenderer.h
QgsRasterNuller
Raster pipe that deals with null values.
Definition: qgsrasternuller.h:32
QgsRasterBlock::typeSize
static int typeSize(Qgis::DataType dataType) SIP_HOLDGIL
Returns the size in bytes for the specified dataType.
Definition: qgsrasterblock.h:83
qgssinglebandpseudocolorrenderer.h
QgsRectangle
A rectangle specified with double values.
Definition: qgsrectangle.h:41
SIP_FACTORY
#define SIP_FACTORY
Definition: qgis_sip.h:76
QgsSingleBandColorDataRenderer
Raster renderer pipe for single band color.
Definition: qgssinglebandcolordatarenderer.h:31
QgsRasterProjector
QgsRasterProjector implements approximate projection support for it calculates grid of points in sour...
Definition: qgsrasterprojector.h:47
SIP_CONVERT_TO_SUBCLASS_CODE
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:186
QgsRasterInterface::NoCapabilities
@ NoCapabilities
Definition: qgsrasterinterface.h:204
qgshillshaderenderer.h
QgsRasterInterface::sourceInput
virtual const QgsRasterInterface * sourceInput() const
Gets source / raw input, the first in pipe, usually provider.
Definition: qgsrasterinterface.h:316
SIP_SKIP
#define SIP_SKIP
Definition: qgis_sip.h:126
QgsRasterInterface::setInput
virtual bool setInput(QgsRasterInterface *input)
Set input.
Definition: qgsrasterinterface.h:299
QgsRasterBandStats::All
@ All
Definition: qgsrasterbandstats.h:73
qgspalettedrasterrenderer.h
QgsRasterInterface::xSize
virtual int xSize() const
Gets raster size.
Definition: qgsrasterinterface.h:263
QgsRasterRenderer
Raster renderer pipe that applies colors to a raster.
Definition: qgsrasterrenderer.h:40
qgsrasterblock.h
QgsFeedback
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:44
Qgis::DataType::UnknownDataType
@ UnknownDataType
Unknown or unspecified type.
qgis_sip.h
qgsrendercontext.h
QgsHueSaturationFilter
Color and saturation filter pipe for rasters.
Definition: qgshuesaturationfilter.h:31
QgsRasterInterface::readXml
virtual void readXml(const QDomElement &filterElem)
Sets base class members from xml. Usually called from create() methods of subclasses.
Definition: qgsrasterinterface.h:496
QgsMultiBandColorRenderer
Renderer for multiband images with the color components.
Definition: qgsmultibandcolorrenderer.h:32
QgsPalettedRasterRenderer
Renderer for paletted raster images.
Definition: qgspalettedrasterrenderer.h:35
qgsrasterresamplefilter.h
qgsbrightnesscontrastfilter.h
qgssinglebandgrayrenderer.h
QgsRasterInterface::ySize
virtual int ySize() const
Definition: qgsrasterinterface.h:264
qgshuesaturationfilter.h
QgsRasterInterface::mHistograms
QList< QgsRasterHistogram > mHistograms
List of cached histograms, all bands mixed.
Definition: qgsrasterinterface.h:506
QgsRasterInterface
Base class for processing filters like renderers, reprojector, resampler etc.
Definition: qgsrasterinterface.h:135
QgsBrightnessContrastFilter
Brightness/contrast and gamma correction filter pipe for rasters.
Definition: qgsbrightnesscontrastfilter.h:31
QgsRasterInterface::Capability
Capability
If you add to this, please also add to capabilitiesString()
Definition: qgsrasterinterface.h:202
QgsRasterHistogram
The QgsRasterHistogram is a container for histogram of a single raster band. It is used to cache comp...
Definition: qgsrasterhistogram.h:33
QgsRasterResampleFilter
Resample filter pipe for rasters.
Definition: qgsrasterresamplefilter.h:32
QgsRasterInterface::input
virtual QgsRasterInterface * input() const
Current input.
Definition: qgsrasterinterface.h:302
qgsmultibandcolorrenderer.h
QgsRasterBlockFeedback
Feedback object tailored for raster block reading.
Definition: qgsrasterinterface.h:41
QgsFeedback::QgsFeedback
QgsFeedback(QObject *parent=nullptr)
Construct a feedback object.
Definition: qgsfeedback.h:62
QgsRasterInterface::dataTypeSize
int dataTypeSize(int bandNo) const
Returns the size (in bytes) for the data type for the specified band.
Definition: qgsrasterinterface.h:253
QgsRasterInterface::sourceInput
virtual QgsRasterInterface * sourceInput()
Gets source / raw input, the first in pipe, usually provider.
Definition: qgsrasterinterface.h:327
QgsSingleBandPseudoColorRenderer
Raster renderer pipe for single band pseudocolor.
Definition: qgssinglebandpseudocolorrenderer.h:35
QgsRasterInterface::on
virtual bool on() const
Returns whether the interface is on or off.
Definition: qgsrasterinterface.h:305
qgsrasternuller.h
qgsfeedback.h
SIP_END
#define SIP_END
Definition: qgis_sip.h:203
QgsRasterInterface::capabilities
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
Definition: qgsrasterinterface.h:225
QgsRasterDataProvider
Base class for raster data providers.
Definition: qgsrasterdataprovider.h:88
QgsRasterBlock
Raster data container.
Definition: qgsrasterblock.h:36
QgsRasterInterface::extent
virtual QgsRectangle extent() const
Gets the extent of the interface.
Definition: qgsrasterinterface.h:248
qgsrasterdataprovider.h