QGIS API Documentation  3.4.15-Madeira (e83d02e274)
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 
115  QgsRasterDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options = QgsDataProvider::ProviderOptions() );
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 SIP_FACTORY;
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 
294  virtual QgsImageFetcher *getLegendGraphicFetcher( const QgsMapSettings *mapSettings ) SIP_FACTORY
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 
360  virtual QgsRasterIdentifyResult identify( const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
361 
376  virtual double sample( const QgsPointXY &point, int band,
377  bool *ok SIP_OUT = nullptr,
378  const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
379 
388  virtual QString lastErrorTitle() = 0;
389 
399  virtual QString lastError() = 0;
400 
402  virtual QString lastErrorFormat();
403 
405  int dpi() const { return mDpi; }
406 
408  void setDpi( int dpi ) { mDpi = dpi; }
409 
411  QDateTime timestamp() const override { return mTimestamp; }
412 
414  QDateTime dataTimestamp() const override { return QDateTime(); }
415 
422  virtual bool isEditable() const { return false; }
423 
434  virtual bool setEditable( bool enabled ) { Q_UNUSED( enabled ); return false; }
435 
437  // TODO: add data type (may be different from band type)
438  virtual bool write( void *data, int band, int width, int height, int xOffset, int yOffset )
439  {
440  Q_UNUSED( data );
441  Q_UNUSED( band );
442  Q_UNUSED( width );
443  Q_UNUSED( height );
444  Q_UNUSED( xOffset );
445  Q_UNUSED( yOffset );
446  return false;
447  }
448 
465  bool writeBlock( QgsRasterBlock *block, int band, int xOffset = 0, int yOffset = 0 );
466 
468  static QgsRasterDataProvider *create( const QString &providerKey,
469  const QString &uri,
470  const QString &format, int nBands,
471  Qgis::DataType type,
472  int width, int height, double *geoTransform,
474  const QStringList &createOptions = QStringList() );
475 
481  virtual bool setNoDataValue( int bandNo, double noDataValue ) { Q_UNUSED( bandNo ); Q_UNUSED( noDataValue ); return false; }
482 
484  virtual bool remove() { return false; }
485 
490  static QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
491 
497  virtual QString validateCreationOptions( const QStringList &createOptions, const QString &format )
498  { Q_UNUSED( createOptions ); Q_UNUSED( format ); return QString(); }
499 
505  const QStringList &configOptions, const QString &fileFormat )
506  { Q_UNUSED( pyramidsFormat ); Q_UNUSED( configOptions ); Q_UNUSED( fileFormat ); return QString(); }
507 
508  static QString identifyFormatName( QgsRaster::IdentifyFormat format );
509  static QgsRaster::IdentifyFormat identifyFormatFromName( const QString &formatName );
510  static QString identifyFormatLabel( QgsRaster::IdentifyFormat format );
511  static Capability identifyFormatToCapability( QgsRaster::IdentifyFormat format );
512 
519 
526 
527  signals:
528 
533  void statusChanged( const QString & ) const;
534 
535  protected:
536 
541  virtual bool readBlock( int bandNo, int xBlock, int yBlock, void *data ) SIP_SKIP
542  { Q_UNUSED( bandNo ) Q_UNUSED( xBlock ); Q_UNUSED( yBlock ); Q_UNUSED( data ); return false; }
543 
548  virtual bool readBlock( int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback = nullptr ) SIP_SKIP
549  { Q_UNUSED( bandNo ) Q_UNUSED( viewExtent ); Q_UNUSED( width ); Q_UNUSED( height ); Q_UNUSED( data ); Q_UNUSED( feedback ); return false; }
550 
552  bool userNoDataValuesContains( int bandNo, double value ) const;
553 
555  void copyBaseSettings( const QgsRasterDataProvider &other );
556 
560  int mDpi = -1;
561 
565  //bool hasNoDataValue ( int bandNo );
566 
568  QList<double> mSrcNoDataValue;
569 
571  QList<bool> mSrcHasNoDataValue;
572 
577  QList<bool> mUseSrcNoDataValue;
578 
582  QList< QgsRasterRangeList > mUserNoDataValue;
583 
585 
586 };
587 
588 Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRasterDataProvider::ProviderCapabilities )
589 
590 // clazy:excludeall=qstring-allocations
591 
592 #endif
virtual bool supportsLegendGraphic() const
Returns whether the provider supplies a legend graphic.
IdentifyFormat
Definition: qgsraster.h:57
A rectangle specified with double values.
Definition: qgsrectangle.h:40
Black band of CMLY image.
Definition: qgsraster.h:50
virtual bool useSourceNoDataValue(int bandNo) const
Returns the source nodata value usage.
virtual bool readBlock(int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback=nullptr)
Read block of data using give extent and size.
Handles asynchronous download of images.
virtual QString colorInterpretationName(int bandNo) const
A class to represent a 2D point.
Definition: qgspointxy.h:43
virtual double bandOffset(int bandNo) const
Read band offset for raster value.
virtual int colorInterpretation(int bandNo) const
Returns data type for the band specified by number.
QDateTime mTimestamp
Timestamp of data in the moment when the data were loaded by provider.
DataType
Raster data types.
Definition: qgis.h:92
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 QgsRasterRangeList userNoDataValues(int bandNo) const
Returns a list of user no data value ranges.
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.
const QgsCoordinateReferenceSystem & crs
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 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.
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 stepWidth() const
Step width for raster iterations.
QDateTime timestamp() const override
Time stamp of data source in the moment when data/metadata were loaded by provider.
Raster identify results container.
virtual bool sourceHasNoDataValue(int bandNo) const
Returns true if source band has no data value.
ProviderCapability
Enumeration with capabilities that raster providers might implement.
Lightness band of HLS image.
Definition: qgsraster.h:46
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.
#define SIP_FACTORY
Definition: qgis_sip.h:69
Base class for processing filters like renderers, reprojector, resampler etc.
virtual double sourceNoDataValue(int bandNo) const
Value representing 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.
virtual bool readBlock(int bandNo, int xBlock, int yBlock, void *data)
Read block of data.
virtual double bandScale(int bandNo) const
Read band scale for raster value.
Blue band of RGBA image.
Definition: qgsraster.h:42
QString colorName(int colorInterpretation) const
Setting options for creating vector data providers.
QList< QgsRasterRange > QgsRasterRangeList
virtual bool isEditable() const
Checks whether the provider is in editing mode, i.e.
#define SIP_OUT
Definition: qgis_sip.h:51
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.
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.
int dpi() const
Returns the dpi of the output device.
virtual QList< QgsColorRampShader::ColorRampItem > colorTable(int bandNo) const
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
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