QGIS API Documentation 3.32.0-Lima (311a8cb8a6)
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"
37#include "qgsfields.h"
38#include "qgsrasterinterface.h"
39#include "qgsrasterpyramid.h"
40#include "qgsrasterrange.h"
41#include "qgsrectangle.h"
42#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 Qgis::RasterColorInterpretation colorInterpretation( int bandNo ) const;
159
163 QString colorName( Qgis::RasterColorInterpretation colorInterpretation ) const
164 {
165 // Modified copy from GDAL
166 switch ( colorInterpretation )
167 {
168 case Qgis::RasterColorInterpretation::Undefined:
169 return QStringLiteral( "Undefined" );
170
172 return QStringLiteral( "Gray" );
173
175 return QStringLiteral( "Palette" );
176
178 return QStringLiteral( "Red" );
179
181 return QStringLiteral( "Green" );
182
184 return QStringLiteral( "Blue" );
185
187 return QStringLiteral( "Alpha" );
188
190 return QStringLiteral( "Hue" );
191
193 return QStringLiteral( "Saturation" );
194
196 return QStringLiteral( "Lightness" );
197
199 return QStringLiteral( "Cyan" );
200
202 return QStringLiteral( "Magenta" );
203
205 return QStringLiteral( "Yellow" );
206
208 return QStringLiteral( "Black" );
209
211 return QStringLiteral( "YCbCr_Y" );
212
214 return QStringLiteral( "YCbCr_Cb" );
215
217 return QStringLiteral( "YCbCr_Cr" );
218
220 return QStringLiteral( "Continuous Palette" );
221 }
222 return QString();
223 }
224
226 virtual bool reload() { return true; }
227
228 QString colorInterpretationName( int bandNo ) const override;
229
234 virtual double bandScale( int bandNo ) const { Q_UNUSED( bandNo ) return 1.0; }
235
240 virtual double bandOffset( int bandNo ) const { Q_UNUSED( bandNo ) return 0.0; }
241
242 // TODO: remove or make protected all readBlock working with void*
243
245 QgsRasterBlock *block( int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) override SIP_FACTORY;
246
248 virtual bool sourceHasNoDataValue( int bandNo ) const { return mSrcHasNoDataValue.value( bandNo - 1 ); }
249
251 virtual bool useSourceNoDataValue( int bandNo ) const { return mUseSrcNoDataValue.value( bandNo - 1 ); }
252
254 virtual void setUseSourceNoDataValue( int bandNo, bool use );
255
257 virtual double sourceNoDataValue( int bandNo ) const { return mSrcNoDataValue.value( bandNo - 1 ); }
258
259 virtual void setUserNoDataValue( int bandNo, const QgsRasterRangeList &noData );
260
262 virtual QgsRasterRangeList userNoDataValues( int bandNo ) const { return mUserNoDataValue.value( bandNo - 1 ); }
263
264 virtual QList<QgsColorRampShader::ColorRampItem> colorTable( int bandNo ) const
265 { Q_UNUSED( bandNo ) return QList<QgsColorRampShader::ColorRampItem>(); }
266
271 QStringList subLayers() const override
272 {
273 return QStringList();
274 }
275
276 QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() override;
277 const QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() const override SIP_SKIP;
278 QgsRasterDataProviderElevationProperties *elevationProperties() override;
279 const QgsRasterDataProviderElevationProperties *elevationProperties() const override SIP_SKIP;
280
282 virtual bool supportsLegendGraphic() const { return false; }
283
295 virtual QImage getLegendGraphic( double scale = 0, bool forceRefresh = false, const QgsRectangle *visibleExtent = nullptr ) SIP_SKIP
296 {
297 Q_UNUSED( scale )
298 Q_UNUSED( forceRefresh )
299 Q_UNUSED( visibleExtent )
300 return QImage();
301 }
302
317 {
318 Q_UNUSED( mapSettings )
319 return nullptr;
320 }
321
338 virtual QString buildPyramids( const QList<QgsRasterPyramid> &pyramidList,
339 const QString &resamplingMethod = "NEAREST",
340 Qgis::RasterPyramidFormat format = Qgis::RasterPyramidFormat::GeoTiff,
341 const QStringList &configOptions = QStringList(),
342 QgsRasterBlockFeedback *feedback = nullptr )
343 {
344 Q_UNUSED( pyramidList )
345 Q_UNUSED( resamplingMethod )
346 Q_UNUSED( format )
347 Q_UNUSED( configOptions )
348 Q_UNUSED( feedback )
349 return QStringLiteral( "FAILED_NOT_SUPPORTED" );
350 }
351
370 virtual QList<QgsRasterPyramid> buildPyramidList( const QList<int> &overviewList = QList<int>() )
371 { Q_UNUSED( overviewList ) return QList<QgsRasterPyramid>(); }
372
382 bool hasPyramids();
383
388 virtual QString htmlMetadata() = 0;
389
414 virtual QgsRasterIdentifyResult identify( const QgsPointXY &point, Qgis::RasterIdentifyFormat format, const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
415
430 virtual double sample( const QgsPointXY &point, int band,
431 bool *ok SIP_OUT = nullptr,
432 const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
433
442 virtual QString lastErrorTitle() = 0;
443
453 virtual QString lastError() = 0;
454
456 virtual QString lastErrorFormat();
457
459 int dpi() const { return mDpi; }
460
462 void setDpi( int dpi ) { mDpi = dpi; }
463
465 QDateTime timestamp() const override { return mTimestamp; }
466
468 QDateTime dataTimestamp() const override { return QDateTime(); }
469
476 virtual bool isEditable() const { return false; }
477
488 virtual bool setEditable( bool enabled ) { Q_UNUSED( enabled ) return false; }
489
490 // TODO: add data type (may be different from band type)
491
493 virtual bool write( void *data, int band, int width, int height, int xOffset, int yOffset )
494 {
495 Q_UNUSED( data )
496 Q_UNUSED( band )
497 Q_UNUSED( width )
498 Q_UNUSED( height )
499 Q_UNUSED( xOffset )
500 Q_UNUSED( yOffset )
501 return false;
502 }
503
520 bool writeBlock( QgsRasterBlock *block, int band, int xOffset = 0, int yOffset = 0 );
521
523 static QgsRasterDataProvider *create( const QString &providerKey,
524 const QString &uri,
525 const QString &format, int nBands,
526 Qgis::DataType type,
527 int width, int height, double *geoTransform,
529 const QStringList &createOptions = QStringList() );
530
536 virtual bool setNoDataValue( int bandNo, double noDataValue ) { Q_UNUSED( bandNo ) Q_UNUSED( noDataValue ); return false; }
537
539 virtual bool remove() { return false; }
540
545 static QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
546
553 {
554 QString name;
555 QString uri;
556 QString provider;
557 };
558
565 {
568 int width;
570 QString formula;
571 QList <QgsRasterDataProvider::VirtualRasterInputLayers> rInputLayers;
572
573 };
574
580 static QgsRasterDataProvider::VirtualRasterParameters decodeVirtualRasterProviderUri( const QString &uri, bool *ok = nullptr );
581
587 static QString encodeVirtualRasterProviderUri( const VirtualRasterParameters &parts );
588
594 virtual QString validateCreationOptions( const QStringList &createOptions, const QString &format )
595 { Q_UNUSED( createOptions ) Q_UNUSED( format ); return QString(); }
596
602 const QStringList &configOptions, const QString &fileFormat )
603 { Q_UNUSED( pyramidsFormat ) Q_UNUSED( configOptions ); Q_UNUSED( fileFormat ); return QString(); }
604
610 static QString identifyFormatName( Qgis::RasterIdentifyFormat format );
611
617 static Qgis::RasterIdentifyFormat identifyFormatFromName( const QString &formatName );
618
622 static QString identifyFormatLabel( Qgis::RasterIdentifyFormat format );
623
627 static Capability identifyFormatToCapability( Qgis::RasterIdentifyFormat format );
628
635
642
651 virtual QList< double > nativeResolutions() const;
652
659 virtual bool ignoreExtents() const;
660
666 {
669 };
670
683 virtual QgsPoint transformCoordinates( const QgsPoint &point, TransformType type );
684
685
692 virtual bool enableProviderResampling( bool enable ) { Q_UNUSED( enable ); return false; }
693
706 bool isProviderResamplingEnabled() const { return mProviderResamplingEnabled; }
707
713 {
714 Nearest,
715 Bilinear,
716 Cubic,
717 CubicSpline,
718 Lanczos,
719 Average,
720 Mode,
721 Gauss
722 };
723
730 virtual bool setZoomedInResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
731
736 ResamplingMethod zoomedInResamplingMethod() const { return mZoomedInResamplingMethod; }
737
744 virtual bool setZoomedOutResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
745
750 ResamplingMethod zoomedOutResamplingMethod() const { return mZoomedOutResamplingMethod; }
751
758 virtual bool setMaxOversampling( double factor ) { Q_UNUSED( factor ); return false; }
759
764 double maxOversampling() const { return mMaxOversampling; }
765
766 void readXml( const QDomElement &filterElem ) override;
767
768 void writeXml( QDomDocument &doc, QDomElement &parentElem ) const override;
769
775 QgsRasterAttributeTable *attributeTable( int bandNumber ) const;
776
785 void setAttributeTable( int bandNumber, QgsRasterAttributeTable *attributeTable SIP_TRANSFER );
786
793 void removeAttributeTable( int bandNumber );
794
802 bool writeFileBasedAttributeTable( int bandNumber, const QString &path, QString *errorMessage SIP_OUT = nullptr ) const;
803
810 bool readFileBasedAttributeTable( int bandNumber, const QString &path, QString *errorMessage SIP_OUT = nullptr );
811
822 virtual bool writeNativeAttributeTable( QString *errorMessage SIP_OUT = nullptr ); //#spellok
823
832 virtual bool readNativeAttributeTable( QString *errorMessage SIP_OUT = nullptr );
833
834
835 signals:
836
841 void statusChanged( const QString & ) const;
842
843
844 protected:
845
851 virtual bool readBlock( int bandNo, int xBlock, int yBlock, void *data ) SIP_SKIP
852 { Q_UNUSED( bandNo ) Q_UNUSED( xBlock ); Q_UNUSED( yBlock ); Q_UNUSED( data ); return false; }
853
859 virtual bool readBlock( int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback = nullptr ) SIP_SKIP
860 { Q_UNUSED( bandNo ) Q_UNUSED( viewExtent ); Q_UNUSED( width ); Q_UNUSED( height ); Q_UNUSED( data ); Q_UNUSED( feedback ); return false; }
861
863 bool userNoDataValuesContains( int bandNo, double value ) const;
864
866 void copyBaseSettings( const QgsRasterDataProvider &other );
867
872 int mDpi = -1;
873
878 //bool hasNoDataValue ( int bandNo );
879
881 QList<double> mSrcNoDataValue;
882
885
892
897 QList< QgsRasterRangeList > mUserNoDataValue;
898
900
902 bool mProviderResamplingEnabled = false;
903
905 ResamplingMethod mZoomedInResamplingMethod = ResamplingMethod::Nearest;
906
908 ResamplingMethod mZoomedOutResamplingMethod = ResamplingMethod::Nearest;
909
911 double mMaxOversampling = 2.0;
912
913 private:
914
918 std::unique_ptr< QgsRasterDataProviderTemporalCapabilities > mTemporalCapabilities;
919
920 std::unique_ptr< QgsRasterDataProviderElevationProperties > mElevationProperties;
921
922 std::map<int, std::unique_ptr<QgsRasterAttributeTable>> mAttributeTables;
923
924};
925
926Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRasterDataProvider::ProviderCapabilities )
927
928// clazy:excludeall=qstring-allocations
929
930#endif
RasterPyramidFormat
Raster pyramid formats.
Definition: qgis.h:3167
DataType
Raster data types.
Definition: qgis.h:241
RasterColorInterpretation
Raster color interpretation.
Definition: qgis.h:3098
@ GreenBand
Green band of RGBA image.
@ SaturationBand
Saturation band of HLS image.
@ MagentaBand
Magenta band of CMYK image.
@ BlackBand
Black band of CMLY image.
@ AlphaBand
Alpha (0=transparent, 255=opaque)
@ BlueBand
Blue band of RGBA image.
@ YellowBand
Yellow band of CMYK image.
@ CyanBand
Cyan band of CMYK image.
@ LightnessBand
Lightness band of HLS image.
@ HueBand
Hue band of HLS image.
@ PaletteIndex
Paletted (see associated color table)
@ RedBand
Red band of RGBA image.
@ ContinuousPalette
Continuous palette, QGIS addition, GRASS.
RasterIdentifyFormat
Raster identify formats.
Definition: qgis.h:3197
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.
Handles elevation related properties for a raster data provider.
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...
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 QString buildPyramids(const QList< QgsRasterPyramid > &pyramidList, const QString &resamplingMethod="NEAREST", Qgis::RasterPyramidFormat format=Qgis::RasterPyramidFormat::GeoTiff, const QStringList &configOptions=QStringList(), QgsRasterBlockFeedback *feedback=nullptr)
Creates pyramid overviews.
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.
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.
QString colorName(Qgis::RasterColorInterpretation colorInterpretation) const
Returns a string color name representation of a color interpretation.
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.
virtual QString validatePyramidsConfigOptions(Qgis::RasterPyramidFormat pyramidsFormat, const QStringList &configOptions, const QString &fileFormat)
Validates pyramid creation options for a specific dataset and destination format.
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.
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.
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