QGIS API Documentation 3.30.0-'s-Hertogenbosch (f186b8efe0)
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"
44
45class QImage;
46class QByteArray;
47
48class QgsPointXY;
50class QgsMapSettings;
51
57class 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
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 ReloadData = 1 << 5,
106 DpiDependentData = 1 << 6,
107 NativeRasterAttributeTable = 1 << 7,
108 };
109
111 Q_DECLARE_FLAGS( ProviderCapabilities, ProviderCapability )
112
114
123 QgsRasterDataProvider( const QString &uri,
125 QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
126
127 QgsRasterDataProvider *clone() const override = 0;
128
133 virtual QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const;
134
135 /* It makes no sense to set input on provider */
136 bool setInput( QgsRasterInterface *input ) override { Q_UNUSED( input ) return false; }
137
138 QgsRectangle extent() const override = 0;
139
141 Qgis::DataType dataType( int bandNo ) const override = 0;
142
148 virtual QgsFields fields() const { return QgsFields(); };
149
154 Qgis::DataType sourceDataType( int bandNo ) const override = 0;
155
157 virtual Qgis::RasterColorInterpretation colorInterpretation( int bandNo ) const;
158
162 QString colorName( Qgis::RasterColorInterpretation colorInterpretation ) const
163 {
164 // Modified copy from GDAL
165 switch ( colorInterpretation )
166 {
167 case Qgis::RasterColorInterpretation::Undefined:
168 return QStringLiteral( "Undefined" );
169
171 return QStringLiteral( "Gray" );
172
174 return QStringLiteral( "Palette" );
175
177 return QStringLiteral( "Red" );
178
180 return QStringLiteral( "Green" );
181
183 return QStringLiteral( "Blue" );
184
186 return QStringLiteral( "Alpha" );
187
189 return QStringLiteral( "Hue" );
190
192 return QStringLiteral( "Saturation" );
193
195 return QStringLiteral( "Lightness" );
196
198 return QStringLiteral( "Cyan" );
199
201 return QStringLiteral( "Magenta" );
202
204 return QStringLiteral( "Yellow" );
205
207 return QStringLiteral( "Black" );
208
210 return QStringLiteral( "YCbCr_Y" );
211
213 return QStringLiteral( "YCbCr_Cb" );
214
216 return QStringLiteral( "YCbCr_Cr" );
217
219 return QStringLiteral( "Continuous Palette" );
220 }
221 return QString();
222 }
223
225 virtual bool reload() { return true; }
226
227 QString colorInterpretationName( int bandNo ) const override;
228
233 virtual double bandScale( int bandNo ) const { Q_UNUSED( bandNo ) return 1.0; }
234
239 virtual double bandOffset( int bandNo ) const { Q_UNUSED( bandNo ) return 0.0; }
240
241 // TODO: remove or make protected all readBlock working with void*
242
244 QgsRasterBlock *block( int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) override SIP_FACTORY;
245
247 virtual bool sourceHasNoDataValue( int bandNo ) const { return mSrcHasNoDataValue.value( bandNo - 1 ); }
248
250 virtual bool useSourceNoDataValue( int bandNo ) const { return mUseSrcNoDataValue.value( bandNo - 1 ); }
251
253 virtual void setUseSourceNoDataValue( int bandNo, bool use );
254
256 virtual double sourceNoDataValue( int bandNo ) const { return mSrcNoDataValue.value( bandNo - 1 ); }
257
258 virtual void setUserNoDataValue( int bandNo, const QgsRasterRangeList &noData );
259
261 virtual QgsRasterRangeList userNoDataValues( int bandNo ) const { return mUserNoDataValue.value( bandNo - 1 ); }
262
263 virtual QList<QgsColorRampShader::ColorRampItem> colorTable( int bandNo ) const
264 { Q_UNUSED( bandNo ) return QList<QgsColorRampShader::ColorRampItem>(); }
265
270 QStringList subLayers() const override
271 {
272 return QStringList();
273 }
274
275 QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() override;
276 const QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() const override SIP_SKIP;
277
279 virtual bool supportsLegendGraphic() const { return false; }
280
292 virtual QImage getLegendGraphic( double scale = 0, bool forceRefresh = false, const QgsRectangle *visibleExtent = nullptr ) SIP_SKIP
293 {
294 Q_UNUSED( scale )
295 Q_UNUSED( forceRefresh )
296 Q_UNUSED( visibleExtent )
297 return QImage();
298 }
299
314 {
315 Q_UNUSED( mapSettings )
316 return nullptr;
317 }
318
335 virtual QString buildPyramids( const QList<QgsRasterPyramid> &pyramidList,
336 const QString &resamplingMethod = "NEAREST",
337 Qgis::RasterPyramidFormat format = Qgis::RasterPyramidFormat::GeoTiff,
338 const QStringList &configOptions = QStringList(),
339 QgsRasterBlockFeedback *feedback = nullptr )
340 {
341 Q_UNUSED( pyramidList )
342 Q_UNUSED( resamplingMethod )
343 Q_UNUSED( format )
344 Q_UNUSED( configOptions )
345 Q_UNUSED( feedback )
346 return QStringLiteral( "FAILED_NOT_SUPPORTED" );
347 }
348
367 virtual QList<QgsRasterPyramid> buildPyramidList( const QList<int> &overviewList = QList<int>() )
368 { Q_UNUSED( overviewList ) return QList<QgsRasterPyramid>(); }
369
379 bool hasPyramids();
380
385 virtual QString htmlMetadata() = 0;
386
411 virtual QgsRasterIdentifyResult identify( const QgsPointXY &point, Qgis::RasterIdentifyFormat format, const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
412
427 virtual double sample( const QgsPointXY &point, int band,
428 bool *ok SIP_OUT = nullptr,
429 const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
430
439 virtual QString lastErrorTitle() = 0;
440
450 virtual QString lastError() = 0;
451
453 virtual QString lastErrorFormat();
454
456 int dpi() const { return mDpi; }
457
459 void setDpi( int dpi ) { mDpi = dpi; }
460
462 QDateTime timestamp() const override { return mTimestamp; }
463
465 QDateTime dataTimestamp() const override { return QDateTime(); }
466
473 virtual bool isEditable() const { return false; }
474
485 virtual bool setEditable( bool enabled ) { Q_UNUSED( enabled ) return false; }
486
487 // TODO: add data type (may be different from band type)
488
490 virtual bool write( void *data, int band, int width, int height, int xOffset, int yOffset )
491 {
492 Q_UNUSED( data )
493 Q_UNUSED( band )
494 Q_UNUSED( width )
495 Q_UNUSED( height )
496 Q_UNUSED( xOffset )
497 Q_UNUSED( yOffset )
498 return false;
499 }
500
517 bool writeBlock( QgsRasterBlock *block, int band, int xOffset = 0, int yOffset = 0 );
518
520 static QgsRasterDataProvider *create( const QString &providerKey,
521 const QString &uri,
522 const QString &format, int nBands,
523 Qgis::DataType type,
524 int width, int height, double *geoTransform,
526 const QStringList &createOptions = QStringList() );
527
533 virtual bool setNoDataValue( int bandNo, double noDataValue ) { Q_UNUSED( bandNo ) Q_UNUSED( noDataValue ); return false; }
534
536 virtual bool remove() { return false; }
537
542 static QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
543
550 {
551 QString name;
552 QString uri;
553 QString provider;
554 };
555
562 {
565 int width;
567 QString formula;
568 QList <QgsRasterDataProvider::VirtualRasterInputLayers> rInputLayers;
569
570 };
571
577 static QgsRasterDataProvider::VirtualRasterParameters decodeVirtualRasterProviderUri( const QString &uri, bool *ok = nullptr );
578
584 static QString encodeVirtualRasterProviderUri( const VirtualRasterParameters &parts );
585
591 virtual QString validateCreationOptions( const QStringList &createOptions, const QString &format )
592 { Q_UNUSED( createOptions ) Q_UNUSED( format ); return QString(); }
593
599 const QStringList &configOptions, const QString &fileFormat )
600 { Q_UNUSED( pyramidsFormat ) Q_UNUSED( configOptions ); Q_UNUSED( fileFormat ); return QString(); }
601
607 static QString identifyFormatName( Qgis::RasterIdentifyFormat format );
608
614 static Qgis::RasterIdentifyFormat identifyFormatFromName( const QString &formatName );
615
619 static QString identifyFormatLabel( Qgis::RasterIdentifyFormat format );
620
624 static Capability identifyFormatToCapability( Qgis::RasterIdentifyFormat format );
625
632
639
648 virtual QList< double > nativeResolutions() const;
649
656 virtual bool ignoreExtents() const;
657
663 {
666 };
667
680 virtual QgsPoint transformCoordinates( const QgsPoint &point, TransformType type );
681
682
689 virtual bool enableProviderResampling( bool enable ) { Q_UNUSED( enable ); return false; }
690
703 bool isProviderResamplingEnabled() const { return mProviderResamplingEnabled; }
704
710 {
711 Nearest,
712 Bilinear,
713 Cubic,
714 CubicSpline,
715 Lanczos,
716 Average,
717 Mode,
718 Gauss
719 };
720
727 virtual bool setZoomedInResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
728
733 ResamplingMethod zoomedInResamplingMethod() const { return mZoomedInResamplingMethod; }
734
741 virtual bool setZoomedOutResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
742
747 ResamplingMethod zoomedOutResamplingMethod() const { return mZoomedOutResamplingMethod; }
748
755 virtual bool setMaxOversampling( double factor ) { Q_UNUSED( factor ); return false; }
756
761 double maxOversampling() const { return mMaxOversampling; }
762
763 void readXml( const QDomElement &filterElem ) override;
764
765 void writeXml( QDomDocument &doc, QDomElement &parentElem ) const override;
766
772 QgsRasterAttributeTable *attributeTable( int bandNumber ) const;
773
782 void setAttributeTable( int bandNumber, QgsRasterAttributeTable *attributeTable SIP_TRANSFER );
783
790 void removeAttributeTable( int bandNumber );
791
799 bool writeFileBasedAttributeTable( int bandNumber, const QString &path, QString *errorMessage SIP_OUT = nullptr ) const;
800
807 bool readFileBasedAttributeTable( int bandNumber, const QString &path, QString *errorMessage SIP_OUT = nullptr );
808
819 virtual bool writeNativeAttributeTable( QString *errorMessage SIP_OUT = nullptr ); //#spellok
820
829 virtual bool readNativeAttributeTable( QString *errorMessage SIP_OUT = nullptr );
830
831
832 signals:
833
838 void statusChanged( const QString & ) const;
839
840
841 protected:
842
848 virtual bool readBlock( int bandNo, int xBlock, int yBlock, void *data ) SIP_SKIP
849 { Q_UNUSED( bandNo ) Q_UNUSED( xBlock ); Q_UNUSED( yBlock ); Q_UNUSED( data ); return false; }
850
856 virtual bool readBlock( int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback = nullptr ) SIP_SKIP
857 { Q_UNUSED( bandNo ) Q_UNUSED( viewExtent ); Q_UNUSED( width ); Q_UNUSED( height ); Q_UNUSED( data ); Q_UNUSED( feedback ); return false; }
858
860 bool userNoDataValuesContains( int bandNo, double value ) const;
861
863 void copyBaseSettings( const QgsRasterDataProvider &other );
864
869 int mDpi = -1;
870
875 //bool hasNoDataValue ( int bandNo );
876
878 QList<double> mSrcNoDataValue;
879
882
889
894 QList< QgsRasterRangeList > mUserNoDataValue;
895
897
899 bool mProviderResamplingEnabled = false;
900
902 ResamplingMethod mZoomedInResamplingMethod = ResamplingMethod::Nearest;
903
905 ResamplingMethod mZoomedOutResamplingMethod = ResamplingMethod::Nearest;
906
908 double mMaxOversampling = 2.0;
909
910 private:
911
915 std::unique_ptr< QgsRasterDataProviderTemporalCapabilities > mTemporalCapabilities;
916
917 std::map<int, std::unique_ptr<QgsRasterAttributeTable>> mAttributeTables;
918
919};
920
921Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRasterDataProvider::ProviderCapabilities )
922
923// clazy:excludeall=qstring-allocations
924
925#endif
RasterPyramidFormat
Raster pyramid formats.
Definition: qgis.h:2918
DataType
Raster data types.
Definition: qgis.h:242
RasterColorInterpretation
Raster color interpretation.
Definition: qgis.h:2849
@ 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:2948
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...
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