QGIS API Documentation  3.15.0-Master (c0197371fe)
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  ProviderHintCanPerformProviderResampling = 1 << 4
105  };
106 
108  Q_DECLARE_FLAGS( ProviderCapabilities, ProviderCapability )
109 
111 
120  QgsRasterDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions = QgsDataProvider::ProviderOptions() );
121 
122  QgsRasterInterface *clone() const override = 0;
123 
128  virtual QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const;
129 
130  /* It makes no sense to set input on provider */
131  bool setInput( QgsRasterInterface *input ) override { Q_UNUSED( input ) return false; }
132 
133  QgsRectangle extent() const override = 0;
134 
136  Qgis::DataType dataType( int bandNo ) const override = 0;
137 
143  virtual QgsFields fields() const { return QgsFields(); };
144 
149  Qgis::DataType sourceDataType( int bandNo ) const override = 0;
150 
152  virtual int colorInterpretation( int bandNo ) const
153  {
154  Q_UNUSED( bandNo )
156  }
157 
158  QString colorName( int colorInterpretation ) const
159  {
160  // Modified copy from GDAL
161  switch ( colorInterpretation )
162  {
164  return QStringLiteral( "Undefined" );
165 
167  return QStringLiteral( "Gray" );
168 
170  return QStringLiteral( "Palette" );
171 
172  case QgsRaster::RedBand:
173  return QStringLiteral( "Red" );
174 
176  return QStringLiteral( "Green" );
177 
178  case QgsRaster::BlueBand:
179  return QStringLiteral( "Blue" );
180 
182  return QStringLiteral( "Alpha" );
183 
184  case QgsRaster::HueBand:
185  return QStringLiteral( "Hue" );
186 
188  return QStringLiteral( "Saturation" );
189 
191  return QStringLiteral( "Lightness" );
192 
193  case QgsRaster::CyanBand:
194  return QStringLiteral( "Cyan" );
195 
197  return QStringLiteral( "Magenta" );
198 
200  return QStringLiteral( "Yellow" );
201 
203  return QStringLiteral( "Black" );
204 
206  return QStringLiteral( "YCbCr_Y" );
207 
209  return QStringLiteral( "YCbCr_Cb" );
210 
212  return QStringLiteral( "YCbCr_Cr" );
213 
214  default:
215  return QStringLiteral( "Unknown" );
216  }
217  }
219  virtual bool reload() { return true; }
220 
221  virtual QString colorInterpretationName( int bandNo ) const
222  {
223  return colorName( colorInterpretation( bandNo ) );
224  }
225 
230  virtual double bandScale( int bandNo ) const { Q_UNUSED( bandNo ) return 1.0; }
231 
236  virtual double bandOffset( int bandNo ) const { Q_UNUSED( bandNo ) return 0.0; }
237 
238  // TODO: remove or make protected all readBlock working with void*
239 
241  QgsRasterBlock *block( int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) override SIP_FACTORY;
242 
244  virtual bool sourceHasNoDataValue( int bandNo ) const { return mSrcHasNoDataValue.value( bandNo - 1 ); }
245 
247  virtual bool useSourceNoDataValue( int bandNo ) const { return mUseSrcNoDataValue.value( bandNo - 1 ); }
248 
250  virtual void setUseSourceNoDataValue( int bandNo, bool use );
251 
253  virtual double sourceNoDataValue( int bandNo ) const { return mSrcNoDataValue.value( bandNo - 1 ); }
254 
255  virtual void setUserNoDataValue( int bandNo, const QgsRasterRangeList &noData );
256 
258  virtual QgsRasterRangeList userNoDataValues( int bandNo ) const { return mUserNoDataValue.value( bandNo - 1 ); }
259 
260  virtual QList<QgsColorRampShader::ColorRampItem> colorTable( int bandNo ) const
261  { Q_UNUSED( bandNo ) return QList<QgsColorRampShader::ColorRampItem>(); }
262 
267  QStringList subLayers() const override
268  {
269  return QStringList();
270  }
271 
274 
276  virtual bool supportsLegendGraphic() const { return false; }
277 
289  virtual QImage getLegendGraphic( double scale = 0, bool forceRefresh = false, const QgsRectangle *visibleExtent = nullptr ) SIP_SKIP
290  {
291  Q_UNUSED( scale )
292  Q_UNUSED( forceRefresh )
293  Q_UNUSED( visibleExtent )
294  return QImage();
295  }
296 
310  virtual QgsImageFetcher *getLegendGraphicFetcher( const QgsMapSettings *mapSettings ) SIP_FACTORY
311  {
312  Q_UNUSED( mapSettings )
313  return nullptr;
314  }
315 
317  virtual QString buildPyramids( const QList<QgsRasterPyramid> &pyramidList,
318  const QString &resamplingMethod = "NEAREST",
320  const QStringList &configOptions = QStringList(),
321  QgsRasterBlockFeedback *feedback = nullptr )
322  {
323  Q_UNUSED( pyramidList )
324  Q_UNUSED( resamplingMethod )
325  Q_UNUSED( format )
326  Q_UNUSED( configOptions )
327  Q_UNUSED( feedback )
328  return QStringLiteral( "FAILED_NOT_SUPPORTED" );
329  }
330 
339  virtual QList<QgsRasterPyramid> buildPyramidList( QList<int> overviewList = QList<int>() ) // clazy:exclude=function-args-by-ref
340  { Q_UNUSED( overviewList ) return QList<QgsRasterPyramid>(); }
341 
343  bool hasPyramids();
344 
349  virtual QString htmlMetadata() = 0;
350 
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 
565  {
568  };
569 
582  virtual QgsPoint transformCoordinates( const QgsPoint &point, TransformType type );
583 
584 
591  virtual bool enableProviderResampling( bool enable ) { Q_UNUSED( enable ); return false; }
592 
605  bool isProviderResamplingEnabled() const { return mProviderResamplingEnabled; }
606 
611  enum class ResamplingMethod
612  {
613  Nearest,
614  Bilinear,
615  Cubic,
616  };
617 
624  virtual bool setZoomedInResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
625 
630  ResamplingMethod zoomedInResamplingMethod() const { return mZoomedInResamplingMethod; }
631 
638  virtual bool setZoomedOutResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
639 
644  ResamplingMethod zoomedOutResamplingMethod() const { return mZoomedOutResamplingMethod; }
645 
652  virtual bool setMaxOversampling( double factor ) { Q_UNUSED( factor ); return false; }
653 
658  double maxOversampling() const { return mMaxOversampling; }
659 
660  void readXml( const QDomElement &filterElem ) override;
661 
662  void writeXml( QDomDocument &doc, QDomElement &parentElem ) const override;
663 
664  signals:
665 
670  void statusChanged( const QString & ) const;
671 
672  protected:
673 
679  virtual bool readBlock( int bandNo, int xBlock, int yBlock, void *data ) SIP_SKIP
680  { Q_UNUSED( bandNo ) Q_UNUSED( xBlock ); Q_UNUSED( yBlock ); Q_UNUSED( data ); return false; }
681 
687  virtual bool readBlock( int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback = nullptr ) SIP_SKIP
688  { Q_UNUSED( bandNo ) Q_UNUSED( viewExtent ); Q_UNUSED( width ); Q_UNUSED( height ); Q_UNUSED( data ); Q_UNUSED( feedback ); return false; }
689 
691  bool userNoDataValuesContains( int bandNo, double value ) const;
692 
694  void copyBaseSettings( const QgsRasterDataProvider &other );
695 
700  int mDpi = -1;
701 
706  //bool hasNoDataValue ( int bandNo );
707 
709  QList<double> mSrcNoDataValue;
710 
712  QList<bool> mSrcHasNoDataValue;
713 
719  QList<bool> mUseSrcNoDataValue;
720 
725  QList< QgsRasterRangeList > mUserNoDataValue;
726 
728 
730  bool mProviderResamplingEnabled = false;
731 
733  ResamplingMethod mZoomedInResamplingMethod = ResamplingMethod::Nearest;
734 
736  ResamplingMethod mZoomedOutResamplingMethod = ResamplingMethod::Nearest;
737 
739  double mMaxOversampling = 2.0;
740 
741  private:
742 
746  std::unique_ptr< QgsRasterDataProviderTemporalCapabilities > mTemporalCapabilities;
747 
748 };
749 
750 Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRasterDataProvider::ProviderCapabilities )
751 
752 // clazy:excludeall=qstring-allocations
753 
754 #endif
IdentifyFormat
Definition: qgsraster.h:57
A rectangle specified with double values.
Definition: qgsrectangle.h:41
bool setInput(QgsRasterInterface *input) override
Set input.
virtual bool setZoomedInResamplingMethod(ResamplingMethod method)
Set resampling method to apply for zoomed-in operations.
bool isProviderResamplingEnabled() const
Returns whether provider-level resampling is enabled.
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
ResamplingMethod zoomedOutResamplingMethod() const
Returns resampling method for zoomed-out operations.
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:44
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.
Transforms layer (georeferenced) coordinates to image coordinates.
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
virtual bool setZoomedOutResamplingMethod(ResamplingMethod method)
Set resampling method to apply for zoomed-out operations.
virtual bool enableProviderResampling(bool enable)
Enable or disable provider-level resampling.
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
TransformType
Types of transformation in transformCoordinates() function.
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
double maxOversampling() const
Returns maximum oversampling factor for zoomed-out operations.
Base class for processing filters like renderers, reprojector, resampler etc.
virtual bool isEditable() const
Checks whether the provider is in editing mode, i.e.
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
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.
ResamplingMethod
Resampling method for provider-level resampling.
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
ResamplingMethod zoomedInResamplingMethod() const
Returns resampling method for zoomed-in operations.
virtual QgsRasterInterface * clone() const =0
Clone itself, create deep copy.
#define SIP_OUT
Definition: qgis_sip.h:58
virtual bool setMaxOversampling(double factor)
Sets maximum oversampling factor for zoomed-out operations.
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.
Transforms image coordinates to layer (georeferenced) coordinates.
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.