QGIS API Documentation  3.13.0-Master (b73bd58cfb)
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 "qgsraster.h"
37 #include "qgsfields.h"
38 #include "qgsrasterinterface.h"
39 #include "qgsrasterpyramid.h"
40 #include "qgsrasterrange.h"
41 #include "qgsrectangle.h"
42 #include "qgsrasteriterator.h"
44 
45 class QImage;
46 class QByteArray;
47 
48 class QgsPointXY;
50 class QgsMapSettings;
51 
57 class CORE_EXPORT QgsImageFetcher : public QObject
58 {
59  Q_OBJECT
60  public:
62  QgsImageFetcher( QObject *parent = nullptr ) : QObject( parent ) {}
63 
68  virtual void start() = 0;
69 
70  signals:
71 
76  void finish( const QImage &legend );
78  void progress( qint64 received, qint64 total );
80  void error( const QString &msg );
81 };
82 
83 
88 class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider, public QgsRasterInterface
89 {
90  Q_OBJECT
91 
92  public:
93 
99  {
100  NoProviderCapabilities = 0,
101  ReadLayerMetadata = 1 << 1,
102  WriteLayerMetadata = 1 << 2,
103  ProviderHintBenefitsFromResampling = 1 << 3
104  };
105 
107  Q_DECLARE_FLAGS( ProviderCapabilities, ProviderCapability )
108 
110 
119  QgsRasterDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions = QgsDataProvider::ProviderOptions() );
120 
121  QgsRasterInterface *clone() const override = 0;
122 
127  virtual QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const;
128 
129  /* It makes no sense to set input on provider */
130  bool setInput( QgsRasterInterface *input ) override { Q_UNUSED( input ) return false; }
131 
132  QgsRectangle extent() const override = 0;
133 
135  Qgis::DataType dataType( int bandNo ) const override = 0;
136 
142  virtual QgsFields fields() const { return QgsFields(); };
143 
148  Qgis::DataType sourceDataType( int bandNo ) const override = 0;
149 
151  virtual int colorInterpretation( int bandNo ) const
152  {
153  Q_UNUSED( bandNo )
155  }
156 
157  QString colorName( int colorInterpretation ) const
158  {
159  // Modified copy from GDAL
160  switch ( colorInterpretation )
161  {
163  return QStringLiteral( "Undefined" );
164 
166  return QStringLiteral( "Gray" );
167 
169  return QStringLiteral( "Palette" );
170 
171  case QgsRaster::RedBand:
172  return QStringLiteral( "Red" );
173 
175  return QStringLiteral( "Green" );
176 
177  case QgsRaster::BlueBand:
178  return QStringLiteral( "Blue" );
179 
181  return QStringLiteral( "Alpha" );
182 
183  case QgsRaster::HueBand:
184  return QStringLiteral( "Hue" );
185 
187  return QStringLiteral( "Saturation" );
188 
190  return QStringLiteral( "Lightness" );
191 
192  case QgsRaster::CyanBand:
193  return QStringLiteral( "Cyan" );
194 
196  return QStringLiteral( "Magenta" );
197 
199  return QStringLiteral( "Yellow" );
200 
202  return QStringLiteral( "Black" );
203 
205  return QStringLiteral( "YCbCr_Y" );
206 
208  return QStringLiteral( "YCbCr_Cb" );
209 
211  return QStringLiteral( "YCbCr_Cr" );
212 
213  default:
214  return QStringLiteral( "Unknown" );
215  }
216  }
218  virtual bool reload() { return true; }
219 
220  virtual QString colorInterpretationName( int bandNo ) const
221  {
222  return colorName( colorInterpretation( bandNo ) );
223  }
224 
229  virtual double bandScale( int bandNo ) const { Q_UNUSED( bandNo ) return 1.0; }
230 
235  virtual double bandOffset( int bandNo ) const { Q_UNUSED( bandNo ) return 0.0; }
236 
237  // TODO: remove or make protected all readBlock working with void*
238 
240  QgsRasterBlock *block( int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) override SIP_FACTORY;
241 
243  virtual bool sourceHasNoDataValue( int bandNo ) const { return mSrcHasNoDataValue.value( bandNo - 1 ); }
244 
246  virtual bool useSourceNoDataValue( int bandNo ) const { return mUseSrcNoDataValue.value( bandNo - 1 ); }
247 
249  virtual void setUseSourceNoDataValue( int bandNo, bool use );
250 
252  virtual double sourceNoDataValue( int bandNo ) const { return mSrcNoDataValue.value( bandNo - 1 ); }
253 
254  virtual void setUserNoDataValue( int bandNo, const QgsRasterRangeList &noData );
255 
257  virtual QgsRasterRangeList userNoDataValues( int bandNo ) const { return mUserNoDataValue.value( bandNo - 1 ); }
258 
259  virtual QList<QgsColorRampShader::ColorRampItem> colorTable( int bandNo ) const
260  { Q_UNUSED( bandNo ) return QList<QgsColorRampShader::ColorRampItem>(); }
261 
266  QStringList subLayers() const override
267  {
268  return QStringList();
269  }
270 
273 
275  virtual bool supportsLegendGraphic() const { return false; }
276 
288  virtual QImage getLegendGraphic( double scale = 0, bool forceRefresh = false, const QgsRectangle *visibleExtent = nullptr ) SIP_SKIP
289  {
290  Q_UNUSED( scale )
291  Q_UNUSED( forceRefresh )
292  Q_UNUSED( visibleExtent )
293  return QImage();
294  }
295 
309  virtual QgsImageFetcher *getLegendGraphicFetcher( const QgsMapSettings *mapSettings ) SIP_FACTORY
310  {
311  Q_UNUSED( mapSettings )
312  return nullptr;
313  }
314 
316  virtual QString buildPyramids( const QList<QgsRasterPyramid> &pyramidList,
317  const QString &resamplingMethod = "NEAREST",
319  const QStringList &configOptions = QStringList(),
320  QgsRasterBlockFeedback *feedback = nullptr )
321  {
322  Q_UNUSED( pyramidList )
323  Q_UNUSED( resamplingMethod )
324  Q_UNUSED( format )
325  Q_UNUSED( configOptions )
326  Q_UNUSED( feedback )
327  return QStringLiteral( "FAILED_NOT_SUPPORTED" );
328  }
329 
338  virtual QList<QgsRasterPyramid> buildPyramidList( QList<int> overviewList = QList<int>() ) // clazy:exclude=function-args-by-ref
339  { Q_UNUSED( overviewList ) return QList<QgsRasterPyramid>(); }
340 
342  bool hasPyramids();
343 
348  virtual QString htmlMetadata() = 0;
349 
375  virtual QgsRasterIdentifyResult identify( const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
376 
391  virtual double sample( const QgsPointXY &point, int band,
392  bool *ok SIP_OUT = nullptr,
393  const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
394 
403  virtual QString lastErrorTitle() = 0;
404 
414  virtual QString lastError() = 0;
415 
417  virtual QString lastErrorFormat();
418 
420  int dpi() const { return mDpi; }
421 
423  void setDpi( int dpi ) { mDpi = dpi; }
424 
426  QDateTime timestamp() const override { return mTimestamp; }
427 
429  QDateTime dataTimestamp() const override { return QDateTime(); }
430 
437  virtual bool isEditable() const { return false; }
438 
449  virtual bool setEditable( bool enabled ) { Q_UNUSED( enabled ) return false; }
450 
452  // TODO: add data type (may be different from band type)
453  virtual bool write( void *data, int band, int width, int height, int xOffset, int yOffset )
454  {
455  Q_UNUSED( data )
456  Q_UNUSED( band )
457  Q_UNUSED( width )
458  Q_UNUSED( height )
459  Q_UNUSED( xOffset )
460  Q_UNUSED( yOffset )
461  return false;
462  }
463 
480  bool writeBlock( QgsRasterBlock *block, int band, int xOffset = 0, int yOffset = 0 );
481 
483  static QgsRasterDataProvider *create( const QString &providerKey,
484  const QString &uri,
485  const QString &format, int nBands,
486  Qgis::DataType type,
487  int width, int height, double *geoTransform,
489  const QStringList &createOptions = QStringList() );
490 
496  virtual bool setNoDataValue( int bandNo, double noDataValue ) { Q_UNUSED( bandNo ) Q_UNUSED( noDataValue ); return false; }
497 
499  virtual bool remove() { return false; }
500 
505  static QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
506 
512  virtual QString validateCreationOptions( const QStringList &createOptions, const QString &format )
513  { Q_UNUSED( createOptions ) Q_UNUSED( format ); return QString(); }
514 
520  const QStringList &configOptions, const QString &fileFormat )
521  { Q_UNUSED( pyramidsFormat ) Q_UNUSED( configOptions ); Q_UNUSED( fileFormat ); return QString(); }
522 
523  static QString identifyFormatName( QgsRaster::IdentifyFormat format );
524  static QgsRaster::IdentifyFormat identifyFormatFromName( const QString &formatName );
525  static QString identifyFormatLabel( QgsRaster::IdentifyFormat format );
526  static Capability identifyFormatToCapability( QgsRaster::IdentifyFormat format );
527 
534 
541 
550  virtual QList< double > nativeResolutions() const;
551 
558  virtual bool ignoreExtents() const;
559 
560  signals:
561 
566  void statusChanged( const QString & ) const;
567 
568  protected:
569 
575  virtual bool readBlock( int bandNo, int xBlock, int yBlock, void *data ) SIP_SKIP
576  { Q_UNUSED( bandNo ) Q_UNUSED( xBlock ); Q_UNUSED( yBlock ); Q_UNUSED( data ); return false; }
577 
583  virtual bool readBlock( int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback = nullptr ) SIP_SKIP
584  { Q_UNUSED( bandNo ) Q_UNUSED( viewExtent ); Q_UNUSED( width ); Q_UNUSED( height ); Q_UNUSED( data ); Q_UNUSED( feedback ); return false; }
585 
587  bool userNoDataValuesContains( int bandNo, double value ) const;
588 
590  void copyBaseSettings( const QgsRasterDataProvider &other );
591 
596  int mDpi = -1;
597 
602  //bool hasNoDataValue ( int bandNo );
603 
605  QList<double> mSrcNoDataValue;
606 
608  QList<bool> mSrcHasNoDataValue;
609 
615  QList<bool> mUseSrcNoDataValue;
616 
621  QList< QgsRasterRangeList > mUserNoDataValue;
622 
624 
625  private:
626 
630  std::unique_ptr< QgsRasterDataProviderTemporalCapabilities > mTemporalCapabilities;
631 
632 };
633 
634 Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRasterDataProvider::ProviderCapabilities )
635 
636 // clazy:excludeall=qstring-allocations
637 
638 #endif
IdentifyFormat
Definition: qgsraster.h:57
A rectangle specified with double values.
Definition: qgsrectangle.h:41
bool setInput(QgsRasterInterface *input) override
Set input.
Black band of CMLY image.
Definition: qgsraster.h:50
virtual bool readBlock(int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback=nullptr)
Reads a block of raster data into data, using the given extent and size.
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.
virtual QgsFields fields() const
Returns the fields of the raster layer for data providers that expose them, the default implementatio...
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:101
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.
Container of fields for a vector layer.
Definition: qgsfields.h:42
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.
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 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:126
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:76
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 bool readBlock(int bandNo, int xBlock, int yBlock, void *data)
Reads a block of raster data into data.
Implementation of data provider temporal properties for QgsRasterDataProviders.
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.
virtual QgsDataProviderTemporalCapabilities * temporalCapabilities()
Returns the provider&#39;s temporal capabilities.
QString colorName(int colorInterpretation) const
QList< QgsRasterRange > QgsRasterRangeList
virtual QgsRasterInterface * clone() const =0
Clone itself, create deep copy.
#define SIP_OUT
Definition: qgis_sip.h:58
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.