QGIS API Documentation  3.4.15-Madeira (e83d02e274)
qgsrasterrenderer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrasterrenderer.cpp
3  ---------------------
4  begin : December 2011
5  copyright : (C) 2011 by Marco Hugentobler
6  email : marco at sourcepole dot ch
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgsrasterrenderer.h"
19 #include "qgsrastertransparency.h"
20 
21 #include <QCoreApplication>
22 #include <QDomDocument>
23 #include <QDomElement>
24 #include <QImage>
25 #include <QPainter>
26 
27 // See #9101 before any change of NODATA_COLOR!
28 const QRgb QgsRasterRenderer::NODATA_COLOR = qRgba( 0, 0, 0, 0 );
29 
31  : QgsRasterInterface( input )
32  , mType( type )
33 {
34 }
35 
37 {
38  delete mRasterTransparency;
39 }
40 
42 {
43  if ( mOn ) return 1;
44 
45  if ( mInput ) return mInput->bandCount();
46 
47  return 0;
48 }
49 
51 {
52  QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 );
53 
54  if ( mOn ) return Qgis::ARGB32_Premultiplied;
55 
56  if ( mInput ) return mInput->dataType( bandNo );
57 
58  return Qgis::UnknownDataType;
59 }
60 
62 {
63  // Renderer can only work with numerical values in at least 1 band
64  if ( !input ) return false;
65 
66  if ( !mOn )
67  {
68  // In off mode we can connect to anything
69  mInput = input;
70  return true;
71  }
72 
73  for ( int i = 1; i <= input->bandCount(); i++ )
74  {
75  if ( !QgsRasterBlock::typeIsNumeric( input->dataType( i ) ) )
76  {
77  return false;
78  }
79  }
80  mInput = input;
81  return true;
82 }
83 
85 {
86  if ( !mInput )
87  {
88  return true;
89  }
90  return ( mAlphaBand > 0 || ( mRasterTransparency && !mRasterTransparency->isEmpty() ) || !qgsDoubleNear( mOpacity, 1.0 ) );
91 }
92 
94 {
95  delete mRasterTransparency;
97 }
98 
99 void QgsRasterRenderer::_writeXml( QDomDocument &doc, QDomElement &rasterRendererElem ) const
100 {
101  if ( rasterRendererElem.isNull() )
102  {
103  return;
104  }
105 
106  rasterRendererElem.setAttribute( QStringLiteral( "type" ), mType );
107  rasterRendererElem.setAttribute( QStringLiteral( "opacity" ), QString::number( mOpacity ) );
108  rasterRendererElem.setAttribute( QStringLiteral( "alphaBand" ), mAlphaBand );
109 
110  if ( mRasterTransparency )
111  {
112  mRasterTransparency->writeXml( doc, rasterRendererElem );
113  }
114 
115  QDomElement minMaxOriginElem = doc.createElement( QStringLiteral( "minMaxOrigin" ) );
116  mMinMaxOrigin.writeXml( doc, minMaxOriginElem );
117  rasterRendererElem.appendChild( minMaxOriginElem );
118 }
119 
120 void QgsRasterRenderer::readXml( const QDomElement &rendererElem )
121 {
122  if ( rendererElem.isNull() )
123  {
124  return;
125  }
126 
127  mType = rendererElem.attribute( QStringLiteral( "type" ) );
128  mOpacity = rendererElem.attribute( QStringLiteral( "opacity" ), QStringLiteral( "1.0" ) ).toDouble();
129  mAlphaBand = rendererElem.attribute( QStringLiteral( "alphaBand" ), QStringLiteral( "-1" ) ).toInt();
130 
131  QDomElement rasterTransparencyElem = rendererElem.firstChildElement( QStringLiteral( "rasterTransparency" ) );
132  if ( !rasterTransparencyElem.isNull() )
133  {
134  delete mRasterTransparency;
136  mRasterTransparency->readXml( rasterTransparencyElem );
137  }
138 
139  QDomElement minMaxOriginElem = rendererElem.firstChildElement( QStringLiteral( "minMaxOrigin" ) );
140  if ( !minMaxOriginElem.isNull() )
141  {
142  mMinMaxOrigin.readXml( minMaxOriginElem );
143  }
144 }
145 
146 void QgsRasterRenderer::copyCommonProperties( const QgsRasterRenderer *other, bool copyMinMaxOrigin )
147 {
148  if ( !other )
149  return;
150 
151  setOpacity( other->opacity() );
152  setAlphaBand( other->alphaBand() );
153  setRasterTransparency( other->rasterTransparency() ? new QgsRasterTransparency( *other->rasterTransparency() ) : nullptr );
154  if ( copyMinMaxOrigin )
155  setMinMaxOrigin( other->minMaxOrigin() );
156 }
157 
158 void QgsRasterRenderer::toSld( QDomDocument &doc, QDomElement &element, const QgsStringMap &props ) const
159 {
160  QgsStringMap newProps = props;
161 
162  QDomElement rasterSymbolizerElem = doc.createElement( QStringLiteral( "sld:RasterSymbolizer" ) );
163  element.appendChild( rasterSymbolizerElem );
164 
165  // add opacity only is different from default
166  if ( !qgsDoubleNear( opacity(), 1.0 ) )
167  {
168  QDomElement opacityElem = doc.createElement( QStringLiteral( "sld:Opacity" ) );
169  opacityElem.appendChild( doc.createTextNode( QString::number( opacity() ) ) );
170  rasterSymbolizerElem.appendChild( opacityElem );
171  }
172 }
virtual int bandCount() const =0
Gets number of bands.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:278
static bool typeIsNumeric(Qgis::DataType type)
Returns true if data type is numeric.
QgsRasterRenderer(QgsRasterInterface *input=nullptr, const QString &type=QString())
Constructor for QgsRasterRenderer.
DataType
Raster data types.
Definition: qgis.h:92
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.
double opacity() const
Returns the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1...
virtual Qgis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
QMap< QString, QString > QgsStringMap
Definition: qgis.h:577
const QgsRasterTransparency * rasterTransparency() const
bool usesTransparency() const
QgsRasterTransparency * mRasterTransparency
Raster transparency per color or value. Overwrites global alpha value.
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
Definition: qgis.h:107
static const QRgb NODATA_COLOR
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.
bool setInput(QgsRasterInterface *input) override
Set input.
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
void copyCommonProperties(const QgsRasterRenderer *other, bool copyMinMaxOrigin=true)
Copies common properties like opacity / transparency data from other renderer.
bool isEmpty() const
True if there are no entries in the pixel lists except the nodata value.
void readXml(const QDomElement &elem)
Deserialize object.
int alphaBand() const
Unknown or unspecified type.
Definition: qgis.h:94
void readXml(const QDomElement &elem)
Reads the transparency information from an XML document.
int mAlphaBand
Read alpha value from band.
void setAlphaBand(int band)
void readXml(const QDomElement &rendererElem) override
Sets base class members from xml. Usually called from create() methods of subclasses.
int bandCount() const override
Gets number of bands.
Qgis::DataType dataType(int bandNo) const override
Returns data type for the band specified by number.
Base class for processing filters like renderers, reprojector, resampler etc.
void setMinMaxOrigin(const QgsRasterMinMaxOrigin &origin)
Sets origin of min/max values.
~QgsRasterRenderer() override
double mOpacity
Global alpha value (0-1)
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
void setOpacity(double opacity)
Sets the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1...
void writeXml(QDomDocument &doc, QDomElement &parentElem) const
Writes the transparency information to an XML document.
QgsRasterInterface * mInput
void setRasterTransparency(QgsRasterTransparency *t)
void _writeXml(QDomDocument &doc, QDomElement &rasterRendererElem) const
Write upper class info into rasterrenderer element (called by writeXml method of subclasses) ...
Raster renderer pipe that applies colors to a raster.
void writeXml(QDomDocument &doc, QDomElement &parentElem) const
Serialize object.