QGIS API Documentation
3.26.3-Buenos Aires (65e4edfdad)
|
Go to the documentation of this file.
27 #include <QDomDocument>
28 #include <QDomElement>
35 , mClassificationMin( std::numeric_limits<double>::quiet_NaN() )
36 , mClassificationMax( std::numeric_limits<double>::quiet_NaN() )
48 if ( bandNo <= mInput->
bandCount() || bandNo > 0 )
56 mClassificationMin = min;
57 if (
auto *lShader =
shader() )
60 if ( colorRampShader )
69 mClassificationMax = max;
70 if (
auto *lShader =
shader() )
73 if ( colorRampShader )
91 if ( origColorRampShader )
117 colorRampShader->
setClip( clip );
131 const int band = elem.attribute( QStringLiteral(
"band" ), QStringLiteral(
"-1" ) ).toInt();
133 const QDomElement rasterShaderElem = elem.firstChildElement( QStringLiteral(
"rastershader" ) );
134 if ( !rasterShaderElem.isNull() )
144 r->
setClassificationMin( elem.attribute( QStringLiteral(
"classificationMin" ), QStringLiteral(
"NaN" ) ).toDouble() );
145 r->
setClassificationMax( elem.attribute( QStringLiteral(
"classificationMax" ), QStringLiteral(
"NaN" ) ).toDouble() );
148 const QString
minMaxOrigin = elem.attribute( QStringLiteral(
"classificationMinMaxOrigin" ) );
151 if (
minMaxOrigin.contains( QLatin1String(
"MinMax" ) ) )
155 else if (
minMaxOrigin.contains( QLatin1String(
"CumulativeCut" ) ) )
159 else if (
minMaxOrigin.contains( QLatin1String(
"StdDev" ) ) )
168 if (
minMaxOrigin.contains( QLatin1String(
"FullExtent" ) ) )
172 else if (
minMaxOrigin.contains( QLatin1String(
"SubExtent" ) ) )
181 if (
minMaxOrigin.contains( QLatin1String(
"Estimated" ) ) )
198 std::unique_ptr< QgsRasterBlock > outputBlock(
new QgsRasterBlock() );
199 if ( !
mInput || !mShader || !mShader->rasterShaderFunction() )
201 return outputBlock.release();
205 const std::shared_ptr< QgsRasterBlock > inputBlock(
mInput->
block( mBand,
extent, width, height, feedback ) );
206 if ( !inputBlock || inputBlock->isEmpty() )
208 QgsDebugMsg( QStringLiteral(
"No raster data!" ) );
209 return outputBlock.release();
215 std::shared_ptr< QgsRasterBlock > alphaBlock;
219 if ( !alphaBlock || alphaBlock->isEmpty() )
221 return outputBlock.release();
226 alphaBlock = inputBlock;
231 return outputBlock.release();
235 QRgb *outputBlockData = outputBlock->colorData();
239 bool isNoData =
false;
240 for (
qgssize i = 0; i < count; i++ )
242 const double val = inputBlock->valueAndNoData( i, isNoData );
245 outputBlockData[i] = myDefaultColor;
249 int red, green, blue, alpha;
250 if ( !fcn->
shade( val, &red, &green, &blue, &alpha ) )
252 outputBlockData[i] = myDefaultColor;
259 red *= ( alpha / 255.0 );
260 blue *= ( alpha / 255.0 );
261 green *= ( alpha / 255.0 );
264 if ( !hasTransparency )
266 outputBlockData[i] = qRgba( red, green, blue, alpha );
278 currentOpacity *= alphaBlock->value( i ) / 255.0;
281 outputBlockData[i] = qRgba( currentOpacity * red, currentOpacity * green, currentOpacity * blue, currentOpacity * alpha );
285 return outputBlock.release();
290 if ( parentElem.isNull() )
295 QDomElement rasterRendererElem = doc.createElement( QStringLiteral(
"rasterrenderer" ) );
297 rasterRendererElem.setAttribute( QStringLiteral(
"band" ), mBand );
300 mShader->writeXml( doc, rasterRendererElem );
305 parentElem.appendChild( rasterRendererElem );
310 QList< QPair< QString, QColor > > symbolItems;
314 if ( shaderFunction )
338 const QDomNodeList elements = element.elementsByTagName( QStringLiteral(
"sld:RasterSymbolizer" ) );
339 if ( elements.size() == 0 )
343 QDomElement rasterSymbolizerElem = elements.at( 0 ).toElement();
346 QDomElement channelSelectionElem = doc.createElement( QStringLiteral(
"sld:ChannelSelection" ) );
347 rasterSymbolizerElem.appendChild( channelSelectionElem );
350 QDomElement channelElem = doc.createElement( QStringLiteral(
"sld:GrayChannel" ) );
351 channelSelectionElem.appendChild( channelElem );
354 QDomElement sourceChannelNameElem = doc.createElement( QStringLiteral(
"sld:SourceChannelName" ) );
355 sourceChannelNameElem.appendChild( doc.createTextNode( QString::number(
band() ) ) );
356 channelElem.appendChild( sourceChannelNameElem );
359 QDomElement colorMapElem = doc.createElement( QStringLiteral(
"sld:ColorMap" ) );
363 QString rampType = QStringLiteral(
"ramp" );
371 rampType = QStringLiteral(
"values" );
374 rampType = QStringLiteral(
"intervals" );
377 rampType = QStringLiteral(
"ramp" );
381 colorMapElem.setAttribute( QStringLiteral(
"type" ), rampType );
383 colorMapElem.setAttribute( QStringLiteral(
"extended" ), QStringLiteral(
"true" ) );
384 rasterSymbolizerElem.appendChild( colorMapElem );
388 const QList<QgsColorRampShader::ColorRampItem> classes = rampShader->
colorRampItemList();
389 QList<QgsColorRampShader::ColorRampItem>::const_iterator classDataIt = classes.constBegin();
390 for ( ; classDataIt != classes.constEnd(); ++classDataIt )
392 QDomElement colorMapEntryElem = doc.createElement( QStringLiteral(
"sld:ColorMapEntry" ) );
393 colorMapElem.appendChild( colorMapEntryElem );
396 colorMapEntryElem.setAttribute( QStringLiteral(
"color" ), classDataIt->color.name() );
397 colorMapEntryElem.setAttribute( QStringLiteral(
"quantity" ), classDataIt->value );
398 colorMapEntryElem.setAttribute( QStringLiteral(
"label" ), classDataIt->label );
399 if ( classDataIt->color.alphaF() != 1.0 )
401 colorMapEntryElem.setAttribute( QStringLiteral(
"opacity" ), QString::number( classDataIt->color.alphaF() ) );
421 return QList<QgsLayerTreeModelLegendNode *>();
425 return QList<QgsLayerTreeModelLegendNode *>();
427 QList<QgsLayerTreeModelLegendNode *> res;
430 if ( !name.isEmpty() )
456 res.reserve( items.size() );
457 for (
const QPair< QString, QColor > &item : items )
Abstract base class for color ramps.
void writeXml(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml.
static QString printValue(double value)
Print double value with all necessary significant digits.
QgsSingleBandPseudoColorRenderer * clone() const override
Clone itself, create deep copy.
QgsSingleBandPseudoColorRenderer(QgsRasterInterface *input, int band=-1, QgsRasterShader *shader=nullptr)
Note: takes ownership of QgsRasterShader.
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const override
Used from subclasses to create SLD Rule elements following SLD v1.0 specs.
const QgsRasterMinMaxOrigin & minMaxOrigin() const
Returns const reference to origin of min/max values.
QgsRasterInterface * mInput
int alphaValue(double value, int globalTransparency=255) const
Returns the transparency value for a single value pixel.
virtual void legendSymbologyItems(QList< QPair< QString, QColor > > &symbolItems) const
Returns legend symbology items if provided by renderer.
void setShader(QgsRasterShader *shader)
Takes ownership of the shader.
A color ramp entity for QgsStyle databases.
Implementation of legend node interface for displaying arbitrary label with icon.
A legend node which renders a color ramp.
QString displayBandName(int bandNumber) const
Generates a friendly, descriptive name for the specified bandNumber.
void classifyColorRamp(int classes=0, int band=-1, const QgsRectangle &extent=QgsRectangle(), QgsRasterInterface *input=nullptr)
Classify color ramp shader.
double maximumValue() const
Returns the minimum value for the raster shader.
void setBand(int bandNo)
Sets the band used by the renderer.
double classificationMin() const
An interface for classes which can visit style entity (e.g. symbol) nodes (using the visitor pattern)...
void setStatAccuracy(QgsRasterMinMaxOrigin::StatAccuracy accuracy)
Sets the statistics accuracy.
int band() const
Returns the band used by the renderer.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
Type
Supported methods for color interpolation.
A rectangle specified with double values.
Contains information relating to the style entity currently being visited.
@ WholeRaster
Whole raster is used to compute statistics.
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified symbology visitor, causing it to visit all symbols associated with the renderer...
void setClassificationMax(double max)
@ Discrete
Assigns the color of the higher class for every pixel between two class breaks.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context=QgsReadWriteContext())
Reads shader state from an XML element.
QgsColorRamp * createColorRamp() const
Creates a gradient color ramp from shader settings.
QgsRasterMinMaxOrigin mMinMaxOrigin
Origin of min/max values.
double classificationMax() const
@ CumulativeCut
Range is [ min + cumulativeCutLower() * (max - min), min + cumulativeCutUpper() * (max - min) ].
void setClip(bool clip)
Sets whether the shader should not render values out of range.
@ MinMax
Real min-max values.
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
Raster renderer pipe that applies colors to a raster.
Layer tree node points to a map layer.
virtual void setMaximumValue(double value)
Sets the maximum value for the raster shader.
QgsRasterTransparency * mRasterTransparency
Raster transparency per color or value. Overwrites global alpha value.
void readXml(const QDomElement &rendererElem) override
Sets base class members from xml. Usually called from create() methods of subclasses.
virtual void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const
Used from subclasses to create SLD Rule elements following SLD v1.0 specs.
void _writeXml(QDomDocument &doc, QDomElement &rasterRendererElem) const
Write upper class info into rasterrenderer element (called by writeXml method of subclasses)
void copyCommonProperties(const QgsRasterRenderer *other, bool copyMinMaxOrigin=true)
Copies common properties like opacity / transparency data from other renderer.
void setClassificationMin(double min)
bool usesTransparency() const
@ ARGB32_Premultiplied
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
int mAlphaBand
Read alpha value from band.
bool useContinuousLegend() const
Returns true if a continuous gradient legend will be used.
int bandCount() const override
Gets number of bands.
double minimumValue() const
Returns the maximum value for the raster shader.
@ Estimated
Approximated statistics.
QList< QgsColorRampShader::ColorRampItem > colorRampItemList() const
Returns the custom colormap.
Type colorRampType() const
Returns the color ramp type.
ClassificationMode
Classification modes used to create the color ramp shader.
QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr) override
Read block of data using given extent and size.
Base class for processing filters like renderers, reprojector, resampler etc.
@ StdDev
Range is [ mean - stdDevFactor() * stddev, mean + stdDevFactor() * stddev ].
QList< QgsLayerTreeModelLegendNode * > createLegendNodes(QgsLayerTreeLayer *nodeLayer) override
Creates a set of legend nodes representing the renderer.
QRgb renderColorForNodataPixel() const
Returns the color for the renderer to use to represent nodata pixels.
virtual QgsRasterInterface * input() const
Current input.
void setLimits(QgsRasterMinMaxOrigin::Limits limits)
Sets the limits.
Feedback object tailored for raster block reading.
double mOpacity
Global alpha value (0-1)
void createShader(QgsColorRamp *colorRamp=nullptr, QgsColorRampShader::Type colorRampType=QgsColorRampShader::Interpolated, QgsColorRampShader::ClassificationMode classificationMode=QgsColorRampShader::Continuous, int classes=0, bool clip=false, const QgsRectangle &extent=QgsRectangle())
Creates a color ramp shader.
The raster shade function applies a shader to a pixel at render time - typically used to render grays...
virtual bool visit(const QgsStyleEntityVisitorInterface::StyleLeaf &entity)
Called when the visitor will visit a style entity.
void setExtent(QgsRasterMinMaxOrigin::Extent extent)
Sets the extent.
QList< QPair< QString, QColor > > legendSymbologyItems() const override
Returns symbology items if provided by renderer.
Raster renderer pipe for single band pseudocolor.
Implementation of legend node interface for displaying raster legend entries.
void setRasterShaderFunction(QgsRasterShaderFunction *function)
A public method that allows the user to set their own shader function.
virtual QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr)=0
Read block of data using given extent and size.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
@ CurrentCanvas
Current extent of the canvas (at the time of computation) is used to compute statistics.
Interface for all raster shaders.
QgsRasterShader * shader()
Returns the raster shader.
@ Interpolated
Interpolates the color between two class breaks linearly.
virtual bool shade(double value, int *returnRedValue, int *returnGreenValue, int *returnBlueValue, int *returnAlpha) const
Generates an new RGBA value based on one input value.
Settings for a color ramp legend node.
virtual QgsRectangle extent() const
Gets the extent of the interface.
QList< int > usesBands() const override
Returns a list of band numbers used by the renderer.
virtual void setMinimumValue(double value)
Sets the minimum value for the raster shader.
const QgsColorRampLegendNodeSettings * legendSettings() const
Returns the color ramp shader legend settings.
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...