34#include "moc_qgsrasterdataprovider.cpp"
36#define ERR(message) QgsError(message, "Raster provider")
56 QgsDebugMsgLevel( QStringLiteral(
"bandNo = %1 width = %2 height = %3" ).arg( bandNo ).arg( width ).arg( height ), 4 );
59 auto block = std::make_unique< QgsRasterBlock >(
dataType( bandNo ), width, height );
65 if (
block->isEmpty() )
67 QgsDebugError( QStringLiteral(
"Couldn't create raster block" ) );
68 block->setError( { tr(
"Couldn't create raster block." ), QStringLiteral(
"Raster" ) } );
69 block->setValid(
false );
70 return block.release();
78 QgsDebugError( QStringLiteral(
"Extent outside provider extent" ) );
79 block->setError( { tr(
"Extent outside provider extent." ), QStringLiteral(
"Raster" ) } );
80 block->setValid(
false );
82 return block.release();
85 const double xRes = boundingBox.
width() / width;
86 const double yRes = boundingBox.
height() / height;
87 double tmpXRes, tmpYRes;
88 double providerXRes = 0;
89 double providerYRes = 0;
94 tmpXRes = std::max( providerXRes, xRes );
95 tmpYRes = std::max( providerYRes, yRes );
105 if ( tmpExtent != boundingBox ||
106 tmpXRes > xRes || tmpYRes > yRes )
110 if ( !
extent().contains( boundingBox ) )
113 block->setIsNoDataExcept( subRect );
117 const int fromRow = std::round( ( boundingBox.
yMaximum() - tmpExtent.
yMaximum() ) / yRes );
118 const int toRow = std::round( ( boundingBox.
yMaximum() - tmpExtent.
yMinimum() ) / yRes ) - 1;
119 const int fromCol = std::round( ( tmpExtent.
xMinimum() - boundingBox.
xMinimum() ) / xRes );
120 const int toCol = std::round( ( tmpExtent.
xMaximum() - boundingBox.
xMinimum() ) / xRes ) - 1;
122 QgsDebugMsgLevel( QStringLiteral(
"fromRow = %1 toRow = %2 fromCol = %3 toCol = %4" ).arg( fromRow ).arg( toRow ).arg( fromCol ).arg( toCol ), 4 );
124 if ( fromRow < 0 || fromRow >= height || toRow < 0 || toRow >= height ||
125 fromCol < 0 || fromCol >= width || toCol < 0 || toCol >= width )
128 QgsDebugError( QStringLiteral(
"Row or column limits out of range" ) );
129 block->setError( { tr(
"Row or column limits out of range" ), QStringLiteral(
"Raster" ) } );
130 block->setValid(
false );
131 return block.release();
136 if ( tmpXRes > xRes )
138 int col = std::floor( ( tmpExtent.
xMinimum() -
extent().xMinimum() ) / providerXRes );
140 col = std::ceil( ( tmpExtent.
xMaximum() -
extent().xMinimum() ) / providerXRes );
143 if ( tmpYRes > yRes )
145 int row = std::floor( (
extent().yMaximum() - tmpExtent.
yMaximum() ) / providerYRes );
147 row = std::ceil( (
extent().yMaximum() - tmpExtent.
yMinimum() ) / providerYRes );
150 const int tmpWidth = std::round( tmpExtent.
width() / tmpXRes );
151 const int tmpHeight = std::round( tmpExtent.
height() / tmpYRes );
152 tmpXRes = tmpExtent.
width() / tmpWidth;
153 tmpYRes = tmpExtent.
height() / tmpHeight;
155 QgsDebugMsgLevel( QStringLiteral(
"Reading smaller block tmpWidth = %1 height = %2" ).arg( tmpWidth ).arg( tmpHeight ), 4 );
158 auto tmpBlock = std::make_unique< QgsRasterBlock >(
dataType( bandNo ), tmpWidth, tmpHeight );
164 if ( !
readBlock( bandNo, tmpExtent, tmpWidth, tmpHeight, tmpBlock->bits(), feedback ) )
166 QgsDebugError( QStringLiteral(
"Error occurred while reading block" ) );
167 block->setError( { tr(
"Error occurred while reading block." ), QStringLiteral(
"Raster" ) } );
168 block->setValid(
false );
169 block->setIsNoData();
170 return block.release();
175 const double xMin = boundingBox.
xMinimum();
176 const double yMax = boundingBox.
yMaximum();
177 const double tmpXMin = tmpExtent.
xMinimum();
178 const double tmpYMax = tmpExtent.
yMaximum();
180 for (
int row = fromRow; row <= toRow; row++ )
182 const double y = yMax - ( row + 0.5 ) * yRes;
183 const int tmpRow = std::floor( ( tmpYMax - y ) / tmpYRes );
185 for (
int col = fromCol; col <= toCol; col++ )
187 const double x = xMin + ( col + 0.5 ) * xRes;
188 const int tmpCol = std::floor( ( x - tmpXMin ) / tmpXRes );
190 if ( tmpRow < 0 || tmpRow >= tmpHeight || tmpCol < 0 || tmpCol >= tmpWidth )
192 QgsDebugError( QStringLiteral(
"Source row or column limits out of range" ) );
193 block->setIsNoData();
194 block->setError( { tr(
"Source row or column limits out of range." ), QStringLiteral(
"Raster" ) } );
195 block->setValid(
false );
196 return block.release();
199 const qgssize tmpIndex =
static_cast< qgssize >( tmpRow ) *
static_cast< qgssize >( tmpWidth ) + tmpCol;
200 const qgssize index = row *
static_cast< qgssize >( width ) + col;
202 const char *tmpBits = tmpBlock->constBits( tmpIndex );
203 char *bits =
block->bits( index );
206 QgsDebugError( QStringLiteral(
"Cannot get input block data tmpRow = %1 tmpCol = %2 tmpIndex = %3." ).arg( tmpRow ).arg( tmpCol ).arg( tmpIndex ) );
211 QgsDebugError( QStringLiteral(
"Cannot set output block data." ) );
214 memcpy( bits, tmpBits, pixelSize );
220 if ( !
readBlock( bandNo, boundingBox, width, height,
block->bits(), feedback ) )
222 QgsDebugError( QStringLiteral(
"Error occurred while reading block" ) );
223 block->setIsNoData();
224 block->setError( { tr(
"Error occurred while reading block." ), QStringLiteral(
"Raster" ) } );
225 block->setValid(
false );
226 return block.release();
234 return block.release();
278 QMap<int, QVariant> results;
286 if ( !
extent().contains( point ) )
289 for (
int bandNo = 1; bandNo <=
bandCount(); bandNo++ )
291 results.insert( bandNo, QVariant() );
310 const double xres = ( finalExtent.
width() ) / width;
311 const double yres = ( finalExtent.
height() ) / height;
313 const int col =
static_cast< int >( std::floor( ( point.
x() - finalExtent.
xMinimum() ) / xres ) );
314 const int row =
static_cast< int >( std::floor( ( finalExtent.
yMaximum() - point.
y() ) / yres ) );
316 const double xMin = finalExtent.
xMinimum() + col * xres;
317 const double xMax = xMin + xres;
318 const double yMax = finalExtent.
yMaximum() - row * yres;
319 const double yMin = yMax - yres;
320 const QgsRectangle pixelExtent( xMin, yMin, xMax, yMax );
322 for (
int bandNumber = 1; bandNumber <=
bandCount(); bandNumber++ )
324 std::unique_ptr< QgsRasterBlock > bandBlock(
block( bandNumber, pixelExtent, 1, 1 ) );
328 const double value = bandBlock->value( 0 );
333 results.insert( bandNumber, QVariant() );
337 results.insert( bandNumber, value );
342 results.insert( bandNumber, QVariant() );
349 bool *ok,
const QgsRectangle &boundingBox,
int width,
int height,
int dpi )
357 const QVariant value = res.results().value( band );
359 if ( !value.isValid() )
360 return std::numeric_limits<double>::quiet_NaN();
365 return value.toDouble( ok );
372 return QStringLiteral(
"text/plain" );
383 setError(
QgsError( QStringLiteral(
"writeBlock() called on read-only provider." ), QStringLiteral(
"writeBlock" ) ) );
384 QgsDebugError( QStringLiteral(
"writeBlock() called on read-only provider." ) );
394 if ( methods.isEmpty() )
396 QgsDebugMsgLevel( QStringLiteral(
"provider pyramidResamplingMethods returned no methods" ), 2 );
406 return std::any_of( pyramidList.constBegin(), pyramidList.constEnd(), [](
QgsRasterPyramid pyramid ) { return pyramid.getExists(); } );
420 QgsDebugMsgLevel( QStringLiteral(
"set %1 band %1 no data ranges" ).arg( noData.size() ), 4 );
427 return stats.bandNumber == bandNo;
431 return histogram.bandNumber == bandNo;
441 return mTemporalCapabilities.get();
448 return mTemporalCapabilities.get();
455 return mElevationProperties.get();
462 return mElevationProperties.get();
467 const QString &format,
int nBands,
469 int width,
int height,
double *geoTransform,
471 const QStringList &creationOptions )
477 height, geoTransform,
crs, creationOptions );
480 QgsDebugError(
"Cannot resolve 'createRasterDataProviderFunction' function in " + providerKey +
" provider" );
494 return QStringLiteral(
"Value" );
496 return QStringLiteral(
"Text" );
498 return QStringLiteral(
"Html" );
500 return QStringLiteral(
"Feature" );
504 return QStringLiteral(
"Undefined" );
512 return tr(
"Value" );
518 return tr(
"Feature" );
522 return QStringLiteral(
"Undefined" );
527 if ( formatName == QLatin1String(
"Value" ) )
529 if ( formatName == QLatin1String(
"Text" ) )
531 if ( formatName == QLatin1String(
"Html" ) )
533 if ( formatName == QLatin1String(
"Feature" ) )
560 return QList< double >();
602 if ( mTemporalCapabilities && other.mTemporalCapabilities )
604 *mTemporalCapabilities = *other.mTemporalCapabilities;
606 if ( mElevationProperties && other.mElevationProperties )
608 *mElevationProperties = *other.mElevationProperties;
614 if ( str == QLatin1String(
"bilinear" ) )
618 else if ( str == QLatin1String(
"cubic" ) )
622 else if ( str == QLatin1String(
"cubicSpline" ) )
626 else if ( str == QLatin1String(
"lanczos" ) )
630 else if ( str == QLatin1String(
"average" ) )
634 else if ( str == QLatin1String(
"mode" ) )
638 else if ( str == QLatin1String(
"gauss" ) )
649 if ( filterElem.isNull() )
654 const QDomElement resamplingElement = filterElem.firstChildElement( QStringLiteral(
"resampling" ) );
655 if ( !resamplingElement.isNull() )
657 setMaxOversampling( resamplingElement.attribute( QStringLiteral(
"maxOversampling" ), QStringLiteral(
"2.0" ) ).toDouble() );
658 setZoomedInResamplingMethod( resamplingMethodFromString( resamplingElement.attribute( QStringLiteral(
"zoomedInResamplingMethod" ) ) ) );
659 setZoomedOutResamplingMethod( resamplingMethodFromString( resamplingElement.attribute( QStringLiteral(
"zoomedOutResamplingMethod" ) ) ) );
669 return QStringLiteral(
"nearestNeighbour" );
671 return QStringLiteral(
"bilinear" );
673 return QStringLiteral(
"cubic" );
675 return QStringLiteral(
"cubicSpline" );
677 return QStringLiteral(
"lanczos" );
679 return QStringLiteral(
"average" );
681 return QStringLiteral(
"mode" );
683 return QStringLiteral(
"gauss" );
686 return QStringLiteral(
"nearestNeighbour" );
693 QDomElement providerElement = doc.createElement( QStringLiteral(
"provider" ) );
694 parentElem.appendChild( providerElement );
696 QDomElement resamplingElement = doc.createElement( QStringLiteral(
"resampling" ) );
697 providerElement.appendChild( resamplingElement );
699 resamplingElement.setAttribute( QStringLiteral(
"enabled" ),
702 resamplingElement.setAttribute( QStringLiteral(
"zoomedInResamplingMethod" ),
705 resamplingElement.setAttribute( QStringLiteral(
"zoomedOutResamplingMethod" ),
708 resamplingElement.setAttribute( QStringLiteral(
"maxOversampling" ),
718 return mAttributeTables.at( bandNumber ).get();
720 catch ( std::out_of_range
const & )
732 mAttributeTables[ bandNumber ] = std::unique_ptr<QgsRasterAttributeTable>(
attributeTable );
744 if ( mAttributeTables.find( bandNumber ) != std::end( mAttributeTables ) )
746 mAttributeTables.erase( bandNumber );
759 *errorMessage = QObject::tr(
"Raster has no Raster Attribute Table for band %1" ).arg( bandNumber );
773 *errorMessage = QObject::tr(
"Raster data provider has no native Raster Attribute Table support." );
780 Q_UNUSED( bandNumber )
788 auto rat = std::make_unique<QgsRasterAttributeTable>();
789 if ( rat->readFromFile( path, errorMessage ) )
804 Q_UNUSED( errorMessage );
821 return tr(
"Undefined" );
827 return tr(
"Palette" );
833 return tr(
"Green" );
839 return tr(
"Alpha" );
845 return tr(
"Saturation" );
848 return tr(
"Lightness" );
854 return tr(
"Magenta" );
857 return tr(
"Yellow" );
860 return tr(
"Black" );
863 return tr(
"YCbCr_Y" );
866 return tr(
"YCbCr_Cb" );
869 return tr(
"YCbCr_Cr" );
872 return tr(
"Continuous Palette" );
875 return tr(
"Panchromatic" );
878 return tr(
"Coastal" );
881 return tr(
"Red Edge" );
884 return tr(
"Near-InfraRed (NIR)" );
887 return tr(
"Short-Wavelength InfraRed (SWIR)" );
890 return tr(
"Mid-Wavelength InfraRed (MWIR)" );
893 return tr(
"Long-Wavelength InfraRed (LWIR)" );
896 return tr(
"Thermal InfraRed (TIR)" );
899 return tr(
"Other InfraRed" );
902 return tr(
"Synthetic Aperture Radar (SAR) Ka band" );
905 return tr(
"Synthetic Aperture Radar (SAR) K band" );
908 return tr(
"Synthetic Aperture Radar (SAR) Ku band" );
911 return tr(
"Synthetic Aperture Radar (SAR) X band" );
914 return tr(
"Synthetic Aperture Radar (SAR) C band" );
917 return tr(
"Synthetic Aperture Radar (SAR) S band" );
920 return tr(
"Synthetic Aperture Radar (SAR) L band" );
923 return tr(
"Synthetic Aperture Radar (SAR) P band" );
930 QUrl url = QUrl::fromPercentEncoding(
uri.toUtf8() );
931 const QUrlQuery query( url.query() );
934 if ( ! query.hasQueryItem( QStringLiteral(
"crs" ) ) )
937 if ( ok ) *ok =
false;
940 if ( ! components.
crs.
createFromString( query.queryItemValue( QStringLiteral(
"crs" ) ) ) )
943 if ( ok ) *ok =
false;
948 if ( ! query.hasQueryItem( QStringLiteral(
"extent" ) ) )
951 if ( ok ) *ok =
false;
954 QStringList pointValuesList = query.queryItemValue( QStringLiteral(
"extent" ) ).split(
',' );
955 if ( pointValuesList.size() != 4 )
958 if ( ok ) *ok =
false;
961 components.
extent =
QgsRectangle( pointValuesList.at( 0 ).toDouble(), pointValuesList.at( 1 ).toDouble(),
962 pointValuesList.at( 2 ).toDouble(), pointValuesList.at( 3 ).toDouble() );
964 if ( ! query.hasQueryItem( QStringLiteral(
"width" ) ) )
967 if ( ok ) *ok =
false;
971 components.
width = query.queryItemValue( QStringLiteral(
"width" ) ).toInt( & flagW );
972 if ( !flagW || components.
width < 0 )
975 if ( ok ) *ok =
false;
979 if ( ! query.hasQueryItem( QStringLiteral(
"height" ) ) )
982 if ( ok ) *ok =
false;
986 components.
height = query.queryItemValue( QStringLiteral(
"height" ) ).toInt( & flagH );
987 if ( !flagH || components.
height < 0 )
990 if ( ok ) *ok =
false;
994 if ( ! query.hasQueryItem( QStringLiteral(
"formula" ) ) )
997 if ( ok ) *ok =
false;
1000 components.
formula = query.queryItemValue( QStringLiteral(
"formula" ) );
1002 for (
const auto &item : query.queryItems() )
1004 if ( !( item.first.mid( item.first.indexOf(
':' ), -1 ) == QLatin1String(
":uri" ) ) )
1010 rLayer.
name = item.first.mid( 0, item.first.indexOf(
':' ) );
1011 rLayer.
uri = query.queryItemValue( item.first );
1012 rLayer.
provider = query.queryItemValue( item.first.mid( 0, item.first.indexOf(
':' ) ) + QStringLiteral(
":provider" ) );
1014 if ( rLayer.
uri.isNull() || rLayer.
provider.isNull() )
1016 QgsDebugError(
"One or more raster information are missing" );
1017 if ( ok ) *ok =
false;
1025 if ( ok ) *ok =
true;
1036 query.addQueryItem( QStringLiteral(
"crs" ), parts.
crs.
authid() );
1044 query.addQueryItem( QStringLiteral(
"extent" ), rect );
1047 query.addQueryItem( QStringLiteral(
"width" ), QString::number( parts.
width ) );
1049 query.addQueryItem( QStringLiteral(
"height" ), QString::number( parts.
height ) );
1051 query.addQueryItem( QStringLiteral(
"formula" ), parts.
formula );
1057 query.addQueryItem( it.name + QStringLiteral(
":uri" ), it.uri );
1058 query.addQueryItem( it.name + QStringLiteral(
":provider" ), it.provider );
1061 uri.setQuery( query );
1062 return QString( QUrl::toPercentEncoding(
uri.toEncoded() ) );
Provides global constants and enumerations for use throughout the application.
QFlags< RasterProviderCapability > RasterProviderCapabilities
Raster data provider capabilities.
@ NoProviderCapabilities
Provider has no capabilities.
RasterResamplingMethod
Resampling method for raster provider-level resampling.
@ Lanczos
Lanczos windowed sinc interpolation (6x6 kernel).
@ Nearest
Nearest-neighbour resampling.
@ Mode
Mode (selects the value which appears most often of all the sampled points).
@ Bilinear
Bilinear (2x2 kernel) resampling.
@ Average
Average resampling.
@ CubicSpline
Cubic B-Spline Approximation (4x4 kernel).
@ Cubic
Cubic Convolution Approximation (4x4 kernel) resampling.
RasterInterfaceCapability
Raster interface capabilities.
@ NoCapabilities
No capabilities.
@ Size
Original data source size (and thus resolution) is known, it is not always available,...
@ IdentifyValue
Numerical values.
@ IdentifyFeature
WMS GML -> feature.
QFlags< DataProviderReadFlag > DataProviderReadFlags
Flags which control data provider construction.
DataType
Raster data types.
RasterColorInterpretation
Raster color interpretation.
@ NIRBand
Near-InfraRed (NIR) band [0.75 - 1.40 um].
@ GreenBand
Green band of RGBA image, or green spectral band [0.51 - 0.60 um].
@ SAR_K_Band
Synthetic Aperture Radar (SAR) K band [1.1 - 1.7 cm / 18 - 27 GHz].
@ SAR_L_Band
Synthetic Aperture Radar (SAR) L band [15 - 30 cm / 1 - 2 GHz].
@ SaturationBand
Saturation band of HLS image.
@ MagentaBand
Magenta band of CMYK image.
@ BlackBand
Black band of CMLY image.
@ AlphaBand
Alpha (0=transparent, 255=opaque).
@ SWIRBand
Short-Wavelength InfraRed (SWIR) band [1.40 - 3.00 um].
@ SAR_X_Band
Synthetic Aperture Radar (SAR) X band [2.4 - 3.8 cm / 8 - 12 GHz].
@ BlueBand
Blue band of RGBA image, or blue spectral band [0.45 - 0.53 um].
@ LWIRBand
Long-Wavelength InfraRed (LWIR) band [8.00 - 15 um].
@ RedEdgeBand
Red-edge band [0.69 - 0.79 um].
@ SAR_Ku_Band
Synthetic Aperture Radar (SAR) Ku band [1.7 - 2.4 cm / 12 - 18 GHz].
@ YellowBand
Yellow band of CMYK image, or yellow spectral band [0.58 - 0.62 um].
@ CyanBand
Cyan band of CMYK image.
@ SAR_C_Band
Synthetic Aperture Radar (SAR) C band [3.8 - 7.5 cm / 4 - 8 GHz].
@ LightnessBand
Lightness band of HLS image.
@ CoastalBand
Coastal band [0.40 - 0.45 um].
@ YCbCr_YBand
Y Luminance.
@ HueBand
Hue band of HLS image.
@ MWIRBand
Mid-Wavelength InfraRed (MWIR) band [3.00 - 8.00 um].
@ PaletteIndex
Paletted (see associated color table).
@ TIRBand
Thermal InfraRed (TIR) band (MWIR or LWIR) [3 - 15 um].
@ SAR_Ka_Band
Synthetic Aperture Radar (SAR) Ka band [0.8 - 1.1 cm / 27 - 40 GHz].
@ SAR_S_Band
Synthetic Aperture Radar (SAR) S band [7.5 - 15 cm / 2 - 4 GHz].
@ SAR_P_Band
Synthetic Aperture Radar (SAR) P band [30 - 100 cm / 0.3 - 1 GHz].
@ RedBand
Red band of RGBA image, or red spectral band [0.62 - 0.69 um].
@ PanBand
Panchromatic band [0.40 - 1.00 um].
@ ContinuousPalette
Continuous palette, QGIS addition, GRASS.
@ OtherIRBand
Other infrared band [0.75 - 1000 um].
RasterIdentifyFormat
Raster identify formats.
@ Feature
WMS GML/JSON -> feature.
@ Value
Numerical pixel value.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
bool createFromString(const QString &definition)
Set up this CRS from a string definition.
void setError(const QgsError &error)
Sets error message.
virtual Qgis::DataProviderFlags flags() const
Returns the generic data provider flags.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
QgsDataProvider(const QString &uri=QString(), const QgsDataProvider::ProviderOptions &providerOptions=QgsDataProvider::ProviderOptions(), Qgis::DataProviderReadFlags flags=Qgis::DataProviderReadFlags())
Create a new dataprovider with the specified in the uri.
QgsDataSourceUri uri() const
Gets the data source specification.
A container for error messages.
Point geometry type, with support for z-dimension and m-values.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
QgsRasterDataProvider * createRasterDataProvider(const QString &providerKey, const QString &uri, const QString &format, int nBands, Qgis::DataType type, int width, int height, double *geoTransform, const QgsCoordinateReferenceSystem &crs, const QStringList &createOptions=QStringList())
Creates new instance of raster data provider.
QList< QPair< QString, QString > > pyramidResamplingMethods(const QString &providerKey)
Returns list of raster pyramid resampling methods.
Represents a Raster Attribute Table (RAT).
bool writeToFile(const QString &path, QString *errorMessage=nullptr)
Writes the Raster Attribute Table to a DBF file specified by path, optionally reporting any error in ...
The RasterBandStats struct is a container for statistics about a single raster band.
Feedback object tailored for raster block reading.
static QRect subRect(const QgsRectangle &extent, int width, int height, const QgsRectangle &subExtent)
For extent and width, height find rectangle covered by subextent.
Handles elevation related properties for a raster data provider.
Implementation of data provider temporal properties for QgsRasterDataProviders.
double mMaxOversampling
Maximum boundary for oversampling (to avoid too much data traffic). Default: 2.0.
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.
bool writeFileBasedAttributeTable(int bandNumber, const QString &path, QString *errorMessage=nullptr) const
Writes the filesystem-based attribute table for the specified bandNumber to path, optionally reportin...
static Qgis::RasterInterfaceCapability identifyFormatToCapability(Qgis::RasterIdentifyFormat format)
Converts a raster identify format to a capability.
virtual bool sourceHasNoDataValue(int bandNo) const
Returns true if source band has no data value.
static QString encodeVirtualRasterProviderUri(const VirtualRasterParameters &parts)
Encodes the URI starting from the struct .
virtual double bandOffset(int bandNo) const
Read band offset for raster value.
virtual QString lastErrorFormat()
Returns the format of the error text for the last error in this provider.
bool mProviderResamplingEnabled
Whether provider resampling is enabled.
virtual bool writeNativeAttributeTable(QString *errorMessage=nullptr)
Writes the native attribute table, optionally reporting any error in errorMessage,...
virtual bool useSourceNoDataValue(int bandNo) const
Returns the source nodata value usage.
bool readFileBasedAttributeTable(int bandNumber, const QString &path, QString *errorMessage=nullptr)
Loads the filesystem-based attribute table for the specified bandNumber from path,...
static QgsRasterDataProvider::VirtualRasterParameters decodeVirtualRasterProviderUri(const QString &uri, bool *ok=nullptr)
Decodes the URI returning a struct with all the parameters for QgsVirtualRasterProvider class.
virtual void setUseSourceNoDataValue(int bandNo, bool use)
Sets the source nodata value usage.
QgsRasterAttributeTable * attributeTable(int bandNumber) const
Returns the (possibly nullptr) attribute table for the specified bandNumber.
virtual bool setZoomedInResamplingMethod(Qgis::RasterResamplingMethod method)
Set resampling method to apply for zoomed-in operations.
void setAttributeTable(int bandNumber, QgsRasterAttributeTable *attributeTable)
Set the attribute table to attributeTable for the specified bandNumber, if the attributeTable is null...
virtual double sourceNoDataValue(int bandNo) const
Value representing no data value.
void readXml(const QDomElement &filterElem) override
Sets base class members from xml. Usually called from create() methods of subclasses.
QList< QgsRasterRangeList > mUserNoDataValue
List of lists of user defined additional no data values for each band, indexed from 0.
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 readNativeAttributeTable(QString *errorMessage=nullptr)
Reads the native attribute table, optionally reporting any error in errorMessage, returns true on suc...
void copyBaseSettings(const QgsRasterDataProvider &other)
Copy member variables from other raster data provider. Useful for implementation of clone() method in...
bool userNoDataValuesContains(int bandNo, double value) const
Returns true if user no data contains value.
virtual bool setZoomedOutResamplingMethod(Qgis::RasterResamplingMethod method)
Set resampling method to apply for zoomed-out operations.
Qgis::RasterResamplingMethod mZoomedInResamplingMethod
Resampling method for zoomed in pixel extraction.
bool writeBlock(QgsRasterBlock *block, int band, int xOffset=0, int yOffset=0)
Writes pixel data from a raster block into the provider data source.
virtual bool enableProviderResampling(bool enable)
Enable or disable provider-level resampling.
QgsRectangle extent() const override=0
Returns the extent of the layer.
virtual bool ignoreExtents() const
Returns true if the extents reported by the data provider are not reliable and it's possible that the...
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.
QgsRasterDataProviderElevationProperties * elevationProperties() override
Returns the provider's elevation properties.
bool hasPyramids()
Returns true if raster has at least one existing pyramid.
virtual QgsRasterIdentifyResult identify(const QgsPointXY &point, Qgis::RasterIdentifyFormat format, const QgsRectangle &boundingBox=QgsRectangle(), int width=0, int height=0, int dpi=96)
Identify raster value(s) found on the point position.
virtual double bandScale(int bandNo) const
Read band scale for raster value.
int dpi() const
Returns the dpi of the output device.
virtual Qgis::RasterColorInterpretation colorInterpretation(int bandNo) const
Returns data type for the band specified by number.
virtual double sample(const QgsPointXY &point, int band, bool *ok=nullptr, const QgsRectangle &boundingBox=QgsRectangle(), int width=0, int height=0, int dpi=96)
Samples a raster value from the specified band found at the point position.
QgsRasterBlock * block(int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback=nullptr) override
Read block of data using given extent and size.
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 Qgis::RasterProviderCapabilities providerCapabilities() const
Returns flags containing the supported capabilities of the data provider.
QList< bool > mSrcHasNoDataValue
Source no data value exists.
void removeAttributeTable(int bandNumber)
Remove the attribute table for the specified bandNumber.
Qgis::RasterResamplingMethod mZoomedOutResamplingMethod
Resampling method for zoomed out pixel extraction.
static QgsRasterDataProvider * create(const QString &providerKey, const QString &uri, const QString &format, int nBands, Qgis::DataType type, int width, int height, double *geoTransform, const QgsCoordinateReferenceSystem &crs, const QStringList &createOptions=QStringList())
Creates a new dataset with mDataSourceURI.
virtual QgsRasterRangeList userNoDataValues(int bandNo) const
Returns a list of user no data value ranges.
static QList< QPair< QString, QString > > pyramidResamplingMethods(const QString &providerKey)
Returns a list of pyramid resampling method name and label pairs for given provider.
void writeXml(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml.
virtual QList< double > nativeResolutions() const
Returns a list of native resolutions if available, i.e.
virtual QgsPoint transformCoordinates(const QgsPoint &point, TransformType type)
Transforms coordinates between source image coordinate space [0..width]x[0..height] and layer coordin...
static QString identifyFormatName(Qgis::RasterIdentifyFormat format)
Converts a raster identify format to a string name.
QgsRasterDataProviderTemporalCapabilities * temporalCapabilities() override
Returns the provider's temporal capabilities.
QString colorInterpretationName(int bandNo) const override
Returns the name of the color interpretation for the specified bandNumber.
virtual QString bandDescription(int bandNumber)
Returns the description for band bandNumber, or an empty string if the band is not valid or has not d...
static Qgis::RasterIdentifyFormat identifyFormatFromName(const QString &formatName)
Converts a string formatName to a raster identify format.
static QString identifyFormatLabel(Qgis::RasterIdentifyFormat format)
Converts a raster identify format to a translated string label.
virtual void setUserNoDataValue(int bandNo, const QgsRasterRangeList &noData)
virtual QList< QgsRasterPyramid > buildPyramidList(const QList< int > &overviewList=QList< int >())
Returns the raster layers pyramid list.
A container for a histogram of a single raster band.
Raster identify results container.
virtual Qgis::RasterInterfaceCapabilities capabilities() const
Returns the capabilities supported by the interface.
QList< QgsRasterBandStats > mStatistics
List of cached statistics, all bands mixed.
virtual int xSize() const
Gets raster size.
QgsRasterInterface(QgsRasterInterface *input=nullptr)
virtual int bandCount() const =0
Gets number of bands.
int dataTypeSize(int bandNo) const
Returns the size (in bytes) for the data type for the specified band.
virtual int ySize() const
QList< QgsRasterHistogram > mHistograms
List of cached histograms, all bands mixed.
virtual QgsRasterHistogram histogram(int bandNo, int binCount=0, double minimum=std::numeric_limits< double >::quiet_NaN(), double maximum=std::numeric_limits< double >::quiet_NaN(), const QgsRectangle &extent=QgsRectangle(), int sampleSize=0, bool includeOutOfRange=false, QgsRasterBlockFeedback *feedback=nullptr)
Returns a band histogram.
This struct is used to store pyramid info for the raster layer.
bool contains(double value) const
Returns true if this range contains the specified value.
A rectangle specified with double values.
Q_INVOKABLE QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be truncated to the sp...
void setYMinimum(double y)
Set the minimum y value.
void setXMinimum(double x)
Set the minimum x value.
void setYMaximum(double y)
Set the maximum y value.
void setXMaximum(double x)
Set the maximum x value.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QList< QgsRasterRange > QgsRasterRangeList
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS
Setting options for creating vector data providers.
Struct that stores the information about the parameters that should be given to the QgsVirtualRasterP...
QList< QgsRasterDataProvider::VirtualRasterInputLayers > rInputLayers
QgsCoordinateReferenceSystem crs