25 #include <QDomDocument> 26 #include <QDomElement> 33 , mClassificationMin( std::numeric_limits<double>::quiet_NaN() )
34 , mClassificationMax( std::numeric_limits<double>::quiet_NaN() )
46 if ( bandNo <= mInput->
bandCount() || bandNo > 0 )
54 mClassificationMin = min;
58 if ( colorRampShader )
67 mClassificationMax = max;
71 if ( colorRampShader )
84 shader =
new QgsRasterShader( mShader->minimumValue(), mShader->maximumValue() );
89 if ( origColorRampShader )
93 if ( origColorRampShader->sourceColorRamp() )
95 colorRampShader->
setSourceColorRamp( origColorRampShader->sourceColorRamp()->clone() );
99 colorRampShader->
setClip( origColorRampShader->clip() );
112 mShader.reset( shader );
124 colorRampShader->
setClip( clip );
138 int band = elem.attribute( QStringLiteral(
"band" ), QStringLiteral(
"-1" ) ).toInt();
140 QDomElement rasterShaderElem = elem.firstChildElement( QStringLiteral(
"rastershader" ) );
141 if ( !rasterShaderElem.isNull() )
144 shader->
readXml( rasterShaderElem );
151 r->
setClassificationMin( elem.attribute( QStringLiteral(
"classificationMin" ), QStringLiteral(
"NaN" ) ).toDouble() );
152 r->
setClassificationMax( elem.attribute( QStringLiteral(
"classificationMax" ), QStringLiteral(
"NaN" ) ).toDouble() );
155 QString
minMaxOrigin = elem.attribute( QStringLiteral(
"classificationMinMaxOrigin" ) );
156 if ( !minMaxOrigin.isEmpty() )
158 if ( minMaxOrigin.contains( QLatin1String(
"MinMax" ) ) )
162 else if ( minMaxOrigin.contains( QLatin1String(
"CumulativeCut" ) ) )
166 else if ( minMaxOrigin.contains( QLatin1String(
"StdDev" ) ) )
175 if ( minMaxOrigin.contains( QLatin1String(
"FullExtent" ) ) )
179 else if ( minMaxOrigin.contains( QLatin1String(
"SubExtent" ) ) )
188 if ( minMaxOrigin.contains( QLatin1String(
"Estimated" ) ) )
205 std::unique_ptr< QgsRasterBlock > outputBlock(
new QgsRasterBlock() );
206 if ( !
mInput || !mShader || !mShader->rasterShaderFunction() )
208 return outputBlock.release();
212 std::shared_ptr< QgsRasterBlock > inputBlock(
mInput->
block( mBand, extent, width, height, feedback ) );
213 if ( !inputBlock || inputBlock->isEmpty() )
215 QgsDebugMsg( QStringLiteral(
"No raster data!" ) );
216 return outputBlock.release();
222 std::shared_ptr< QgsRasterBlock > alphaBlock;
226 if ( !alphaBlock || alphaBlock->isEmpty() )
228 return outputBlock.release();
233 alphaBlock = inputBlock;
238 return outputBlock.release();
242 QRgb *outputBlockData = outputBlock->colorData();
246 for (
qgssize i = 0; i < count; i++ )
248 if ( inputBlock->isNoData( i ) )
250 outputBlockData[i] = myDefaultColor;
253 double val = inputBlock->value( i );
254 int red, green, blue, alpha;
255 if ( !fcn->
shade( val, &red, &green, &blue, &alpha ) )
257 outputBlockData[i] = myDefaultColor;
264 red *= ( alpha / 255.0 );
265 blue *= ( alpha / 255.0 );
266 green *= ( alpha / 255.0 );
269 if ( !hasTransparency )
271 outputBlockData[i] = qRgba( red, green, blue, alpha );
283 currentOpacity *= alphaBlock->value( i ) / 255.0;
286 outputBlockData[i] = qRgba( currentOpacity * red, currentOpacity * green, currentOpacity * blue, currentOpacity * alpha );
290 return outputBlock.release();
295 if ( parentElem.isNull() )
300 QDomElement rasterRendererElem = doc.createElement( QStringLiteral(
"rasterrenderer" ) );
302 rasterRendererElem.setAttribute( QStringLiteral(
"band" ), mBand );
305 mShader->writeXml( doc, rasterRendererElem );
310 parentElem.appendChild( rasterRendererElem );
318 if ( shaderFunction )
343 QDomNodeList elements = element.elementsByTagName( QStringLiteral(
"sld:RasterSymbolizer" ) );
344 if ( elements.size() == 0 )
348 QDomElement rasterSymbolizerElem = elements.at( 0 ).toElement();
351 QDomElement channelSelectionElem = doc.createElement( QStringLiteral(
"sld:ChannelSelection" ) );
352 rasterSymbolizerElem.appendChild( channelSelectionElem );
355 QDomElement channelElem = doc.createElement( QStringLiteral(
"sld:GrayChannel" ) );
356 channelSelectionElem.appendChild( channelElem );
359 QDomElement sourceChannelNameElem = doc.createElement( QStringLiteral(
"sld:SourceChannelName" ) );
360 sourceChannelNameElem.appendChild( doc.createTextNode( QString::number(
band() ) ) );
361 channelElem.appendChild( sourceChannelNameElem );
364 QDomElement colorMapElem = doc.createElement( QStringLiteral(
"sld:ColorMap" ) );
368 QString rampType = QStringLiteral(
"ramp" );
375 rampType = QStringLiteral(
"values" );
378 rampType = QStringLiteral(
"intervals" );
381 rampType = QStringLiteral(
"ramp" );
386 colorMapElem.setAttribute( QStringLiteral(
"type" ), rampType );
388 colorMapElem.setAttribute( QStringLiteral(
"extended" ), QStringLiteral(
"true" ) );
389 rasterSymbolizerElem.appendChild( colorMapElem );
393 QList<QgsColorRampShader::ColorRampItem> classes = rampShader->
colorRampItemList();
394 QList<QgsColorRampShader::ColorRampItem>::const_iterator classDataIt = classes.constBegin();
395 for ( ; classDataIt != classes.constEnd(); ++classDataIt )
397 QDomElement colorMapEntryElem = doc.createElement( QStringLiteral(
"sld:ColorMapEntry" ) );
398 colorMapElem.appendChild( colorMapEntryElem );
401 colorMapEntryElem.setAttribute( QStringLiteral(
"color" ), classDataIt->color.name() );
402 colorMapEntryElem.setAttribute( QStringLiteral(
"quantity" ), classDataIt->value );
403 colorMapEntryElem.setAttribute( QStringLiteral(
"label" ), classDataIt->label );
404 if ( classDataIt->color.alphaF() != 1.0 )
406 colorMapEntryElem.setAttribute( QStringLiteral(
"opacity" ), QString::number( classDataIt->color.alphaF() ) );
virtual void setMinimumValue(double value)
Sets the minimum value for the raster shader.
int alphaValue(double value, int globalTransparency=255) const
Returns the transparency value for a single value pixel.
A rectangle specified with double values.
Interface for all raster shaders.
void setColorRampItemList(const QList< QgsColorRampShader::ColorRampItem > &list)
Sets a custom colormap.
static QString printValue(double value)
Print double value with all necessary significant digits.
void legendSymbologyItems(QList< QPair< QString, QColor > > &symbolItems) const override
Gets symbology items if provided by renderer.
virtual bool shade(double value, int *returnRedValue, int *returnGreenValue, int *returnBlueValue, int *returnAlpha) const
Generates an new RGBA value based on one input value.
QgsSingleBandPseudoColorRenderer * clone() const override
Clone itself, create deep copy.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
Abstract base class for color ramps.
virtual QgsRasterInterface * input() const
Current input.
const QgsRasterMinMaxOrigin & minMaxOrigin() const
Returns const reference to origin of min/max values.
QgsRasterMinMaxOrigin mMinMaxOrigin
Origin of min/max values.
void setClip(bool clip)
Sets whether the shader should not render values out of range.
QgsRasterShader * shader()
Returns the raster shader.
QMap< QString, QString > QgsStringMap
void setClassificationMax(double max)
void setShader(QgsRasterShader *shader)
Takes ownership of the shader.
Type
Supported methods for color interpolation.
Current extent of the canvas (at the time of computation) is used to compute statistics.
void setExtent(QgsRasterMinMaxOrigin::Extent extent)
Sets the extent.
virtual void setMaximumValue(double value)
Sets the maximum value for the raster shader.
bool usesTransparency() const
QgsRasterTransparency * mRasterTransparency
Raster transparency per color or value. Overwrites global alpha value.
static const QRgb NODATA_COLOR
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
QList< QgsColorRampShader::ColorRampItem > colorRampItemList() const
Returns the custom colormap.
void setColorRampType(QgsColorRampShader::Type colorRampType)
Sets the color ramp type.
virtual void toSld(QDomDocument &doc, QDomElement &element, const QgsStringMap &props=QgsStringMap()) const
Used from subclasses to create SLD Rule elements following SLD v1.0 specs.
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.
int band() const
Returns the band used by the renderer.
QgsRasterShaderFunction * rasterShaderFunction()
The raster shade function applies a shader to a pixel at render time - typically used to render grays...
void copyCommonProperties(const QgsRasterRenderer *other, bool copyMinMaxOrigin=true)
Copies common properties like opacity / transparency data from other renderer.
Raster renderer pipe for single band pseudocolor.
void setRasterShaderFunction(QgsRasterShaderFunction *function)
A public method that allows the user to set their own shader function.
Range is [ mean - stdDevFactor() * stddev, mean + stdDevFactor() * stddev ].
int mAlphaBand
Read alpha value from band.
void readXml(const QDomElement &rendererElem) override
Sets base class members from xml. Usually called from create() methods of subclasses.
void setSourceColorRamp(QgsColorRamp *colorramp)
Set the source color ramp.
int bandCount() const override
Gets number of bands.
QList< int > usesBands() const override
Returns a list of band numbers used by the renderer.
Range is [ min + cumulativeCutLower() * (max - min), min + cumulativeCutUpper() * (max - min) ]...
Base class for processing filters like renderers, reprojector, resampler etc.
Type colorRampType() const
Returns the color ramp type.
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...
void classifyColorRamp(int classes=0, int band=-1, const QgsRectangle &extent=QgsRectangle(), QgsRasterInterface *input=nullptr)
Classify color ramp shader.
double classificationMax() const
void setLimits(QgsRasterMinMaxOrigin::Limits limits)
Sets the limits.
virtual void legendSymbologyItems(QList< QPair< QString, QColor > > &symbolItems) const
Returns legend symbology items if provided by renderer.
void setClassificationMin(double min)
Assigns the color of the exact matching value in the color ramp item list.
virtual QgsRectangle extent() const
Gets the extent of the interface.
void setStatAccuracy(QgsRasterMinMaxOrigin::StatAccuracy accuracy)
Sets the statistics accuracy.
Whole raster is used to compute statistics.
void setClassificationMode(ClassificationMode classificationMode)
Sets classification mode.
void setBand(int bandNo)
Sets the band used by the renderer.
double mOpacity
Global alpha value (0-1)
Interpolates the color between two class breaks linearly.
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.
ClassificationMode
Classification modes used to create the color ramp shader.
Assigns the color of the higher class for every pixel between two class breaks.
QgsRasterInterface * mInput
QgsSingleBandPseudoColorRenderer(QgsRasterInterface *input, int band=-1, QgsRasterShader *shader=nullptr)
Note: takes ownership of QgsRasterShader.
void toSld(QDomDocument &doc, QDomElement &element, const QgsStringMap &props=QgsStringMap()) const override
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) ...
Feedback object tailored for raster block reading.
double classificationMin() const
QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr) override
Read block of data using given extent and size.
Raster renderer pipe that applies colors to a raster.
void writeXml(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml.
void readXml(const QDomElement &elem)
Reads shader state from an XML element.