QGIS API Documentation 3.39.0-Master (d85f3c2a281)
Loading...
Searching...
No Matches
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
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
95
104 QgsRasterDataProvider( const QString &uri,
107
108 QgsRasterDataProvider *clone() const override = 0;
109
113 virtual Qgis::RasterProviderCapabilities providerCapabilities() const;
114
115 // It makes no sense to set input on provider
116 bool setInput( QgsRasterInterface *input ) override { Q_UNUSED( input ) return false; }
117
118 QgsRectangle extent() const override = 0;
119
121 Qgis::DataType dataType( int bandNo ) const override = 0;
122
128 virtual QgsFields fields() const { return QgsFields(); };
129
134 Qgis::DataType sourceDataType( int bandNo ) const override = 0;
135
137 virtual Qgis::RasterColorInterpretation colorInterpretation( int bandNo ) const;
138
142 QString colorName( Qgis::RasterColorInterpretation colorInterpretation ) const
143 {
144 // Modified copy from GDAL
145 switch ( colorInterpretation )
146 {
148 return QStringLiteral( "Undefined" );
149
151 return QStringLiteral( "Gray" );
152
154 return QStringLiteral( "Palette" );
155
157 return QStringLiteral( "Red" );
158
160 return QStringLiteral( "Green" );
161
163 return QStringLiteral( "Blue" );
164
166 return QStringLiteral( "Alpha" );
167
169 return QStringLiteral( "Hue" );
170
172 return QStringLiteral( "Saturation" );
173
175 return QStringLiteral( "Lightness" );
176
178 return QStringLiteral( "Cyan" );
179
181 return QStringLiteral( "Magenta" );
182
184 return QStringLiteral( "Yellow" );
185
187 return QStringLiteral( "Black" );
188
190 return QStringLiteral( "YCbCr_Y" );
191
193 return QStringLiteral( "YCbCr_Cb" );
194
196 return QStringLiteral( "YCbCr_Cr" );
197
199 return QStringLiteral( "Continuous Palette" );
200 }
201 return QString();
202 }
203
205 virtual bool reload() { return true; }
206
207 QString colorInterpretationName( int bandNo ) const override;
208
212 virtual double bandScale( int bandNo ) const { Q_UNUSED( bandNo ) return 1.0; }
213
217 virtual double bandOffset( int bandNo ) const { Q_UNUSED( bandNo ) return 0.0; }
218
219 // TODO: remove or make protected all readBlock working with void*
220
222 QgsRasterBlock *block( int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) override SIP_FACTORY;
223
225 virtual bool sourceHasNoDataValue( int bandNo ) const { return mSrcHasNoDataValue.value( bandNo - 1 ); }
226
228 virtual bool useSourceNoDataValue( int bandNo ) const { return mUseSrcNoDataValue.value( bandNo - 1 ); }
229
231 virtual void setUseSourceNoDataValue( int bandNo, bool use );
232
234 virtual double sourceNoDataValue( int bandNo ) const { return mSrcNoDataValue.value( bandNo - 1 ); }
235
236 virtual void setUserNoDataValue( int bandNo, const QgsRasterRangeList &noData );
237
239 virtual QgsRasterRangeList userNoDataValues( int bandNo ) const { return mUserNoDataValue.value( bandNo - 1 ); }
240
241 virtual QList<QgsColorRampShader::ColorRampItem> colorTable( int bandNo ) const
242 { Q_UNUSED( bandNo ) return QList<QgsColorRampShader::ColorRampItem>(); }
243
248 QStringList subLayers() const override
249 {
250 return QStringList();
251 }
252
253 QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() override;
254 const QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() const override SIP_SKIP;
255 QgsRasterDataProviderElevationProperties *elevationProperties() override;
256 const QgsRasterDataProviderElevationProperties *elevationProperties() const override SIP_SKIP;
257
259 virtual bool supportsLegendGraphic() const { return false; }
260
272 virtual QImage getLegendGraphic( double scale = 0, bool forceRefresh = false, const QgsRectangle *visibleExtent = nullptr ) SIP_SKIP
273 {
274 Q_UNUSED( scale )
275 Q_UNUSED( forceRefresh )
276 Q_UNUSED( visibleExtent )
277 return QImage();
278 }
279
293 {
294 Q_UNUSED( mapSettings )
295 return nullptr;
296 }
297
314 virtual QString buildPyramids( const QList<QgsRasterPyramid> &pyramidList,
315 const QString &resamplingMethod = "NEAREST",
317 const QStringList &configOptions = QStringList(),
318 QgsRasterBlockFeedback *feedback = nullptr )
319 {
320 Q_UNUSED( pyramidList )
321 Q_UNUSED( resamplingMethod )
322 Q_UNUSED( format )
323 Q_UNUSED( configOptions )
324 Q_UNUSED( feedback )
325 return QStringLiteral( "FAILED_NOT_SUPPORTED" );
326 }
327
346 virtual QList<QgsRasterPyramid> buildPyramidList( const QList<int> &overviewList = QList<int>() )
347 { Q_UNUSED( overviewList ) return QList<QgsRasterPyramid>(); }
348
358 bool hasPyramids();
359
384 virtual QgsRasterIdentifyResult identify( const QgsPointXY &point, Qgis::RasterIdentifyFormat format, const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
385
400 virtual double sample( const QgsPointXY &point, int band,
401 bool *ok SIP_OUT = nullptr,
402 const QgsRectangle &boundingBox = QgsRectangle(), int width = 0, int height = 0, int dpi = 96 );
403
412 virtual QString lastErrorTitle() = 0;
413
423 virtual QString lastError() = 0;
424
426 virtual QString lastErrorFormat();
427
429 int dpi() const { return mDpi; }
430
432 void setDpi( int dpi ) { mDpi = dpi; }
433
435 QDateTime timestamp() const override { return mTimestamp; }
436
438 QDateTime dataTimestamp() const override { return QDateTime(); }
439
446 virtual bool isEditable() const { return false; }
447
458 virtual bool setEditable( bool enabled ) { Q_UNUSED( enabled ) return false; }
459
460 // TODO: add data type (may be different from band type)
461
463 virtual bool write( const void *data, int band, int width, int height, int xOffset, int yOffset )
464 {
465 Q_UNUSED( data )
466 Q_UNUSED( band )
467 Q_UNUSED( width )
468 Q_UNUSED( height )
469 Q_UNUSED( xOffset )
470 Q_UNUSED( yOffset )
471 return false;
472 }
473
490 bool writeBlock( QgsRasterBlock *block, int band, int xOffset = 0, int yOffset = 0 );
491
493 static QgsRasterDataProvider *create( const QString &providerKey,
494 const QString &uri,
495 const QString &format, int nBands,
496 Qgis::DataType type,
497 int width, int height, double *geoTransform,
499 const QStringList &createOptions = QStringList() );
500
506 virtual bool setNoDataValue( int bandNo, double noDataValue ) { Q_UNUSED( bandNo ) Q_UNUSED( noDataValue ); return false; }
507
509 virtual bool remove() { return false; }
510
515 static QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
516
523 {
524 QString name;
525 QString uri;
526 QString provider;
527 };
528
535 {
538 int width;
540 QString formula;
541 QList <QgsRasterDataProvider::VirtualRasterInputLayers> rInputLayers;
542
543 };
544
550 static QgsRasterDataProvider::VirtualRasterParameters decodeVirtualRasterProviderUri( const QString &uri, bool *ok = nullptr );
551
557 static QString encodeVirtualRasterProviderUri( const VirtualRasterParameters &parts );
558
564 virtual QString validateCreationOptions( const QStringList &createOptions, const QString &format )
565 { Q_UNUSED( createOptions ) Q_UNUSED( format ); return QString(); }
566
572 const QStringList &configOptions, const QString &fileFormat )
573 { Q_UNUSED( pyramidsFormat ) Q_UNUSED( configOptions ); Q_UNUSED( fileFormat ); return QString(); }
574
580 static QString identifyFormatName( Qgis::RasterIdentifyFormat format );
581
587 static Qgis::RasterIdentifyFormat identifyFormatFromName( const QString &formatName );
588
592 static QString identifyFormatLabel( Qgis::RasterIdentifyFormat format );
593
597 static Qgis::RasterInterfaceCapability identifyFormatToCapability( Qgis::RasterIdentifyFormat format );
598
604
610
619 virtual QList< double > nativeResolutions() const;
620
627 virtual bool ignoreExtents() const;
628
638
651 virtual QgsPoint transformCoordinates( const QgsPoint &point, TransformType type );
652
653
660 virtual bool enableProviderResampling( bool enable ) { Q_UNUSED( enable ); return false; }
661
674 bool isProviderResamplingEnabled() const { return mProviderResamplingEnabled; }
675
681 {
682 Nearest,
683 Bilinear,
684 Cubic,
685 CubicSpline,
686 Lanczos,
687 Average,
688 Mode,
689 Gauss
690 };
691
698 virtual bool setZoomedInResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
699
704 ResamplingMethod zoomedInResamplingMethod() const { return mZoomedInResamplingMethod; }
705
712 virtual bool setZoomedOutResamplingMethod( ResamplingMethod method ) { Q_UNUSED( method ); return false; }
713
718 ResamplingMethod zoomedOutResamplingMethod() const { return mZoomedOutResamplingMethod; }
719
726 virtual bool setMaxOversampling( double factor ) { Q_UNUSED( factor ); return false; }
727
732 double maxOversampling() const { return mMaxOversampling; }
733
734 void readXml( const QDomElement &filterElem ) override;
735
736 void writeXml( QDomDocument &doc, QDomElement &parentElem ) const override;
737
743 QgsRasterAttributeTable *attributeTable( int bandNumber ) const;
744
753 void setAttributeTable( int bandNumber, QgsRasterAttributeTable *attributeTable SIP_TRANSFER );
754
761 void removeAttributeTable( int bandNumber );
762
770 bool writeFileBasedAttributeTable( int bandNumber, const QString &path, QString *errorMessage SIP_OUT = nullptr ) const;
771
778 bool readFileBasedAttributeTable( int bandNumber, const QString &path, QString *errorMessage SIP_OUT = nullptr );
779
790 virtual bool writeNativeAttributeTable( QString *errorMessage SIP_OUT = nullptr ); //#spellok
791
800 virtual bool readNativeAttributeTable( QString *errorMessage SIP_OUT = nullptr );
801
807 // Note: This method is not const because GDAL init on demand
808 virtual QString bandDescription( int bandNumber );
809
810
811 signals:
812
816 void statusChanged( const QString & ) const;
817
818
819 protected:
820
826 virtual bool readBlock( int bandNo, int xBlock, int yBlock, void *data ) SIP_SKIP
827 { Q_UNUSED( bandNo ) Q_UNUSED( xBlock ); Q_UNUSED( yBlock ); Q_UNUSED( data ); return false; }
828
834 virtual bool readBlock( int bandNo, QgsRectangle const &viewExtent, int width, int height, void *data, QgsRasterBlockFeedback *feedback = nullptr ) SIP_SKIP
835 { Q_UNUSED( bandNo ) Q_UNUSED( viewExtent ); Q_UNUSED( width ); Q_UNUSED( height ); Q_UNUSED( data ); Q_UNUSED( feedback ); return false; }
836
838 bool userNoDataValuesContains( int bandNo, double value ) const;
839
841 void copyBaseSettings( const QgsRasterDataProvider &other );
842
847 int mDpi = -1;
848
853 //bool hasNoDataValue ( int bandNo );
854
856 QList<double> mSrcNoDataValue;
857
860
867
872 QList< QgsRasterRangeList > mUserNoDataValue;
873
875
877 bool mProviderResamplingEnabled = false;
878
880 ResamplingMethod mZoomedInResamplingMethod = ResamplingMethod::Nearest;
881
883 ResamplingMethod mZoomedOutResamplingMethod = ResamplingMethod::Nearest;
884
886 double mMaxOversampling = 2.0;
887
888 private:
889
893 std::unique_ptr< QgsRasterDataProviderTemporalCapabilities > mTemporalCapabilities;
894
895 std::unique_ptr< QgsRasterDataProviderElevationProperties > mElevationProperties;
896
897 std::map<int, std::unique_ptr<QgsRasterAttributeTable>> mAttributeTables;
898
899};
900
901// clazy:excludeall=qstring-allocations
902
903#endif
QFlags< RasterProviderCapability > RasterProviderCapabilities
Raster data provider capabilities.
Definition qgis.h:4518
RasterPyramidFormat
Raster pyramid formats.
Definition qgis.h:4414
@ GeoTiff
Geotiff .ovr (external)
RasterInterfaceCapability
Raster interface capabilities.
Definition qgis.h:4465
QFlags< DataProviderReadFlag > DataProviderReadFlags
Flags which control data provider construction.
Definition qgis.h:450
DataType
Raster data types.
Definition qgis.h:351
RasterColorInterpretation
Raster color interpretation.
Definition qgis.h:4345
@ 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:4444
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:46
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:60
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.
double value(int row, int column) const
Read a single value if type of block is numeric.
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...
virtual bool write(const void *data, int band, int width, int height, int xOffset, int yOffset)
Writes into the provider datasource.
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.
int dpi() const
Returns the dpi of the output device.
QDateTime dataTimestamp() const override
Current time stamp of data source.
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 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.
#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
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