QGIS API Documentation  3.2.0-Bonn (bc43194)
qgsrasterdataprovider.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrasterdataprovider.h - 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  async legend fetcher : Sandro Santilli < strk at keybit dot net >
9 
10  ***************************************************************************/
11 
12 /***************************************************************************
13  * *
14  * This program is free software; you can redistribute it and/or modify *
15  * it under the terms of the GNU General Public License as published by *
16  * the Free Software Foundation; either version 2 of the License, or *
17  * (at your option) any later version. *
18  * *
19  ***************************************************************************/
20 
21 /* Thank you to Marco Hugentobler for the original vector DataProvider */
22 
23 #ifndef QGSRASTERDATAPROVIDER_H
24 #define QGSRASTERDATAPROVIDER_H
25 
26 #include "qgis_core.h"
27 #include "qgis_sip.h"
28 #include <cmath>
29 
30 #include <QDateTime>
31 #include <QVariant>
32 #include <QImage>
33 
34 #include "qgscolorrampshader.h"
35 #include "qgsdataprovider.h"
36 #include "qgsfields.h"
37 #include "qgsraster.h"
38 #include "qgsrasterinterface.h"
39 #include "qgsrasterpyramid.h"
40 #include "qgsrasterrange.h"
41 #include "qgsrectangle.h"
42 #include "qgsrasteriterator.h"
43 
44 class QImage;
45 class QByteArray;
46 
47 class QgsPointXY;
49 class QgsMapSettings;
50 
56 class CORE_EXPORT QgsImageFetcher : public QObject
57 {
58  Q_OBJECT
59  public:
61  QgsImageFetcher( QObject *parent = nullptr ) : QObject( parent ) {}
62 
66  virtual void start() = 0;
67 
68  signals:
69 
73  void finish( const QImage &legend );
75  void progress( qint64 received, qint64 total );
77  void error( const QString &msg );
78 };
79 
80 
85 class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider, public QgsRasterInterface
86 {
87  Q_OBJECT
88 
89  public:
90 
96  {
97  NoProviderCapabilities = 0,
98  ReadLayerMetadata = 1 << 1,
99  WriteLayerMetadata = 1 << 2,
100  };
101 
103  Q_DECLARE_FLAGS( ProviderCapabilities, ProviderCapability )
104 
106 
116 
117  QgsRasterInterface *clone() const override = 0;
118 
123  virtual QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const;
124 
125  /* It makes no sense to set input on provider */
126  bool setInput( QgsRasterInterface *input ) override { Q_UNUSED( input ); return false; }
127 
128  QgsRectangle extent() const override = 0;
129 
131  Qgis::DataType dataType( int bandNo ) const override = 0;
132 
137  Qgis::DataType sourceDataType( int bandNo ) const override = 0;
138 
140  virtual int colorInterpretation( int bandNo ) const
141  {
142  Q_UNUSED( bandNo );
144  }
145 
146  QString colorName( int colorInterpretation ) const
147  {
148  // Modified copy from GDAL
149  switch ( colorInterpretation )
150  {
152  return QStringLiteral( "Undefined" );
153 
155  return QStringLiteral( "Gray" );
156 
158  return QStringLiteral( "Palette" );
159 
160  case QgsRaster::RedBand:
161  return QStringLiteral( "Red" );
162 
164  return QStringLiteral( "Green" );
165 
166  case QgsRaster::BlueBand:
167  return QStringLiteral( "Blue" );
168 
170  return QStringLiteral( "Alpha" );
171 
172  case QgsRaster::HueBand:
173  return QStringLiteral( "Hue" );
174 
176  return QStringLiteral( "Saturation" );
177 
179  return QStringLiteral( "Lightness" );
180 
181  case QgsRaster::CyanBand:
182  return QStringLiteral( "Cyan" );
183 
185  return QStringLiteral( "Magenta" );
186 
188  return QStringLiteral( "Yellow" );
189 
191  return QStringLiteral( "Black" );
192 
194  return QStringLiteral( "YCbCr_Y" );
195 
197  return QStringLiteral( "YCbCr_Cb" );
198 
200  return QStringLiteral( "YCbCr_Cr" );
201 
202  default:
203  return QStringLiteral( "Unknown" );
204  }
205  }
207  virtual bool reload() { return true; }
208 
209  virtual QString colorInterpretationName( int bandNo ) const
210  {
211  return colorName( colorInterpretation( bandNo ) );
212  }
213 
218  virtual double bandScale( int bandNo ) const { Q_UNUSED( bandNo ); return 1.0; }
219 
224  virtual double bandOffset( int bandNo ) const { Q_UNUSED( bandNo ); return 0.0; }
225 
226  // TODO: remove or make protected all readBlock working with void*
227 
229  QgsRasterBlock *block( int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) override;
230 
232  virtual bool sourceHasNoDataValue( int bandNo ) const { return mSrcHasNoDataValue.value( bandNo - 1 ); }
233 
235  virtual bool useSourceNoDataValue( int bandNo ) const { return mUseSrcNoDataValue.value( bandNo - 1 ); }
236 
238  virtual void setUseSourceNoDataValue( int bandNo, bool use );
239 
241  virtual double sourceNoDataValue( int bandNo ) const { return mSrcNoDataValue.value( bandNo - 1 ); }
242 
243  virtual void setUserNoDataValue( int bandNo, const QgsRasterRangeList &noData );
244 
246  virtual QgsRasterRangeList userNoDataValues( int bandNo ) const { return mUserNoDataValue.value( bandNo - 1 ); }
247 
248  virtual QList<QgsColorRampShader::ColorRampItem> colorTable( int bandNo ) const
249  { Q_UNUSED( bandNo ); return QList<QgsColorRampShader::ColorRampItem>(); }
250 
254  QStringList subLayers() const override
255  {
256  return QStringList();
257  }
258 
260  virtual bool supportsLegendGraphic() const { return false; }
261 
273  virtual QImage getLegendGraphic( double scale = 0, bool forceRefresh = false, const QgsRectangle *visibleExtent = nullptr ) SIP_SKIP
274  {
275  Q_UNUSED( scale );
276  Q_UNUSED( forceRefresh );
277  Q_UNUSED( visibleExtent );
278  return QImage();
279  }
280 
295  {
296  Q_UNUSED( mapSettings );
297  return nullptr;
298  }
299 
301  virtual QString buildPyramids( const QList<QgsRasterPyramid> &pyramidList,
302  const QString &resamplingMethod = "NEAREST",
304  const QStringList &configOptions = QStringList(),
305  QgsRasterBlockFeedback *feedback = nullptr )
306  {
307  Q_UNUSED( pyramidList );
308  Q_UNUSED( resamplingMethod );
309  Q_UNUSED( format );
310  Q_UNUSED( configOptions );
311  Q_UNUSED( feedback );
312  return QStringLiteral( "FAILED_NOT_SUPPORTED" );
313  }
314 
323  virtual QList<QgsRasterPyramid> buildPyramidList( QList<int> overviewList = QList<int>() ) // clazy:exclude=function-args-by-ref
324  { Q_UNUSED( overviewList ); return QList<QgsRasterPyramid>(); }
325 
327  bool hasPyramids();
328 
333  virtual QString htmlMetadata() = 0;
334 
359  //virtual QMap<int, QVariant> identify( const QgsPointXY & point, QgsRaster::IdentifyFormat format, const QgsRectangle &extent = QgsRectangle(), int width = 0, int height = 0 );
360  virtual QgsRasterIdentifyResult identify( const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
361 
370  virtual QString lastErrorTitle() = 0;
371 
381  virtual QString lastError() = 0;
382 
384  virtual QString lastErrorFormat();
385 
387  int dpi() const { return mDpi; }
388 
390  void setDpi( int dpi ) { mDpi = dpi; }
391 
393  QDateTime timestamp() const override { return mTimestamp; }
394 
396  QDateTime dataTimestamp() const override { return QDateTime(); }
397 
404  virtual bool isEditable() const { return false; }
405 
416  virtual bool setEditable( bool enabled ) { Q_UNUSED( enabled ); return false; }
417 
419  // TODO: add data type (may be different from band type)
420  virtual bool write( void *data, int band, int width, int height, int xOffset, int yOffset )
421  {
422  Q_UNUSED( data );
423  Q_UNUSED( band );
424  Q_UNUSED( width );
425  Q_UNUSED( height );
426  Q_UNUSED( xOffset );
427  Q_UNUSED( yOffset );
428  return false;
429  }
430 
447  bool writeBlock( QgsRasterBlock *block, int band, int xOffset = 0, int yOffset = 0 );
448 
450  static QgsRasterDataProvider *create( const QString &providerKey,
451  const QString &uri,
452  const QString &format, int nBands,
453  Qgis::DataType type,
454  int width, int height, double *geoTransform,
455  const QgsCoordinateReferenceSystem &crs,
456  const QStringList &createOptions = QStringList() );
457 
463  virtual bool setNoDataValue( int bandNo, double noDataValue ) { Q_UNUSED( bandNo ); Q_UNUSED( noDataValue ); return false; }
464 
466  virtual bool remove() { return false; }
467 
472  static QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
473 
479  virtual QString validateCreationOptions( const QStringList &createOptions, const QString &format )
480  { Q_UNUSED( createOptions ); Q_UNUSED( format ); return QString(); }
481 
487  const QStringList &configOptions, const QString &fileFormat )
488  { Q_UNUSED( pyramidsFormat ); Q_UNUSED( configOptions ); Q_UNUSED( fileFormat ); return QString(); }
489 
490  static QString identifyFormatName( QgsRaster::IdentifyFormat format );
491  static QgsRaster::IdentifyFormat identifyFormatFromName( const QString &formatName );
492  static QString identifyFormatLabel( QgsRaster::IdentifyFormat format );
493  static Capability identifyFormatToCapability( QgsRaster::IdentifyFormat format );
494 
501 
508 
509  signals:
510 
515  void statusChanged( const QString & ) const;
516 
517  protected:
518 
523  virtual void readBlock( int bandNo, int xBlock, int yBlock, void *data ) SIP_SKIP
524  { Q_UNUSED( bandNo ); Q_UNUSED( xBlock ); Q_UNUSED( yBlock ); Q_UNUSED( data ); }
525 
530  virtual void readBlock( int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback = nullptr ) SIP_SKIP
531  { Q_UNUSED( bandNo ); Q_UNUSED( viewExtent ); Q_UNUSED( width ); Q_UNUSED( height ); Q_UNUSED( data ); Q_UNUSED( feedback ); }
532 
534  bool userNoDataValuesContains( int bandNo, double value ) const;
535 
537  void copyBaseSettings( const QgsRasterDataProvider &other );
538 
542  int mDpi = -1;
543 
547  //bool hasNoDataValue ( int bandNo );
548 
550  QList<double> mSrcNoDataValue;
551 
553  QList<bool> mSrcHasNoDataValue;
554 
559  QList<bool> mUseSrcNoDataValue;
560 
564  QList< QgsRasterRangeList > mUserNoDataValue;
565 
567 
568 };
569 
570 Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRasterDataProvider::ProviderCapabilities )
571 
572 // clazy:excludeall=qstring-allocations
573 
574 #endif
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:40
bool setInput(QgsRasterInterface *input) override
Set input.
Black band of CMLY image.
Definition: qgsraster.h:50
Handles asynchronous download of images.
virtual QList< QgsColorRampShader::ColorRampItem > colorTable(int bandNo) const
virtual double bandOffset(int bandNo) const
Read band offset for raster value.
A class to represent a 2D point.
Definition: qgspointxy.h:43
QDateTime mTimestamp
Timestamp of data in the moment when the data were loaded by provider.
DataType
Raster data types.
Definition: qgis.h:91
virtual QgsImageFetcher * getLegendGraphicFetcher(const QgsMapSettings *mapSettings)
Returns a new image downloader for the raster legend.
Red band of RGBA image.
Definition: qgsraster.h:40
Capability
If you add to this, please also add to capabilitiesString()
virtual QImage getLegendGraphic(double scale=0, bool forceRefresh=false, const QgsRectangle *visibleExtent=nullptr)
Returns the legend rendered as pixmap.
virtual bool supportsLegendGraphic() const
Returns whether the provider supplies a legend graphic.
virtual bool setNoDataValue(int bandNo, double noDataValue)
Set no data value on created dataset.
Abstract base class for spatial data provider implementations.
virtual Qgis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
virtual QString buildPyramids(const QList< QgsRasterPyramid > &pyramidList, const QString &resamplingMethod="NEAREST", QgsRaster::RasterPyramidsFormat format=QgsRaster::PyramidsGTiff, const QStringList &configOptions=QStringList(), QgsRasterBlockFeedback *feedback=nullptr)
Create pyramid overviews.
Hue band of HLS image.
Definition: qgsraster.h:44
virtual double sourceNoDataValue(int bandNo) const
Value representing no data value.
virtual QString validatePyramidsConfigOptions(QgsRaster::RasterPyramidsFormat pyramidsFormat, const QStringList &configOptions, const QString &fileFormat)
Validates pyramid creation options for a specific dataset and destination format. ...
The QgsMapSettings class contains configuration for rendering of the map.
QDateTime timestamp() const override
Time stamp of data source in the moment when data/metadata were loaded by provider.
Raster identify results container.
ProviderCapability
Enumeration with capabilities that raster providers might implement.
Lightness band of HLS image.
Definition: qgsraster.h:46
int dpi() const
Returns the dpi of the output device.
virtual bool setEditable(bool enabled)
Turns on/off editing mode of the provider.
Paletted (see associated color table)
Definition: qgsraster.h:39
Alpha (0=transparent, 255=opaque)
Definition: qgsraster.h:43
Raster data container.
Green band of RGBA image.
Definition: qgsraster.h:41
virtual QList< QgsRasterPyramid > buildPyramidList(QList< int > overviewList=QList< int >())
Returns the raster layers pyramid list.
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.
#define SIP_SKIP
Definition: qgis_sip.h:119
Y Luminance.
Definition: qgsraster.h:51
static const int DEFAULT_MAXIMUM_TILE_HEIGHT
Default maximum tile height.
virtual bool reload()
Reload data (data could change)
QList< bool > mSrcHasNoDataValue
Source no data value exists.
virtual QString colorInterpretationName(int bandNo) const
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...
#define SIP_FACTORY
Definition: qgis_sip.h:69
virtual void readBlock(int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback=nullptr)
Read block of data using give extent and size.
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.
Saturation band of HLS image.
Definition: qgsraster.h:45
QList< double > mSrcNoDataValue
Source no data value is available and is set to be used or internal no data is available.
virtual int stepHeight() const
Step height for raster iterations.
Blue band of RGBA image.
Definition: qgsraster.h:42
Setting options for creating vector data providers.
QString colorName(int colorInterpretation) const
QList< QgsRasterRange > QgsRasterRangeList
virtual QgsRasterInterface * clone() const =0
Clone itself, create deep copy.
This class represents a coordinate reference system (CRS).
Greyscale.
Definition: qgsraster.h:38
QStringList subLayers() const override
Returns the sublayers of this layer - useful for providers that manage their own layers, such as WMS.
virtual QgsRasterRangeList userNoDataValues(int bandNo) const
Returns a list of user no data value ranges.
virtual int stepWidth() const
Step width for raster iterations.
Magenta band of CMYK image.
Definition: qgsraster.h:48
virtual QString validateCreationOptions(const QStringList &createOptions, const QString &format)
Validates creation options for a specific dataset and destination format.
virtual QgsRectangle extent() const =0
Returns the extent of the layer.
virtual bool write(void *data, int band, int width, int height, int xOffset, int yOffset)
Writes into the provider datasource.
QDateTime dataTimestamp() const override
Current time stamp of data source.
virtual bool useSourceNoDataValue(int bandNo) const
Returns the source nodata value usage.
RasterPyramidsFormat
Definition: qgsraster.h:81
Feedback object tailored for raster block reading.
static const int DEFAULT_MAXIMUM_TILE_WIDTH
Default maximum tile width.
void setDpi(int dpi)
Sets the output device resolution.
QgsImageFetcher(QObject *parent=nullptr)
Constructor.
Cyan band of CMYK image.
Definition: qgsraster.h:47
virtual int colorInterpretation(int bandNo) const
Returns data type for the band specified by number.
Base class for raster data providers.
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.
Yellow band of CMYK image.
Definition: qgsraster.h:49
virtual double bandScale(int bandNo) const
Read band scale for raster value.