QGIS API Documentation 3.29.0-Master (006c3c0232)
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"
38#include "qgsfields.h"
39#include "qgsrasterinterface.h"
40#include "qgsrasterpyramid.h"
41#include "qgsrasterrange.h"
42#include "qgsrectangle.h"
43#include "qgsrasteriterator.h"
45
46class QImage;
47class QByteArray;
48
49class QgsPointXY;
51class QgsMapSettings;
52
58class CORE_EXPORT QgsImageFetcher : public QObject
59{
60 Q_OBJECT
61 public:
63 QgsImageFetcher( QObject *parent = nullptr ) : QObject( parent ) {}
64
69 virtual void start() = 0;
70
71 signals:
72
77 void finish( const QImage &legend );
79 void progress( qint64 received, qint64 total );
81 void error( const QString &msg );
82};
83
84
90{
91 Q_OBJECT
92
93 public:
94
100 {
101 NoProviderCapabilities = 0,
102 ReadLayerMetadata = 1 << 1,
103 WriteLayerMetadata = 1 << 2,
104 ProviderHintBenefitsFromResampling = 1 << 3,
105 ProviderHintCanPerformProviderResampling = 1 << 4,
106 ReloadData = 1 << 5,
107 DpiDependentData = 1 << 6,
108 NativeRasterAttributeTable = 1 << 7,
109 };
110
112 Q_DECLARE_FLAGS( ProviderCapabilities, ProviderCapability )
113
115
124 QgsRasterDataProvider( const QString &uri,
126 QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
127
128 QgsRasterDataProvider *clone() const override = 0;
129
134 virtual QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const;
135
136 /* It makes no sense to set input on provider */
137 bool setInput( QgsRasterInterface *input ) override { Q_UNUSED( input ) return false; }
138
139 QgsRectangle extent() const override = 0;
140
142 Qgis::DataType dataType( int bandNo ) const override = 0;
143
149 virtual QgsFields fields() const { return QgsFields(); };
150
155 Qgis::DataType sourceDataType( int bandNo ) const override = 0;
156
158 virtual int colorInterpretation( int bandNo ) const;
159
160 QString colorName( int colorInterpretation ) const
161 {
162 // Modified copy from GDAL
163 switch ( colorInterpretation )
164 {
166 return QStringLiteral( "Undefined" );
167
169 return QStringLiteral( "Gray" );
170
172 return QStringLiteral( "Palette" );
173
175 return QStringLiteral( "Red" );
176
178 return QStringLiteral( "Green" );
179
181 return QStringLiteral( "Blue" );
182
184 return QStringLiteral( "Alpha" );
185
187 return QStringLiteral( "Hue" );
188
190 return QStringLiteral( "Saturation" );
191
193 return QStringLiteral( "Lightness" );
194
196 return QStringLiteral( "Cyan" );
197
199 return QStringLiteral( "Magenta" );
200
202 return QStringLiteral( "Yellow" );
203
205 return QStringLiteral( "Black" );
206
208 return QStringLiteral( "YCbCr_Y" );
209
211 return QStringLiteral( "YCbCr_Cb" );
212
214 return QStringLiteral( "YCbCr_Cr" );
215
216 default:
217 return QStringLiteral( "Unknown" );
218 }
219 }
221 virtual bool reload() { return true; }
222
223 QString colorInterpretationName( int bandNo ) const override;
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
271 QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() override;
272 const QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() const override SIP_SKIP;
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
310 {
311 Q_UNUSED( mapSettings )
312 return nullptr;
313 }
314
331 virtual QString buildPyramids( const QList<QgsRasterPyramid> &pyramidList,
332 const QString &resamplingMethod = "NEAREST",
334 const QStringList &configOptions = QStringList(),
335 QgsRasterBlockFeedback *feedback = nullptr )
336 {
337 Q_UNUSED( pyramidList )
338 Q_UNUSED( resamplingMethod )
339 Q_UNUSED( format )
340 Q_UNUSED( configOptions )
341 Q_UNUSED( feedback )
342 return QStringLiteral( "FAILED_NOT_SUPPORTED" );
343 }
344
363 virtual QList<QgsRasterPyramid> buildPyramidList( const QList<int> &overviewList = QList<int>() )
364 { Q_UNUSED( overviewList ) return QList<QgsRasterPyramid>(); }
365
375 bool hasPyramids();
376
381 virtual QString htmlMetadata() = 0;
382
407 virtual QgsRasterIdentifyResult identify( const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
408
423 virtual double sample( const QgsPointXY &point, int band,
424 bool *ok SIP_OUT = nullptr,
425 const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
426
435 virtual QString lastErrorTitle() = 0;
436
446 virtual QString lastError() = 0;
447
449 virtual QString lastErrorFormat();
450
452 int dpi() const { return mDpi; }
453
455 void setDpi( int dpi ) { mDpi = dpi; }
456
458 QDateTime timestamp() const override { return mTimestamp; }
459
461 QDateTime dataTimestamp() const override { return QDateTime(); }
462
469 virtual bool isEditable() const { return false; }
470
481 virtual bool setEditable( bool enabled ) { Q_UNUSED( enabled ) return false; }
482
483 // TODO: add data type (may be different from band type)
484
486 virtual bool write( void *data, int band, int width, int height, int xOffset, int yOffset )
487 {
488 Q_UNUSED( data )
489 Q_UNUSED( band )
490 Q_UNUSED( width )
491 Q_UNUSED( height )
492 Q_UNUSED( xOffset )
493 Q_UNUSED( yOffset )
494 return false;
495 }
496
513 bool writeBlock( QgsRasterBlock *block, int band, int xOffset = 0, int yOffset = 0 );
514
516 static QgsRasterDataProvider *create( const QString &providerKey,
517 const QString &uri,
518 const QString &format, int nBands,
519 Qgis::DataType type,
520 int width, int height, double *geoTransform,
522 const QStringList &createOptions = QStringList() );
523
529 virtual bool setNoDataValue( int bandNo, double noDataValue ) { Q_UNUSED( bandNo ) Q_UNUSED( noDataValue ); return false; }
530
532 virtual bool remove() { return false; }
533
538 static QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
539
546 {
547 QString name;
548 QString uri;
549 QString provider;
550 };
551
558 {
561 int width;
563 QString formula;
564 QList <QgsRasterDataProvider::VirtualRasterInputLayers> rInputLayers;
565
566 };
567
573 static QgsRasterDataProvider::VirtualRasterParameters decodeVirtualRasterProviderUri( const QString &uri, bool *ok = nullptr );
574
580 static QString encodeVirtualRasterProviderUri( const VirtualRasterParameters &parts );
581
587 virtual QString validateCreationOptions( const QStringList &createOptions, const QString &format )
588 { Q_UNUSED( createOptions ) Q_UNUSED( format ); return QString(); }
589
595 const QStringList &configOptions, const QString &fileFormat )
596 { Q_UNUSED( pyramidsFormat ) Q_UNUSED( configOptions ); Q_UNUSED( fileFormat ); return QString(); }
597
598 static QString identifyFormatName( QgsRaster::IdentifyFormat format );
599 static QgsRaster::IdentifyFormat identifyFormatFromName( const QString &formatName );
600 static QString identifyFormatLabel( QgsRaster::IdentifyFormat format );
601 static Capability identifyFormatToCapability( QgsRaster::IdentifyFormat format );
602
609
616
625 virtual QList< double > nativeResolutions() const;
626
633 virtual bool ignoreExtents() const;
634
640 {
643 };
644
657 virtual QgsPoint transformCoordinates( const QgsPoint &point, TransformType type );
658
659
666 virtual bool enableProviderResampling( bool enable ) { Q_UNUSED( enable ); return false; }
667
680 bool isProviderResamplingEnabled() const { return mProviderResamplingEnabled; }
681
687 {
688 Nearest,
689 Bilinear,
690 Cubic,
691 CubicSpline,
692 Lanczos,
693 Average,
694 Mode,
695 Gauss
696 };
697
704 virtual bool setZoomedInResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
705
710 ResamplingMethod zoomedInResamplingMethod() const { return mZoomedInResamplingMethod; }
711
718 virtual bool setZoomedOutResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
719
724 ResamplingMethod zoomedOutResamplingMethod() const { return mZoomedOutResamplingMethod; }
725
732 virtual bool setMaxOversampling( double factor ) { Q_UNUSED( factor ); return false; }
733
738 double maxOversampling() const { return mMaxOversampling; }
739
740 void readXml( const QDomElement &filterElem ) override;
741
742 void writeXml( QDomDocument &doc, QDomElement &parentElem ) const override;
743
749 QgsRasterAttributeTable *attributeTable( int bandNumber ) const;
750
759 void setAttributeTable( int bandNumber, QgsRasterAttributeTable *attributeTable SIP_TRANSFER );
760
767 void removeAttributeTable( int bandNumber );
768
776 bool writeFileBasedAttributeTable( int bandNumber, const QString &path, QString *errorMessage SIP_OUT = nullptr ) const;
777
784 bool readFileBasedAttributeTable( int bandNumber, const QString &path, QString *errorMessage SIP_OUT = nullptr );
785
796 virtual bool writeNativeAttributeTable( QString *errorMessage SIP_OUT = nullptr ); //#spellok
797
806 virtual bool readNativeAttributeTable( QString *errorMessage SIP_OUT = nullptr );
807
808
809 signals:
810
815 void statusChanged( const QString & ) const;
816
817
818 protected:
819
825 virtual bool readBlock( int bandNo, int xBlock, int yBlock, void *data ) SIP_SKIP
826 { Q_UNUSED( bandNo ) Q_UNUSED( xBlock ); Q_UNUSED( yBlock ); Q_UNUSED( data ); return false; }
827
833 virtual bool readBlock( int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback = nullptr ) SIP_SKIP
834 { Q_UNUSED( bandNo ) Q_UNUSED( viewExtent ); Q_UNUSED( width ); Q_UNUSED( height ); Q_UNUSED( data ); Q_UNUSED( feedback ); return false; }
835
837 bool userNoDataValuesContains( int bandNo, double value ) const;
838
840 void copyBaseSettings( const QgsRasterDataProvider &other );
841
846 int mDpi = -1;
847
852 //bool hasNoDataValue ( int bandNo );
853
855 QList<double> mSrcNoDataValue;
856
859
866
871 QList< QgsRasterRangeList > mUserNoDataValue;
872
874
876 bool mProviderResamplingEnabled = false;
877
879 ResamplingMethod mZoomedInResamplingMethod = ResamplingMethod::Nearest;
880
882 ResamplingMethod mZoomedOutResamplingMethod = ResamplingMethod::Nearest;
883
885 double mMaxOversampling = 2.0;
886
887 private:
888
892 std::unique_ptr< QgsRasterDataProviderTemporalCapabilities > mTemporalCapabilities;
893
894 std::map<int, std::unique_ptr<QgsRasterAttributeTable>> mAttributeTables;
895
896};
897
898Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRasterDataProvider::ProviderCapabilities )
899
900// clazy:excludeall=qstring-allocations
901
902#endif
DataType
Raster data types.
Definition: qgis.h:129
This class represents a coordinate reference system (CRS).
Abstract base class for spatial data provider implementations.
Container of fields for a vector layer.
Definition: qgsfields.h:45
Handles asynchronous download of images.
QgsImageFetcher(QObject *parent=nullptr)
Constructor.
void progress(qint64 received, qint64 total)
Emitted to report progress.
void error(const QString &msg)
Emitted when an error occurs.
void finish(const QImage &legend)
Emitted when the download completes.
virtual void start()=0
Starts the image download.
The QgsMapSettings class contains configuration for rendering of the map.
A class to represent a 2D point.
Definition: qgspointxy.h:59
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:49
The QgsRasterAttributeTable class represents a Raster Attribute Table (RAT).
Feedback object tailored for raster block reading.
Raster data container.
Implementation of data provider temporal properties for QgsRasterDataProviders.
Base class for raster data providers.
virtual QgsFields fields() const
Returns the fields of the raster layer for data providers that expose them, the default implementatio...
virtual QString buildPyramids(const QList< QgsRasterPyramid > &pyramidList, const QString &resamplingMethod="NEAREST", QgsRaster::RasterPyramidsFormat format=QgsRaster::PyramidsGTiff, const QStringList &configOptions=QStringList(), QgsRasterBlockFeedback *feedback=nullptr)
Creates pyramid overviews.
QList< bool > mUseSrcNoDataValue
Use source nodata value.
TransformType
Types of transformation in transformCoordinates() function.
@ TransformLayerToImage
Transforms layer (georeferenced) coordinates to image coordinates.
@ TransformImageToLayer
Transforms image coordinates to layer (georeferenced) coordinates.
QgsRasterDataProvider * clone() const override=0
Clone itself, create deep copy.
virtual bool setNoDataValue(int bandNo, double noDataValue)
Set no data value on created dataset.
virtual double bandOffset(int bandNo) const
Read band offset for raster value.
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.
virtual bool useSourceNoDataValue(int bandNo) const
Returns the source nodata value usage.
virtual QString validateCreationOptions(const QStringList &createOptions, const QString &format)
Validates creation options for a specific dataset and destination format.
virtual QString lastError()=0
Returns the verbose error text for the last error in this provider.
Qgis::DataType sourceDataType(int bandNo) const override=0
Returns source data type for the band specified by number, source data type may be shorter than dataT...
bool isProviderResamplingEnabled() const
Returns whether provider-level resampling is enabled.
virtual bool remove()
Remove dataset.
virtual double sourceNoDataValue(int bandNo) const
Value representing no data value.
QString colorName(int colorInterpretation) const
virtual QImage getLegendGraphic(double scale=0, bool forceRefresh=false, const QgsRectangle *visibleExtent=nullptr)
Returns the legend rendered as pixmap.
virtual bool reload()
Reload data (data could change)
QList< QgsRasterRangeList > mUserNoDataValue
List of lists of user defined additional no data values for each band, indexed from 0.
ResamplingMethod zoomedOutResamplingMethod() const
Returns resampling method for zoomed-out operations.
virtual bool isEditable() const
Checks whether the provider is in editing mode, i.e.
virtual bool enableProviderResampling(bool enable)
Enable or disable provider-level resampling.
void setDpi(int dpi)
Sets the output device resolution.
QDateTime timestamp() const override
Time stamp of data source in the moment when data/metadata were loaded by provider.
QgsRectangle extent() const override=0
Returns the extent of the layer.
virtual bool setMaxOversampling(double factor)
Sets maximum oversampling factor for zoomed-out operations.
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
double maxOversampling() const
Returns maximum oversampling factor for zoomed-out operations.
QStringList subLayers() const override
Returns the sublayers of this layer - useful for providers that manage their own layers,...
virtual double bandScale(int bandNo) const
Read band scale for raster value.
ProviderCapability
Enumeration with capabilities that raster providers might implement.
int dpi() const
Returns the dpi of the output device.
virtual QString validatePyramidsConfigOptions(QgsRaster::RasterPyramidsFormat pyramidsFormat, const QStringList &configOptions, const QString &fileFormat)
Validates pyramid creation options for a specific dataset and destination format.
QDateTime dataTimestamp() const override
Current time stamp of data source.
virtual QString htmlMetadata()=0
Returns metadata in a format suitable for feeding directly into a subset of the GUI raster properties...
virtual QList< QgsColorRampShader::ColorRampItem > colorTable(int bandNo) const
QList< double > mSrcNoDataValue
Source no data value is available and is set to be used or internal no data is available.
virtual QgsImageFetcher * getLegendGraphicFetcher(const QgsMapSettings *mapSettings)
Returns a new image downloader for the raster legend.
virtual bool readBlock(int bandNo, int xBlock, int yBlock, void *data)
Reads a block of raster data into data.
bool setInput(QgsRasterInterface *input) override
Set input.
QList< bool > mSrcHasNoDataValue
Source no data value exists.
void statusChanged(const QString &) const
Emit a message to be displayed on status bar, usually used by network providers (WMS,...
virtual QgsRasterRangeList userNoDataValues(int bandNo) const
Returns a list of user no data value ranges.
virtual bool setZoomedInResamplingMethod(ResamplingMethod method)
Set resampling method to apply for zoomed-in operations.
virtual int stepHeight() const
Step height for raster iterations.
virtual bool setEditable(bool enabled)
Turns on/off editing mode of the provider.
virtual int stepWidth() const
Step width for raster iterations.
ResamplingMethod zoomedInResamplingMethod() const
Returns resampling method for zoomed-in operations.
ResamplingMethod
Resampling method for provider-level resampling.
virtual QString lastErrorTitle()=0
Returns the caption error text for the last error in this provider.
virtual bool write(void *data, int band, int width, int height, int xOffset, int yOffset)
Writes into the provider datasource.
virtual bool setZoomedOutResamplingMethod(ResamplingMethod method)
Set resampling method to apply for zoomed-out operations.
virtual QList< QgsRasterPyramid > buildPyramidList(const QList< int > &overviewList=QList< int >())
Returns the raster layers pyramid list.
Raster identify results container.
Base class for processing filters like renderers, reprojector, resampler etc.
static const int DEFAULT_MAXIMUM_TILE_WIDTH
Default maximum tile width.
static const int DEFAULT_MAXIMUM_TILE_HEIGHT
Default maximum tile height.
IdentifyFormat
Definition: qgsraster.h:58
RasterPyramidsFormat
Definition: qgsraster.h:82
@ PyramidsGTiff
Definition: qgsraster.h:83
@ RedBand
Red band of RGBA image.
Definition: qgsraster.h:40
@ UndefinedColorInterpretation
Definition: qgsraster.h:37
@ YCbCr_YBand
Y Luminance.
Definition: qgsraster.h:51
@ YellowBand
Yellow band of CMYK image.
Definition: qgsraster.h:49
@ YCbCr_CbBand
Cb Chroma.
Definition: qgsraster.h:52
@ BlueBand
Blue band of RGBA image.
Definition: qgsraster.h:42
@ PaletteIndex
Paletted (see associated color table)
Definition: qgsraster.h:39
@ HueBand
Hue band of HLS image.
Definition: qgsraster.h:44
@ LightnessBand
Lightness band of HLS image.
Definition: qgsraster.h:46
@ AlphaBand
Alpha (0=transparent, 255=opaque)
Definition: qgsraster.h:43
@ BlackBand
Black band of CMLY image.
Definition: qgsraster.h:50
@ GreenBand
Green band of RGBA image.
Definition: qgsraster.h:41
@ CyanBand
Cyan band of CMYK image.
Definition: qgsraster.h:47
@ SaturationBand
Saturation band of HLS image.
Definition: qgsraster.h:45
@ GrayIndex
Greyscale.
Definition: qgsraster.h:38
@ MagentaBand
Magenta band of CMYK image.
Definition: qgsraster.h:48
@ YCbCr_CrBand
Cr Chroma.
Definition: qgsraster.h:53
A rectangle specified with double values.
Definition: qgsrectangle.h:42
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_OUT
Definition: qgis_sip.h:58
#define SIP_FACTORY
Definition: qgis_sip.h:76
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsField::ConfigurationFlags) CORE_EXPORT QDataStream &operator<<(QDataStream &out
Writes the field to stream out. QGIS version compatibility is not guaranteed.
QList< QgsRasterRange > QgsRasterRangeList
const QgsCoordinateReferenceSystem & crs
Setting options for creating vector data providers.
Struct that stores information of the raster used in QgsVirtualRasterProvider for the calculations,...
Struct that stores the information about the parameters that should be given to the QgsVirtualRasterP...
QList< QgsRasterDataProvider::VirtualRasterInputLayers > rInputLayers