QGIS API Documentation  3.6.0-Noosa (5873452)
qgsrasterdataprovider.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrasterdataprovider.cpp - DataProvider Interface for raster layers
3  --------------------------------------
4  Date : Mar 11, 2005
5  Copyright : (C) 2005 by Brendan Morley
6  email : morb at ozemail dot com dot au
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 #include "qgsproviderregistry.h"
19 #include "qgsrasterdataprovider.h"
21 #include "qgsrasterprojector.h"
22 #include "qgslogger.h"
23 #include "qgsapplication.h"
24 
25 #include <QTime>
26 #include <QMap>
27 #include <QByteArray>
28 #include <QVariant>
29 
30 #define ERR(message) QgsError(message, "Raster provider")
31 
33 {
34  if ( mUseSrcNoDataValue.size() < bandNo )
35  {
36  for ( int i = mUseSrcNoDataValue.size(); i < bandNo; i++ )
37  {
38  mUseSrcNoDataValue.append( false );
39  }
40  }
41  mUseSrcNoDataValue[bandNo - 1] = use;
42 }
43 
44 QgsRasterBlock *QgsRasterDataProvider::block( int bandNo, QgsRectangle const &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback )
45 {
46  QgsDebugMsgLevel( QStringLiteral( "bandNo = %1 width = %2 height = %3" ).arg( bandNo ).arg( width ).arg( height ), 4 );
47  QgsDebugMsgLevel( QStringLiteral( "boundingBox = %1" ).arg( boundingBox.toString() ), 4 );
48 
49  QgsRasterBlock *block = new QgsRasterBlock( dataType( bandNo ), width, height );
50  if ( sourceHasNoDataValue( bandNo ) && useSourceNoDataValue( bandNo ) )
51  {
52  block->setNoDataValue( sourceNoDataValue( bandNo ) );
53  }
54 
55  if ( block->isEmpty() )
56  {
57  QgsDebugMsg( QStringLiteral( "Couldn't create raster block" ) );
58  return block;
59  }
60 
61  // Read necessary extent only
62  QgsRectangle tmpExtent = extent().intersect( boundingBox );
63 
64  if ( tmpExtent.isEmpty() )
65  {
66  QgsDebugMsg( QStringLiteral( "Extent outside provider extent" ) );
67  block->setIsNoData();
68  return block;
69  }
70 
71  double xRes = boundingBox.width() / width;
72  double yRes = boundingBox.height() / height;
73  double tmpXRes, tmpYRes;
74  double providerXRes = 0;
75  double providerYRes = 0;
76  if ( capabilities() & Size )
77  {
78  providerXRes = extent().width() / xSize();
79  providerYRes = extent().height() / ySize();
80  tmpXRes = std::max( providerXRes, xRes );
81  tmpYRes = std::max( providerYRes, yRes );
82  if ( qgsDoubleNear( tmpXRes, xRes ) ) tmpXRes = xRes;
83  if ( qgsDoubleNear( tmpYRes, yRes ) ) tmpYRes = yRes;
84  }
85  else
86  {
87  tmpXRes = xRes;
88  tmpYRes = yRes;
89  }
90 
91  if ( tmpExtent != boundingBox ||
92  tmpXRes > xRes || tmpYRes > yRes )
93  {
94  // Read smaller extent or lower resolution
95 
96  if ( !extent().contains( boundingBox ) )
97  {
98  QRect subRect = QgsRasterBlock::subRect( boundingBox, width, height, extent() );
99  block->setIsNoDataExcept( subRect );
100  }
101 
102  // Calculate row/col limits (before tmpExtent is aligned)
103  int fromRow = std::round( ( boundingBox.yMaximum() - tmpExtent.yMaximum() ) / yRes );
104  int toRow = std::round( ( boundingBox.yMaximum() - tmpExtent.yMinimum() ) / yRes ) - 1;
105  int fromCol = std::round( ( tmpExtent.xMinimum() - boundingBox.xMinimum() ) / xRes );
106  int toCol = std::round( ( tmpExtent.xMaximum() - boundingBox.xMinimum() ) / xRes ) - 1;
107 
108  QgsDebugMsgLevel( QStringLiteral( "fromRow = %1 toRow = %2 fromCol = %3 toCol = %4" ).arg( fromRow ).arg( toRow ).arg( fromCol ).arg( toCol ), 4 );
109 
110  if ( fromRow < 0 || fromRow >= height || toRow < 0 || toRow >= height ||
111  fromCol < 0 || fromCol >= width || toCol < 0 || toCol >= width )
112  {
113  // Should not happen
114  QgsDebugMsg( QStringLiteral( "Row or column limits out of range" ) );
115  return block;
116  }
117 
118  // If lower source resolution is used, the extent must beS aligned to original
119  // resolution to avoid possible shift due to resampling
120  if ( tmpXRes > xRes )
121  {
122  int col = std::floor( ( tmpExtent.xMinimum() - extent().xMinimum() ) / providerXRes );
123  tmpExtent.setXMinimum( extent().xMinimum() + col * providerXRes );
124  col = std::ceil( ( tmpExtent.xMaximum() - extent().xMinimum() ) / providerXRes );
125  tmpExtent.setXMaximum( extent().xMinimum() + col * providerXRes );
126  }
127  if ( tmpYRes > yRes )
128  {
129  int row = std::floor( ( extent().yMaximum() - tmpExtent.yMaximum() ) / providerYRes );
130  tmpExtent.setYMaximum( extent().yMaximum() - row * providerYRes );
131  row = std::ceil( ( extent().yMaximum() - tmpExtent.yMinimum() ) / providerYRes );
132  tmpExtent.setYMinimum( extent().yMaximum() - row * providerYRes );
133  }
134  int tmpWidth = std::round( tmpExtent.width() / tmpXRes );
135  int tmpHeight = std::round( tmpExtent.height() / tmpYRes );
136  tmpXRes = tmpExtent.width() / tmpWidth;
137  tmpYRes = tmpExtent.height() / tmpHeight;
138 
139  QgsDebugMsgLevel( QStringLiteral( "Reading smaller block tmpWidth = %1 height = %2" ).arg( tmpWidth ).arg( tmpHeight ), 4 );
140  QgsDebugMsgLevel( QStringLiteral( "tmpExtent = %1" ).arg( tmpExtent.toString() ), 4 );
141 
142  QgsRasterBlock *tmpBlock = new QgsRasterBlock( dataType( bandNo ), tmpWidth, tmpHeight );
143  if ( sourceHasNoDataValue( bandNo ) && useSourceNoDataValue( bandNo ) )
144  {
145  tmpBlock->setNoDataValue( sourceNoDataValue( bandNo ) );
146  }
147 
148  readBlock( bandNo, tmpExtent, tmpWidth, tmpHeight, tmpBlock->bits(), feedback );
149 
150  int pixelSize = dataTypeSize( bandNo );
151 
152  double xMin = boundingBox.xMinimum();
153  double yMax = boundingBox.yMaximum();
154  double tmpXMin = tmpExtent.xMinimum();
155  double tmpYMax = tmpExtent.yMaximum();
156 
157  for ( int row = fromRow; row <= toRow; row++ )
158  {
159  double y = yMax - ( row + 0.5 ) * yRes;
160  int tmpRow = std::floor( ( tmpYMax - y ) / tmpYRes );
161 
162  for ( int col = fromCol; col <= toCol; col++ )
163  {
164  double x = xMin + ( col + 0.5 ) * xRes;
165  int tmpCol = std::floor( ( x - tmpXMin ) / tmpXRes );
166 
167  if ( tmpRow < 0 || tmpRow >= tmpHeight || tmpCol < 0 || tmpCol >= tmpWidth )
168  {
169  QgsDebugMsg( QStringLiteral( "Source row or column limits out of range" ) );
170  block->setIsNoData(); // so that the problem becomes obvious and fixed
171  delete tmpBlock;
172  return block;
173  }
174 
175  qgssize tmpIndex = static_cast< qgssize >( tmpRow ) * static_cast< qgssize >( tmpWidth ) + tmpCol;
176  qgssize index = row * static_cast< qgssize >( width ) + col;
177 
178  char *tmpBits = tmpBlock->bits( tmpIndex );
179  char *bits = block->bits( index );
180  if ( !tmpBits )
181  {
182  QgsDebugMsg( QStringLiteral( "Cannot get input block data tmpRow = %1 tmpCol = %2 tmpIndex = %3." ).arg( tmpRow ).arg( tmpCol ).arg( tmpIndex ) );
183  continue;
184  }
185  if ( !bits )
186  {
187  QgsDebugMsg( QStringLiteral( "Cannot set output block data." ) );
188  continue;
189  }
190  memcpy( bits, tmpBits, pixelSize );
191  }
192  }
193 
194  delete tmpBlock;
195  }
196  else
197  {
198  readBlock( bandNo, boundingBox, width, height, block->bits(), feedback );
199  }
200 
201  // apply scale and offset
202  block->applyScaleOffset( bandScale( bandNo ), bandOffset( bandNo ) );
203  // apply user no data values
204  block->applyNoDataValues( userNoDataValues( bandNo ) );
205  return block;
206 }
207 
210  , QgsRasterInterface( nullptr )
211 {
212 }
213 
215  : QgsDataProvider( uri, options )
216  , QgsRasterInterface( nullptr )
217 {
218 }
219 
220 QgsRasterDataProvider::ProviderCapabilities QgsRasterDataProvider::providerCapabilities() const
221 {
223 }
224 
225 //
226 //Random Static convenience function
227 //
229 // convenience function for building metadata() HTML table cells
230 
232 {
233  QString s;
234  return s;
235 }
236 
237 // Default implementation for values
238 QgsRasterIdentifyResult QgsRasterDataProvider::identify( const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox, int width, int height, int /*dpi*/ )
239 {
240  QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 );
241  QMap<int, QVariant> results;
242 
243  if ( format != QgsRaster::IdentifyFormatValue || !( capabilities() & IdentifyValue ) )
244  {
245  QgsDebugMsg( QStringLiteral( "Format not supported" ) );
246  return QgsRasterIdentifyResult( ERR( tr( "Format not supported" ) ) );
247  }
248 
249  if ( !extent().contains( point ) )
250  {
251  // Outside the raster
252  for ( int bandNo = 1; bandNo <= bandCount(); bandNo++ )
253  {
254  results.insert( bandNo, QVariant() );
255  }
257  }
258 
259  QgsRectangle finalExtent = boundingBox;
260  if ( finalExtent.isEmpty() )
261  finalExtent = extent();
262 
263  if ( width == 0 )
264  {
265  width = capabilities() & Size ? xSize() : 1000;
266  }
267  if ( height == 0 )
268  {
269  height = capabilities() & Size ? ySize() : 1000;
270  }
271 
272  // Calculate the row / column where the point falls
273  double xres = ( finalExtent.width() ) / width;
274  double yres = ( finalExtent.height() ) / height;
275 
276  int col = static_cast< int >( std::floor( ( point.x() - finalExtent.xMinimum() ) / xres ) );
277  int row = static_cast< int >( std::floor( ( finalExtent.yMaximum() - point.y() ) / yres ) );
278 
279  double xMin = finalExtent.xMinimum() + col * xres;
280  double xMax = xMin + xres;
281  double yMax = finalExtent.yMaximum() - row * yres;
282  double yMin = yMax - yres;
283  QgsRectangle pixelExtent( xMin, yMin, xMax, yMax );
284 
285  for ( int i = 1; i <= bandCount(); i++ )
286  {
287  std::unique_ptr< QgsRasterBlock > bandBlock( block( i, pixelExtent, 1, 1 ) );
288 
289  if ( bandBlock )
290  {
291  double value = bandBlock->value( 0 );
292 
293  results.insert( i, value );
294  }
295  else
296  {
297  results.insert( i, QVariant() );
298  }
299  }
301 }
302 
303 double QgsRasterDataProvider::sample( const QgsPointXY &point, int band,
304  bool *ok, const QgsRectangle &boundingBox, int width, int height, int dpi )
305 {
306  if ( ok )
307  *ok = false;
308 
309  const auto res = identify( point, QgsRaster::IdentifyFormatValue, boundingBox, width, height, dpi );
310  const QVariant value = res.results().value( band );
311 
312  if ( !value.isValid() )
313  return std::numeric_limits<double>::quiet_NaN();
314 
315  if ( ok )
316  *ok = true;
317 
318  return value.toDouble( ok );
319 }
320 
322 {
323  return QStringLiteral( "text/plain" );
324 }
325 
326 bool QgsRasterDataProvider::writeBlock( QgsRasterBlock *block, int band, int xOffset, int yOffset )
327 {
328  if ( !block )
329  return false;
330  if ( !isEditable() )
331  {
332  QgsDebugMsg( QStringLiteral( "writeBlock() called on read-only provider." ) );
333  return false;
334  }
335  return write( block->bits(), band, block->width(), block->height(), xOffset, yOffset );
336 }
337 
338 typedef QList<QPair<QString, QString> > *pyramidResamplingMethods_t();
339 QList<QPair<QString, QString> > QgsRasterDataProvider::pyramidResamplingMethods( const QString &providerKey )
340 {
341  pyramidResamplingMethods_t *pPyramidResamplingMethods = reinterpret_cast< pyramidResamplingMethods_t * >( cast_to_fptr( QgsProviderRegistry::instance()->function( providerKey, "pyramidResamplingMethods" ) ) );
342  if ( pPyramidResamplingMethods )
343  {
344  QList<QPair<QString, QString> > *methods = pPyramidResamplingMethods();
345  if ( !methods )
346  {
347  QgsDebugMsg( QStringLiteral( "provider pyramidResamplingMethods returned no methods" ) );
348  }
349  else
350  {
351  return *methods;
352  }
353  }
354  else
355  {
356  QgsDebugMsg( QStringLiteral( "Could not resolve pyramidResamplingMethods provider library" ) );
357  }
358  return QList<QPair<QString, QString> >();
359 }
360 
362 {
363  QList<QgsRasterPyramid> myPyramidList = buildPyramidList();
364 
365  if ( myPyramidList.isEmpty() )
366  return false;
367 
368  QList<QgsRasterPyramid>::iterator myRasterPyramidIterator;
369  for ( myRasterPyramidIterator = myPyramidList.begin();
370  myRasterPyramidIterator != myPyramidList.end();
371  ++myRasterPyramidIterator )
372  {
373  if ( myRasterPyramidIterator->exists )
374  {
375  return true;
376  }
377  }
378  return false;
379 }
380 
382 {
383  if ( bandNo >= mUserNoDataValue.size() )
384  {
385  for ( int i = mUserNoDataValue.size(); i < bandNo; i++ )
386  {
388  }
389  }
390  QgsDebugMsgLevel( QStringLiteral( "set %1 band %1 no data ranges" ).arg( noData.size() ), 4 );
391 
392  if ( mUserNoDataValue[bandNo - 1] != noData )
393  {
394  // Clear statistics
395  int i = 0;
396  while ( i < mStatistics.size() )
397  {
398  if ( mStatistics.value( i ).bandNumber == bandNo )
399  {
400  mStatistics.removeAt( i );
401  mHistograms.removeAt( i );
402  }
403  else
404  {
405  i++;
406  }
407  }
408  mUserNoDataValue[bandNo - 1] = noData;
409  }
410 }
411 
412 typedef QgsRasterDataProvider *createFunction_t( const QString &,
413  const QString &, int,
415  int, int, double *,
417  QStringList );
418 
420  const QString &uri,
421  const QString &format, int nBands,
422  Qgis::DataType type,
423  int width, int height, double *geoTransform,
425  const QStringList &createOptions )
426 {
427  createFunction_t *createFn = reinterpret_cast< createFunction_t * >( cast_to_fptr( QgsProviderRegistry::instance()->function( providerKey, "create" ) ) );
428  if ( !createFn )
429  {
430  QgsDebugMsg( "Cannot resolve 'create' function in " + providerKey + " provider" );
431  // TODO: it would be good to return invalid QgsRasterDataProvider
432  // with QgsError set, but QgsRasterDataProvider has pure virtual methods
433  return nullptr;
434  }
435  return createFn( uri, format, nBands, type, width, height, geoTransform, crs, createOptions );
436 }
437 
439 {
440  switch ( format )
441  {
443  return QStringLiteral( "Value" );
445  return QStringLiteral( "Text" );
447  return QStringLiteral( "Html" );
449  return QStringLiteral( "Feature" );
450  default:
451  return QStringLiteral( "Undefined" );
452  }
453 }
454 
456 {
457  switch ( format )
458  {
460  return tr( "Value" );
462  return tr( "Text" );
464  return tr( "Html" );
466  return tr( "Feature" );
467  default:
468  return QStringLiteral( "Undefined" );
469  }
470 }
471 
473 {
474  if ( formatName == QLatin1String( "Value" ) ) return QgsRaster::IdentifyFormatValue;
475  if ( formatName == QLatin1String( "Text" ) ) return QgsRaster::IdentifyFormatText;
476  if ( formatName == QLatin1String( "Html" ) ) return QgsRaster::IdentifyFormatHtml;
477  if ( formatName == QLatin1String( "Feature" ) ) return QgsRaster::IdentifyFormatFeature;
479 }
480 
482 {
483  switch ( format )
484  {
486  return IdentifyValue;
488  return IdentifyText;
490  return IdentifyHtml;
492  return IdentifyFeature;
493  default:
494  return NoCapabilities;
495  }
496 }
497 
498 bool QgsRasterDataProvider::userNoDataValuesContains( int bandNo, double value ) const
499 {
500  QgsRasterRangeList rangeList = mUserNoDataValue.value( bandNo - 1 );
501  return QgsRasterRange::contains( value, rangeList );
502 }
503 
505 {
506  mDpi = other.mDpi;
511  mExtent = other.mExtent;
512 }
513 
514 // ENDS
bool hasPyramids()
Returns true if raster has at least one populated histogram.
virtual int bandCount() const =0
Gets number of bands.
virtual double sample(const QgsPointXY &point, int band, bool *ok=nullptr, const QgsRectangle &boundingBox=QgsRectangle(), int width=0, int height=0, int dpi=96)
Samples a raster value from the specified band found at the point position.
void setNoDataValue(double noDataValue)
Sets cell value that will be considered as "no data".
virtual void readBlock(int bandNo, int xBlock, int yBlock, void *data)
Read block of data.
IdentifyFormat
Definition: qgsraster.h:57
A rectangle specified with double values.
Definition: qgsrectangle.h:41
void copyBaseSettings(const QgsRasterDataProvider &other)
Copy member variables from other raster data provider. Useful for implementation of clone() method in...
bool contains(double value) const
Returns true if this range contains the specified value.
virtual void setUseSourceNoDataValue(int bandNo, bool use)
Sets the source nodata value usage.
void setXMaximum(double x)
Set the maximum x value.
Definition: qgsrectangle.h:135
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
virtual double bandOffset(int bandNo) const
Read band offset for raster value.
bool userNoDataValuesContains(int bandNo, double value) const
Returns true if user no data contains value.
double y
Definition: qgspointxy.h:48
void applyNoDataValues(const QgsRasterRangeList &rangeList)
bool setIsNoDataExcept(QRect exceptRect)
Set the whole block to no data except specified rectangle.
A class to represent a 2D point.
Definition: qgspointxy.h:43
int height() const
Returns the height (number of rows) of the raster block.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:265
DataType
Raster data types.
Definition: qgis.h:79
virtual int ySize() const
Capability
If you add to this, please also add to capabilitiesString()
static Capability identifyFormatToCapability(QgsRaster::IdentifyFormat format)
Abstract base class for spatial data provider implementations.
virtual double sourceNoDataValue(int bandNo) const
Value representing no data value.
static QRect subRect(const QgsRectangle &extent, int width, int height, const QgsRectangle &subExtent)
For extent and width, height find rectangle covered by subextent.
static QString identifyFormatName(QgsRaster::IdentifyFormat format)
QgsRasterDataProvider * createFunction_t(const QString &, const QString &, int, Qgis::DataType, int, int, double *, const QgsCoordinateReferenceSystem &, QStringList)
bool setIsNoData(int row, int column)
Set no data on pixel.
virtual QString lastErrorFormat()
Returns the format of the error text for the last error in this provider.
Raster identify results container.
int dpi() const
Returns the dpi of the output device.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
Raster data container.
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
bool isEmpty() const
Returns true if the rectangle is empty.
Definition: qgsrectangle.h:426
virtual QList< QgsRasterPyramid > buildPyramidList(QList< int > overviewList=QList< int >())
Returns the raster layers pyramid list.
static QgsRaster::IdentifyFormat identifyFormatFromName(const QString &formatName)
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
QgsRectangle extent() const override=0
Returns the extent of the layer.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
double width() const
Returns the width of the rectangle.
Definition: qgsrectangle.h:202
void setYMinimum(double y)
Set the minimum y value.
Definition: qgsrectangle.h:140
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
Definition: qgsrectangle.h:312
QList< QgsRasterHistogram > mHistograms
List of cached histograms, all bands mixed.
QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be truncated to the sp...
QgsDataSourceUri uri() const
Gets the data source specification.
QList< bool > mSrcHasNoDataValue
Source no data value exists.
bool isEmpty() const
Returns true if block is empty, i.e.
QgsRasterDataProvider()
Provider capabilities.
#define cast_to_fptr(f)
Definition: qgis.h:158
Base class for processing filters like renderers, reprojector, resampler etc.
virtual bool isEditable() const
Checks whether the provider is in editing mode, i.e.
virtual bool sourceHasNoDataValue(int bandNo) const
Returns true if source band has no data value.
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
Definition: qgis.h:596
double x
Definition: qgspointxy.h:47
virtual QString htmlMetadata()=0
Returns metadata in a format suitable for feeding directly into a subset of the GUI raster properties...
QList< double > mSrcNoDataValue
Source no data value is available and is set to be used or internal no data is available.
int width() const
Returns the width (number of columns) of the raster block.
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:177
static QList< QPair< QString, QString > > pyramidResamplingMethods(const QString &providerKey)
Returns a list of pyramid resampling method name and label pairs for given provider.
double xMaximum() const
Returns the x maximum value (right side of rectangle).
Definition: qgsrectangle.h:162
QList< QPair< QString, QString > > * pyramidResamplingMethods_t()
QgsRasterBlock * block(int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback=nullptr) override
Read block of data using given extent and size.
Setting options for creating vector data providers.
char * bits(int row, int column)
Returns a pointer to block data.
QList< QgsRasterRange > QgsRasterRangeList
void applyScaleOffset(double scale, double offset)
Apply band scale and offset to raster block values.
void setYMaximum(double y)
Set the maximum y value.
Definition: qgsrectangle.h:145
This class represents a coordinate reference system (CRS).
virtual QgsRasterIdentifyResult identify(const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox=QgsRectangle(), int width=0, int height=0, int dpi=96)
Identify raster value(s) found on the point position.
int dataTypeSize(int bandNo)
double xMinimum() const
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:167
virtual QgsRasterRangeList userNoDataValues(int bandNo) const
Returns a list of user no data value ranges.
double yMaximum() const
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:172
virtual bool write(void *data, int band, int width, int height, int xOffset, int yOffset)
Writes into the provider datasource.
virtual bool useSourceNoDataValue(int bandNo) const
Returns the source nodata value usage.
QList< QgsRasterBandStats > mStatistics
List of cached statistics, all bands mixed.
virtual void setUserNoDataValue(int bandNo, const QgsRasterRangeList &noData)
bool writeBlock(QgsRasterBlock *block, int band, int xOffset=0, int yOffset=0)
Writes pixel data from a raster block into the provider data source.
virtual QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const
Returns flags containing the supported capabilities of the data provider.
Feedback object tailored for raster block reading.
static QString identifyFormatLabel(QgsRaster::IdentifyFormat format)
virtual int xSize() const
Gets raster size.
#define ERR(message)
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
void setXMinimum(double x)
Set the minimum x value.
Definition: qgsrectangle.h:130
double height() const
Returns the height of the rectangle.
Definition: qgsrectangle.h:209
Base class for raster data providers.
static QgsRasterDataProvider * create(const QString &providerKey, const QString &uri, const QString &format, int nBands, Qgis::DataType type, int width, int height, double *geoTransform, const QgsCoordinateReferenceSystem &crs, const QStringList &createOptions=QStringList())
Creates a new dataset with mDataSourceURI.
QList< QgsRasterRangeList > mUserNoDataValue
List of lists of user defined additional no data values for each band, indexed from 0...
QList< bool > mUseSrcNoDataValue
Use source nodata value.
virtual double bandScale(int bandNo) const
Read band scale for raster value.