QGIS API Documentation  3.10.0-A Coruña (6c816b4204)
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 
67  virtual void start() = 0;
68 
69  signals:
70 
75  void finish( const QImage &legend );
77  void progress( qint64 received, qint64 total );
79  void error( const QString &msg );
80 };
81 
82 
87 class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider, public QgsRasterInterface
88 {
89  Q_OBJECT
90 
91  public:
92 
98  {
99  NoProviderCapabilities = 0,
100  ReadLayerMetadata = 1 << 1,
101  WriteLayerMetadata = 1 << 2,
102  ProviderHintBenefitsFromResampling = 1 << 3
103  };
104 
106  Q_DECLARE_FLAGS( ProviderCapabilities, ProviderCapability )
107 
109 
118  QgsRasterDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions = QgsDataProvider::ProviderOptions() );
119 
120  QgsRasterInterface *clone() const override = 0;
121 
126  virtual QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const;
127 
128  /* It makes no sense to set input on provider */
129  bool setInput( QgsRasterInterface *input ) override { Q_UNUSED( input ) return false; }
130 
131  QgsRectangle extent() const override = 0;
132 
134  Qgis::DataType dataType( int bandNo ) const override = 0;
135 
140  Qgis::DataType sourceDataType( int bandNo ) const override = 0;
141 
143  virtual int colorInterpretation( int bandNo ) const
144  {
145  Q_UNUSED( bandNo )
147  }
148 
149  QString colorName( int colorInterpretation ) const
150  {
151  // Modified copy from GDAL
152  switch ( colorInterpretation )
153  {
155  return QStringLiteral( "Undefined" );
156 
158  return QStringLiteral( "Gray" );
159 
161  return QStringLiteral( "Palette" );
162 
163  case QgsRaster::RedBand:
164  return QStringLiteral( "Red" );
165 
167  return QStringLiteral( "Green" );
168 
169  case QgsRaster::BlueBand:
170  return QStringLiteral( "Blue" );
171 
173  return QStringLiteral( "Alpha" );
174 
175  case QgsRaster::HueBand:
176  return QStringLiteral( "Hue" );
177 
179  return QStringLiteral( "Saturation" );
180 
182  return QStringLiteral( "Lightness" );
183 
184  case QgsRaster::CyanBand:
185  return QStringLiteral( "Cyan" );
186 
188  return QStringLiteral( "Magenta" );
189 
191  return QStringLiteral( "Yellow" );
192 
194  return QStringLiteral( "Black" );
195 
197  return QStringLiteral( "YCbCr_Y" );
198 
200  return QStringLiteral( "YCbCr_Cb" );
201 
203  return QStringLiteral( "YCbCr_Cr" );
204 
205  default:
206  return QStringLiteral( "Unknown" );
207  }
208  }
210  virtual bool reload() { return true; }
211 
212  virtual QString colorInterpretationName( int bandNo ) const
213  {
214  return colorName( colorInterpretation( bandNo ) );
215  }
216 
221  virtual double bandScale( int bandNo ) const { Q_UNUSED( bandNo ) return 1.0; }
222 
227  virtual double bandOffset( int bandNo ) const { Q_UNUSED( bandNo ) return 0.0; }
228 
229  // TODO: remove or make protected all readBlock working with void*
230 
232  QgsRasterBlock *block( int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) override SIP_FACTORY;
233 
235  virtual bool sourceHasNoDataValue( int bandNo ) const { return mSrcHasNoDataValue.value( bandNo - 1 ); }
236 
238  virtual bool useSourceNoDataValue( int bandNo ) const { return mUseSrcNoDataValue.value( bandNo - 1 ); }
239 
241  virtual void setUseSourceNoDataValue( int bandNo, bool use );
242 
244  virtual double sourceNoDataValue( int bandNo ) const { return mSrcNoDataValue.value( bandNo - 1 ); }
245 
246  virtual void setUserNoDataValue( int bandNo, const QgsRasterRangeList &noData );
247 
249  virtual QgsRasterRangeList userNoDataValues( int bandNo ) const { return mUserNoDataValue.value( bandNo - 1 ); }
250 
251  virtual QList<QgsColorRampShader::ColorRampItem> colorTable( int bandNo ) const
252  { Q_UNUSED( bandNo ) return QList<QgsColorRampShader::ColorRampItem>(); }
253 
258  QStringList subLayers() const override
259  {
260  return QStringList();
261  }
262 
264  virtual bool supportsLegendGraphic() const { return false; }
265 
277  virtual QImage getLegendGraphic( double scale = 0, bool forceRefresh = false, const QgsRectangle *visibleExtent = nullptr ) SIP_SKIP
278  {
279  Q_UNUSED( scale )
280  Q_UNUSED( forceRefresh )
281  Q_UNUSED( visibleExtent )
282  return QImage();
283  }
284 
298  virtual QgsImageFetcher *getLegendGraphicFetcher( const QgsMapSettings *mapSettings ) SIP_FACTORY
299  {
300  Q_UNUSED( mapSettings )
301  return nullptr;
302  }
303 
305  virtual QString buildPyramids( const QList<QgsRasterPyramid> &pyramidList,
306  const QString &resamplingMethod = "NEAREST",
308  const QStringList &configOptions = QStringList(),
309  QgsRasterBlockFeedback *feedback = nullptr )
310  {
311  Q_UNUSED( pyramidList )
312  Q_UNUSED( resamplingMethod )
313  Q_UNUSED( format )
314  Q_UNUSED( configOptions )
315  Q_UNUSED( feedback )
316  return QStringLiteral( "FAILED_NOT_SUPPORTED" );
317  }
318 
327  virtual QList<QgsRasterPyramid> buildPyramidList( QList<int> overviewList = QList<int>() ) // clazy:exclude=function-args-by-ref
328  { Q_UNUSED( overviewList ) return QList<QgsRasterPyramid>(); }
329 
331  bool hasPyramids();
332 
337  virtual QString htmlMetadata() = 0;
338 
364  virtual QgsRasterIdentifyResult identify( const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
365 
380  virtual double sample( const QgsPointXY &point, int band,
381  bool *ok SIP_OUT = nullptr,
382  const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
383 
392  virtual QString lastErrorTitle() = 0;
393 
403  virtual QString lastError() = 0;
404 
406  virtual QString lastErrorFormat();
407 
409  int dpi() const { return mDpi; }
410 
412  void setDpi( int dpi ) { mDpi = dpi; }
413 
415  QDateTime timestamp() const override { return mTimestamp; }
416 
418  QDateTime dataTimestamp() const override { return QDateTime(); }
419 
426  virtual bool isEditable() const { return false; }
427 
438  virtual bool setEditable( bool enabled ) { Q_UNUSED( enabled ) return false; }
439 
441  // TODO: add data type (may be different from band type)
442  virtual bool write( void *data, int band, int width, int height, int xOffset, int yOffset )
443  {
444  Q_UNUSED( data )
445  Q_UNUSED( band )
446  Q_UNUSED( width )
447  Q_UNUSED( height )
448  Q_UNUSED( xOffset )
449  Q_UNUSED( yOffset )
450  return false;
451  }
452 
469  bool writeBlock( QgsRasterBlock *block, int band, int xOffset = 0, int yOffset = 0 );
470 
472  static QgsRasterDataProvider *create( const QString &providerKey,
473  const QString &uri,
474  const QString &format, int nBands,
475  Qgis::DataType type,
476  int width, int height, double *geoTransform,
478  const QStringList &createOptions = QStringList() );
479 
485  virtual bool setNoDataValue( int bandNo, double noDataValue ) { Q_UNUSED( bandNo ) Q_UNUSED( noDataValue ); return false; }
486 
488  virtual bool remove() { return false; }
489 
494  static QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
495 
501  virtual QString validateCreationOptions( const QStringList &createOptions, const QString &format )
502  { Q_UNUSED( createOptions ) Q_UNUSED( format ); return QString(); }
503 
509  const QStringList &configOptions, const QString &fileFormat )
510  { Q_UNUSED( pyramidsFormat ) Q_UNUSED( configOptions ); Q_UNUSED( fileFormat ); return QString(); }
511 
512  static QString identifyFormatName( QgsRaster::IdentifyFormat format );
513  static QgsRaster::IdentifyFormat identifyFormatFromName( const QString &formatName );
514  static QString identifyFormatLabel( QgsRaster::IdentifyFormat format );
515  static Capability identifyFormatToCapability( QgsRaster::IdentifyFormat format );
516 
523 
530 
539  virtual QList< double > nativeResolutions() const;
540 
547  virtual bool ignoreExtents() const;
548 
549  signals:
550 
555  void statusChanged( const QString & ) const;
556 
557  protected:
558 
564  virtual bool readBlock( int bandNo, int xBlock, int yBlock, void *data ) SIP_SKIP
565  { Q_UNUSED( bandNo ) Q_UNUSED( xBlock ); Q_UNUSED( yBlock ); Q_UNUSED( data ); return false; }
566 
572  virtual bool readBlock( int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback = nullptr ) SIP_SKIP
573  { Q_UNUSED( bandNo ) Q_UNUSED( viewExtent ); Q_UNUSED( width ); Q_UNUSED( height ); Q_UNUSED( data ); Q_UNUSED( feedback ); return false; }
574 
576  bool userNoDataValuesContains( int bandNo, double value ) const;
577 
579  void copyBaseSettings( const QgsRasterDataProvider &other );
580 
585  int mDpi = -1;
586 
591  //bool hasNoDataValue ( int bandNo );
592 
594  QList<double> mSrcNoDataValue;
595 
597  QList<bool> mSrcHasNoDataValue;
598 
604  QList<bool> mUseSrcNoDataValue;
605 
610  QList< QgsRasterRangeList > mUserNoDataValue;
611 
613 
614 };
615 
616 Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRasterDataProvider::ProviderCapabilities )
617 
618 // clazy:excludeall=qstring-allocations
619 
620 #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.
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:80
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.
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.
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.
#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.