QGIS API Documentation  2.17.0-Master (f49f7ce)
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 <limits>
22 
23 #include <QCoreApplication> // for tr()
24 #include <QImage>
25 
26 #include "qgsfeedback.h"
27 #include "qgslogger.h"
28 #include "qgsrasterbandstats.h"
29 #include "qgsrasterblock.h"
30 #include "qgsrasterhistogram.h"
31 #include "qgsrectangle.h"
32 
38 class CORE_EXPORT QgsRasterBlockFeedback : public QgsFeedback
39 {
40  public:
42  QgsRasterBlockFeedback( QObject* parent = nullptr ) : QgsFeedback( parent ), mPreviewOnly( false ), mRenderPartialOutput( false ) {}
43 
46  virtual void onNewData() {}
47 
51  bool isPreviewOnly() const { return mPreviewOnly; }
54  void setPreviewOnly( bool preview ) { mPreviewOnly = preview; }
55 
58  bool renderPartialOutput() const { return mRenderPartialOutput; }
61  void setRenderPartialOutput( bool enable ) { mRenderPartialOutput = enable; }
62 
63  private:
66  bool mPreviewOnly;
67 
69  bool mRenderPartialOutput;
70 };
71 
72 
76 class CORE_EXPORT QgsRasterInterface
77 {
78  Q_DECLARE_TR_FUNCTIONS( QgsRasterInterface )
79 
80  public:
83  {
84  NoCapabilities = 0,
85  Size = 1 << 1, // original data source size (and thus resolution) is known, it is not always available, for example for WMS
86  Create = 1 << 2, // create new datasets
87  Remove = 1 << 3, // delete datasets
88  BuildPyramids = 1 << 4, // supports building of pyramids (overviews)
89  Identify = 1 << 5, // at least one identify format supported
90  IdentifyValue = 1 << 6, // numerical values
91  IdentifyText = 1 << 7, // WMS text
92  IdentifyHtml = 1 << 8, // WMS HTML
93  IdentifyFeature = 1 << 9, // WMS GML -> feature
94  };
95 
96  QgsRasterInterface( QgsRasterInterface * input = nullptr );
97 
98  virtual ~QgsRasterInterface();
99 
101  virtual QgsRasterInterface *clone() const = 0;
102 
104  virtual int capabilities() const
105  {
107  }
108 
112  QString capabilitiesString() const;
113 
115  virtual QGis::DataType dataType( int bandNo ) const = 0;
116 
119  virtual QGis::DataType srcDataType( int bandNo ) const { return mInput ? mInput->srcDataType( bandNo ) : QGis::UnknownDataType; }
120 
125  virtual QgsRectangle extent() { return mInput ? mInput->extent() : QgsRectangle(); }
126 
127  int dataTypeSize( int bandNo ) { return QgsRasterBlock::typeSize( dataType( bandNo ) ); }
128 
130  virtual int bandCount() const = 0;
131 
133  virtual int xBlockSize() const { return mInput ? mInput->xBlockSize() : 0; }
134  virtual int yBlockSize() const { return mInput ? mInput->yBlockSize() : 0; }
135 
137  virtual int xSize() const { return mInput ? mInput->xSize() : 0; }
138  virtual int ySize() const { return mInput ? mInput->ySize() : 0; }
139 
141  virtual QString generateBandName( int theBandNumber ) const
142  {
143  return tr( "Band" ) + QString( " %1" ) .arg( theBandNumber, 1 + static_cast< int >( log10( static_cast< double >( bandCount() ) ) ), 10, QChar( '0' ) );
144  }
145 
154  virtual QgsRasterBlock *block( int bandNo, const QgsRectangle &extent, int width, int height ) = 0;
155 
167  virtual QgsRasterBlock *block2( int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback* feedback = nullptr )
168  {
169  Q_UNUSED( feedback );
170  return block( bandNo, extent, width, height );
171  }
172 
175  virtual bool setInput( QgsRasterInterface* input ) { mInput = input; return true; }
176 
178  virtual QgsRasterInterface * input() const { return mInput; }
179 
181  virtual bool on() const { return mOn; }
182 
184  virtual void setOn( bool on ) { mOn = on; }
185 
190  virtual const QgsRasterInterface *srcInput() const
191  {
192  QgsDebugMsgLevel( "Entered", 4 );
193  return mInput ? mInput->srcInput() : this;
194  }
196  {
197  QgsDebugMsgLevel( "Entered", 4 );
198  return mInput ? mInput->srcInput() : this;
199  }
200 
208  virtual QgsRasterBandStats bandStatistics( int theBandNo,
209  int theStats = QgsRasterBandStats::All,
210  const QgsRectangle & theExtent = QgsRectangle(),
211  int theSampleSize = 0 );
212 
216  virtual bool hasStatistics( int theBandNo,
217  int theStats = QgsRasterBandStats::All,
218  const QgsRectangle & theExtent = QgsRectangle(),
219  int theSampleSize = 0 );
220 
232  virtual QgsRasterHistogram histogram( int theBandNo,
233  int theBinCount = 0,
234  double theMinimum = std::numeric_limits<double>::quiet_NaN(),
235  double theMaximum = std::numeric_limits<double>::quiet_NaN(),
236  const QgsRectangle & theExtent = QgsRectangle(),
237  int theSampleSize = 0,
238  bool theIncludeOutOfRange = false );
239 
243  virtual bool hasHistogram( int theBandNo,
244  int theBinCount,
245  double theMinimum = std::numeric_limits<double>::quiet_NaN(),
246  double theMaximum = std::numeric_limits<double>::quiet_NaN(),
247  const QgsRectangle & theExtent = QgsRectangle(),
248  int theSampleSize = 0,
249  bool theIncludeOutOfRange = false );
250 
260  virtual void cumulativeCut( int theBandNo,
261  double theLowerCount,
262  double theUpperCount,
263  double &theLowerValue,
264  double &theUpperValue,
265  const QgsRectangle & theExtent = QgsRectangle(),
266  int theSampleSize = 0 );
267 
269  virtual void writeXML( QDomDocument& doc, QDomElement& parentElem ) const { Q_UNUSED( doc ); Q_UNUSED( parentElem ); }
271  virtual void readXML( const QDomElement& filterElem ) { Q_UNUSED( filterElem ); }
272 
273  protected:
274  // QgsRasterInterface used as input
276 
279 
282 
283  // On/off state, if off, it does not do anything, replicates input
284  bool mOn;
285 
289  void initHistogram( QgsRasterHistogram &theHistogram, int theBandNo,
290  int theBinCount = 0,
291  double theMinimum = std::numeric_limits<double>::quiet_NaN(),
292  double theMaximum = std::numeric_limits<double>::quiet_NaN(),
293  const QgsRectangle & theExtent = QgsRectangle(),
294  int theSampleSize = 0,
295  bool theIncludeOutOfRange = false );
296 
298  void initStatistics( QgsRasterBandStats &theStatistics, int theBandNo,
299  int theStats = QgsRasterBandStats::All,
300  const QgsRectangle & theExtent = QgsRectangle(),
301  int theBinCount = 0 );
302 
303 };
304 
305 #endif
306 
307 
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:35
Unknown or unspecified type.
Definition: qgis.h:135
virtual int xBlockSize() const
Get block size.
virtual void readXML(const QDomElement &filterElem)
Sets base class members from xml.
virtual const QgsRasterInterface * srcInput() const
Get source / raw input, the first in pipe, usually provider.
virtual int yBlockSize() const
Capability
If you add to this, please also add to capabilitiesString()
virtual QgsRasterInterface * input() const
Current input.
void setRenderPartialOutput(bool enable)
Set whether our painter is drawing to a temporary image used just by this layer.
virtual int ySize() const
virtual QgsRasterBlock * block2(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr)
Read block of data using given extent and size.
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:40
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:34
virtual void setOn(bool on)
Set on/off.
QList< QgsRasterHistogram > mHistograms
List of cached histograms, all bands mixed.
virtual void writeXML(QDomDocument &doc, QDomElement &parentElem) const
Write base class members to xml.
bool renderPartialOutput() const
Whether our painter is drawing to a temporary image used just by this layer.
virtual QString generateBandName(int theBandNumber) const
helper function to create zero padded band names
QgsRasterBlockFeedback(QObject *parent=nullptr)
Construct a new raster block feedback object.
static int typeSize(int dataType)
Base class for processing filters like renderers, reprojector, resampler etc.
virtual QgsRasterInterface * srcInput()
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
virtual bool setInput(QgsRasterInterface *input)
Set input.
virtual QgsRectangle extent()
Get the extent of the interface.
virtual int xSize() const
Get raster size.
virtual QGis::DataType srcDataType(int bandNo) const
Returns source data type for the band specified by number, source data type may be shorter than dataT...
DataType
Raster data types.
Definition: qgis.h:133
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.
QgsRasterInterface * mInput
Feedback object tailored for raster block reading.
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
bool isPreviewOnly() const
Whether the raster provider should return only data that are already available without waiting for fu...
virtual bool on() const
Is on/off.