41using namespace Qt::StringLiterals;
52 =
new QgsSettingsEntryDouble( u
"default-standard-deviation"_s,
QgsSettingsTree::sTreeRaster, 2.0, u
"Default standard deviation multiplier used to compute min/max values for raster contrast enhancement when \"use-standard-deviation\" is enabled."_s );
85 mEntries.insert( entry.
name, entry );
86 mSortedEntries.append( entry.
name );
91 if ( !mEntries.contains( rendererName ) )
95 mEntries[rendererName].widgetCreateFunction = func;
100 const QHash< QString, QgsRasterRendererRegistryEntry >::const_iterator it = mEntries.find( rendererName );
101 if ( it == mEntries.constEnd() )
111 return mSortedEntries;
116 QList< QgsRasterRendererRegistryEntry > result;
118 QHash< QString, QgsRasterRendererRegistryEntry >::const_iterator it = mEntries.constBegin();
119 for ( ; it != mEntries.constEnd(); ++it )
121 result.push_back( it.value() );
128 const QHash< QString, QgsRasterRendererRegistryEntry >::const_iterator it = mEntries.constFind( rendererName );
129 if ( it != mEntries.constEnd() )
131 return it.value().capabilities;
138 if ( !provider || provider->
bandCount() < 1 )
143 std::unique_ptr< QgsRasterRenderer > renderer;
144 switch ( drawingStyle )
148 const int grayBand = 1;
152 if ( attributeTable && attributeTable->
hasColor() )
154 std::unique_ptr<QgsColorRamp> ramp;
156 if ( !classes.empty() )
158 renderer = std::make_unique< QgsPalettedRasterRenderer >( provider, grayBand, classes );
166 if ( !classes.empty() )
175 const int fieldValueIndex = attributeTable->
fields().indexOf( minMaxFld );
176 const int fieldNameIndex = attributeTable->
fields().indexOf( nameFld );
177 QMap<double, QString> ratLabelsMap;
178 const QList<QList<QVariant>> constRatData = attributeTable->
data();
179 for (
const auto &row : constRatData )
181 const double fieldValue = row.value( fieldValueIndex ).toDouble();
182 const QString fieldName = row.value( fieldNameIndex ).toString();
183 ratLabelsMap.insert( fieldValue, fieldName );
186 for ( qsizetype i = 0; i < classes.size(); ++i )
189 if ( ratLabelsMap.contains( classData.
value ) )
191 classData.
label = ratLabelsMap.value( classData.
value );
195 renderer = std::make_unique< QgsPalettedRasterRenderer >( provider, grayBand, classes );
202 renderer = std::make_unique< QgsSingleBandGrayRenderer >( provider, grayBand );
207 qgis::down_cast< QgsSingleBandGrayRenderer * >( renderer.get() )->setContrastEnhancement( ce );
215 const int grayBand = 1;
218 QString ratErrorMessage;
221 renderer = rat->createRenderer( provider, grayBand );
224 if ( !ratErrorMessage.isEmpty() )
226 QgsDebugMsgLevel( u
"Invalid RAT from band 1, RAT was not used to create the renderer: %1."_s.arg( ratErrorMessage ), 2 );
231 renderer = std::make_unique< QgsSingleBandGrayRenderer >( provider, grayBand );
236 qgis::down_cast< QgsSingleBandGrayRenderer * >( renderer.get() )->setContrastEnhancement( ce );
243 const int bandNo = 1;
247 minMaxValuesForBand( bandNo, provider, minValue, maxValue );
249 renderer = std::make_unique< QgsSingleBandPseudoColorRenderer >( provider, bandNo, shader );
255 if ( redBand < 0 || redBand > provider->
bandCount() )
260 if ( greenBand < 0 || greenBand > provider->
bandCount() )
265 if ( blueBand < 0 || blueBand > provider->
bandCount() )
270 renderer = std::make_unique< QgsMultiBandColorRenderer >( provider, redBand, greenBand, blueBand );
275 renderer = std::make_unique< QgsSingleBandColorDataRenderer >( provider, 1 );
282 auto tr = std::make_unique< QgsRasterTransparency >();
283 const int bandCount = renderer->usesBands().size();
284 if ( bandCount == 1 )
286 tr->setTransparentSingleValuePixelList( {} );
288 else if ( bandCount == 3 )
290 tr->setTransparentThreeValuePixelList( {} );
292 renderer->setRasterTransparency( tr.release() );
296bool QgsRasterRendererRegistry::minMaxValuesForBand(
int band,
QgsRasterDataProvider *provider,
double &minValue,
double &maxValue )
const
311 const double diff = stdDevFactor * stats.
stdDev;
312 minValue = stats.
mean - diff;
313 maxValue = stats.
mean + diff;
RasterDrawingStyle
Raster drawing styles.
@ SingleBandGray
A single band image drawn as a range of gray colors.
@ MultiBandSingleBandGray
A layer containing 2 or more bands, but a single band drawn as a range of gray colors.
@ SingleBandColorData
ARGB values rendered directly.
@ MultiBandColor
A layer containing 2 or more bands, mapped to RGB color space. In the case of a multiband with only t...
@ PalettedColor
A "Palette" image drawn using color table.
@ SingleBandPseudoColor
A single band image drawn using a pseudocolor algorithm.
QFlags< RasterRendererCapability > RasterRendererCapabilities
Raster renderer capabilities.
@ StdDev
Standard deviation.
DataType
Raster data types.
@ MinMax
Field usage MinMax.
@ UsesMultipleBands
The renderer utilizes multiple raster bands for color data (note that alpha bands are not considered ...
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Handles contrast enhancement and clipping.
static std::unique_ptr< QgsRasterRenderer > create(const QDomElement &elem, QgsRasterInterface *input)
Factory method to create a new renderer.
static std::unique_ptr< QgsRasterRenderer > create(const QDomElement &elem, QgsRasterInterface *input)
static QgsPalettedRasterRenderer::MultiValueClassData rasterAttributeTableToClassData(const QgsRasterAttributeTable *attributeTable, int classificationColumn=-1, QgsColorRamp *ramp=nullptr)
Reads and returns classes from the Raster Attribute Table attributeTable, optionally classifying the ...
QList< QgsPalettedRasterRenderer::Class > ClassData
Map of value to class properties.
QList< QgsPalettedRasterRenderer::MultiValueClass > MultiValueClassData
Map of multi value to class properties.
static QgsPalettedRasterRenderer::ClassData colorTableToClassData(const QList< QgsColorRampShader::ColorRampItem > &table)
Converts a raster color table to paletted renderer class data.
static std::unique_ptr< QgsRasterRenderer > create(const QDomElement &elem, QgsRasterInterface *input)
The Field class represents a Raster Attribute Table field, including its name, usage and type.
Represents a Raster Attribute Table (RAT).
bool hasColor() const
Returns true if the Raster Attribute Table has color RGBA information.
QList< QgsRasterAttributeTable::Field > fields() const
Returns the Raster Attribute Table fields.
const QList< QgsRasterAttributeTable::Field > fieldsByUsage(const Qgis::RasterAttributeTableFieldUsage fieldUsage) const
Returns the list of fields matching fieldUsage.
bool isValid(QString *errorMessage=nullptr) const
Returns true if the Raster Attribute Table is valid, optionally reporting validity checks results in ...
const QList< QList< QVariant > > data() const
Returns the Raster Attribute Table rows.
double mean
The mean cell value for the band. NO_DATA values are excluded.
double stdDev
The standard deviation of the cell values.
double minimumValue
The minimum cell value in the raster band.
double maximumValue
The maximum cell value in the raster band.
static std::unique_ptr< QgsRasterRenderer > create(const QDomElement &elem, QgsRasterInterface *input)
Creates an instance of the renderer based on definition from XML (used by renderer registry).
Base class for raster data providers.
QgsRasterAttributeTable * attributeTable(int bandNumber) const
Returns the (possibly nullptr) attribute table for the specified bandNumber.
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
virtual QList< QgsColorRampShader::ColorRampItem > colorTable(int bandNo) const
Q_DECL_DEPRECATED QgsRasterBandStats bandStatistics(int bandNo, int stats, const QgsRectangle &extent=QgsRectangle(), int sampleSize=0, QgsRasterBlockFeedback *feedback=nullptr)
Returns the band statistics.
virtual int bandCount() const =0
Gets number of bands.
static const QgsSettingsEntryInteger * settingsDefaultGreenBand
void insertWidgetFunction(const QString &rendererName, QgsRasterRendererWidgetCreateFunc func)
Sets the widget creation function for a renderer.
QgsRasterRendererRegistry()
Constructor for QgsRasterRendererRegistry.
QList< QgsRasterRendererRegistryEntry > entries() const
Returns the list of registered renderers.
void insert(const QgsRasterRendererRegistryEntry &entry)
Inserts a new entry into the registry.
static const QgsSettingsEntryBool * settingsUseStandardDeviation
static const QgsSettingsEntryDouble * settingsDefaultStandardDeviation
bool rendererData(const QString &rendererName, QgsRasterRendererRegistryEntry &data) const
Retrieves renderer data from the registry.
static const QgsSettingsEntryInteger * settingsDefaultRedBand
Qgis::RasterRendererCapabilities rendererCapabilities(const QString &rendererName) const
Returns the capabilities for the renderer with the specified name.
std::unique_ptr< QgsRasterRenderer > defaultRendererForDrawingStyle(Qgis::RasterDrawingStyle drawingStyle, QgsRasterDataProvider *provider) const
Creates a default renderer for a raster drawing style (considering user options such as default contr...
QStringList renderersList() const
Returns a list of the names of registered renderers.
static const QgsSettingsEntryInteger * settingsDefaultBlueBand
Interface for all raster shaders.
static std::unique_ptr< QgsRasterRenderer > create(const QDomElement &elem, QgsRasterInterface *input)
Creates an instance of the renderer based on definition from XML (used by the renderer registry).
static std::unique_ptr< QgsRasterRenderer > create(const QDomElement &elem, QgsRasterInterface *input)
Creates an instance of the renderer based on definition from XML (used by renderer registry).
A boolean settings entry.
An integer settings entry.
static QgsSettingsTreeNode * sTreeRaster
static std::unique_ptr< QgsRasterRenderer > create(const QDomElement &elem, QgsRasterInterface *input)
static std::unique_ptr< QgsRasterRenderer > create(const QDomElement &elem, QgsRasterInterface *input)
static std::unique_ptr< QgsRasterRenderer > create(const QDomElement &elem, QgsRasterInterface *input)
#define QgsDebugMsgLevel(str, level)
std::unique_ptr< QgsRasterRenderer >(* QgsRasterRendererCreateFunc)(const QDomElement &, QgsRasterInterface *input)
QgsRasterRendererWidget *(* QgsRasterRendererWidgetCreateFunc)(QgsRasterLayer *, const QgsRectangle &extent)
Properties of a single value class.
QString label
Label for value.
Registry for raster renderer entries.
QgsRasterRendererRegistryEntry()=default
QgsRasterRendererWidgetCreateFunc widgetCreateFunction
Qgis::RasterRendererCapabilities capabilities
Renderer capabilities.
QgsRasterRendererCreateFunc rendererCreateFunction