QGIS API Documentation  2.10.1-Pisa
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgsrasterrendererregistry.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrasterrendererregistry.cpp
3  -----------------------------
4  begin : January 2012
5  copyright : (C) 2012 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 
24 #include <QSettings>
25 
27  QgsRasterRendererCreateFunc rendererFunction,
28  QgsRasterRendererWidgetCreateFunc widgetFunction ):
29  name( theName ), visibleName( theVisibleName ), rendererCreateFunction( rendererFunction ),
30  widgetCreateFunction( widgetFunction )
31 {
32 }
33 
34 QgsRasterRendererRegistryEntry::QgsRasterRendererRegistryEntry(): rendererCreateFunction( 0 ), widgetCreateFunction( 0 )
35 {
36 }
37 
39 {
40  static QgsRasterRendererRegistry mInstance;
41  return &mInstance;
42 }
43 
45 {
46  // insert items in a particular order, which is returned in renderersList()
47  insert( QgsRasterRendererRegistryEntry( "multibandcolor", QObject::tr( "Multiband color" ),
50  insert( QgsRasterRendererRegistryEntry( "singlebandgray", QObject::tr( "Singleband gray" ),
52  insert( QgsRasterRendererRegistryEntry( "singlebandpseudocolor", QObject::tr( "Singleband pseudocolor" ),
54  insert( QgsRasterRendererRegistryEntry( "singlebandcolordata", QObject::tr( "Singleband color data" ),
56 }
57 
59 {
60 }
61 
63 {
64  mEntries.insert( entry.name, entry );
65  mSortedEntries.append( entry.name );
66 }
67 
69 {
70  if ( !mEntries.contains( rendererName ) )
71  {
72  return;
73  }
74  mEntries[rendererName].widgetCreateFunction = func;
75 }
76 
78 {
80  if ( it == mEntries.constEnd() )
81  {
82  return false;
83  }
84  data = it.value();
85  return true;
86 }
87 
89 {
90  return mSortedEntries;
91 }
92 
94 {
96 
98  for ( ; it != mEntries.constEnd(); ++it )
99  {
100  result.push_back( it.value() );
101  }
102  return result;
103 }
104 
106 {
107  if ( !provider || provider->bandCount() < 1 )
108  {
109  return 0;
110  }
111 
112 
113  QgsRasterRenderer* renderer = 0;
114  switch ( theDrawingStyle )
115  {
117  {
118  int grayBand = 1; //reasonable default
119  QList<QgsColorRampShader::ColorRampItem> colorEntries = provider->colorTable( grayBand );
120 
121  //go through list and take maximum value (it could be that entries don't start at 0 or indices are not contiguous)
122  int colorArraySize = 0;
124  for ( ; colorIt != colorEntries.constEnd(); ++colorIt )
125  {
126  if ( colorIt->value > colorArraySize )
127  {
128  colorArraySize = ( int )( colorIt->value );
129  }
130  }
131 
132  colorArraySize += 1; //usually starts at 0
133  QColor* colorArray = new QColor[ colorArraySize ];
134  colorIt = colorEntries.constBegin();
135  QVector<QString> labels;
136  for ( ; colorIt != colorEntries.constEnd(); ++colorIt )
137  {
138  int idx = ( int )( colorIt->value );
139  colorArray[idx] = colorIt->color;
140  if ( !colorIt->label.isEmpty() )
141  {
142  if ( labels.size() <= idx ) labels.resize( idx + 1 );
143  labels[idx] = colorIt->label;
144  }
145  }
146 
147  renderer = new QgsPalettedRasterRenderer( provider,
148  grayBand,
149  colorArray,
150  colorArraySize,
151  labels );
152  }
153  break;
156  {
157  int grayBand = 1;
158  renderer = new QgsSingleBandGrayRenderer( provider, grayBand );
159 
161  provider->dataType( grayBand ) ) );
162 
163 // Default contrast enhancement is set from QgsRasterLayer, it has already setContrastEnhancementAlgorithm(). Default enhancement must only be set if default style was not loaded (to avoid stats calculation).
164  (( QgsSingleBandGrayRenderer* )renderer )->setContrastEnhancement( ce );
165  break;
166  }
168  {
169  int bandNo = 1;
170  double minValue = 0;
171  double maxValue = 0;
172  // TODO: avoid calculating statistics if not necessary (default style loaded)
173  minMaxValuesForBand( bandNo, provider, minValue, maxValue );
174  QgsRasterShader* shader = new QgsRasterShader( minValue, maxValue );
175  renderer = new QgsSingleBandPseudoColorRenderer( provider, bandNo, shader );
176  break;
177  }
179  {
180  QSettings s;
181 
182  int redBand = s.value( "/Raster/defaultRedBand", 1 ).toInt();
183  if ( redBand < 0 || redBand > provider->bandCount() )
184  {
185  redBand = -1;
186  }
187  int greenBand = s.value( "/Raster/defaultGreenBand", 2 ).toInt();
188  if ( greenBand < 0 || greenBand > provider->bandCount() )
189  {
190  greenBand = -1;
191  }
192  int blueBand = s.value( "/Raster/defaultBlueBand", 3 ).toInt();
193  if ( blueBand < 0 || blueBand > provider->bandCount() )
194  {
195  blueBand = -1;
196  }
197 
198  renderer = new QgsMultiBandColorRenderer( provider, redBand, greenBand, blueBand );
199  break;
200  }
202  {
203  renderer = new QgsSingleBandColorDataRenderer( provider, 1 );
204  break;
205  }
206  default:
207  return 0;
208  }
209 
210  QgsRasterTransparency* tr = new QgsRasterTransparency(); //renderer takes ownership
211  int bandCount = renderer->usesBands().size();
212  if ( bandCount == 1 )
213  {
215  tr->setTransparentSingleValuePixelList( transparentSingleList );
216  }
217  else if ( bandCount == 3 )
218  {
220  tr->setTransparentThreeValuePixelList( transparentThreeValueList );
221  }
222  renderer->setRasterTransparency( tr );
223  return renderer;
224 }
225 
226 bool QgsRasterRendererRegistry::minMaxValuesForBand( int band, QgsRasterDataProvider* provider, double& minValue, double& maxValue ) const
227 {
228  if ( !provider )
229  {
230  return false;
231  }
232 
233  minValue = 0;
234  maxValue = 0;
235 
236  QSettings s;
237  if ( s.value( "/Raster/useStandardDeviation", false ).toBool() )
238  {
240 
241  double stdDevFactor = s.value( "/Raster/defaultStandardDeviation", 2.0 ).toDouble();
242  double diff = stdDevFactor * stats.stdDev;
243  minValue = stats.mean - diff;
244  maxValue = stats.mean + diff;
245  }
246  else
247  {
249  minValue = stats.minimumValue;
250  maxValue = stats.maximumValue;
251  }
252  return true;
253 }
virtual int bandCount() const =0
Get number of bands.
Interface for all raster shaders.
iterator insert(const Key &key, const T &value)
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
virtual QList< int > usesBands() const
Returns a list of band numbers used by the renderer.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
Renderer for paletted raster images.
bool rendererData(const QString &rendererName, QgsRasterRendererRegistryEntry &data) const
void push_back(const T &value)
DrawingStyle
This enumerator describes the different kinds of drawing we can do.
Definition: qgsraster.h:95
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
void setTransparentSingleValuePixelList(QList< QgsRasterTransparency::TransparentSingleValuePixel >)
Mutator for transparentSingleValuePixelList.
double maximumValue
The maximum cell value in the raster band.
Registry for raster renderers.
QgsRasterRendererWidget *(* QgsRasterRendererWidgetCreateFunc)(QgsRasterLayer *, const QgsRectangle &extent)
QString tr(const char *sourceText, const char *disambiguation, int n)
int size() const
Raster renderer pipe for single band color.
virtual QgsRasterBandStats bandStatistics(int theBandNo, int theStats=QgsRasterBandStats::All, const QgsRectangle &theExtent=QgsRectangle(), int theSampleSize=0)
Get band statistics.
double stdDev
The standard deviation of the cell values.
The RasterBandStats struct is a container for statistics about a single raster band.
static QgsRasterRendererRegistry * instance()
double mean
The mean cell value for the band.
void append(const T &value)
void resize(int size)
const_iterator constEnd() const
int toInt(bool *ok) const
void insert(QgsRasterRendererRegistryEntry entry)
Raster renderer pipe for single band pseudocolor.
Raster renderer pipe for single band gray.
QgsRasterRenderer * defaultRendererForDrawingStyle(const QgsRaster::DrawingStyle &theDrawingStyle, QgsRasterDataProvider *provider) const
Creates a default renderer for a raster drawing style (considering user options such as default contr...
const T value(const Key &key) const
iterator find(const Key &key)
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
Registry for raster renderer entries.
virtual QGis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
QgsRasterRenderer *(* QgsRasterRendererCreateFunc)(const QDomElement &, QgsRasterInterface *input)
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
QVariant value(const QString &key, const QVariant &defaultValue) const
const_iterator constBegin() const
DataType
Raster data types.
Definition: qgis.h:204
void setTransparentThreeValuePixelList(QList< QgsRasterTransparency::TransparentThreeValuePixel >)
Mutator for transparentThreeValuePixelList.
bool toBool() const
double minimumValue
The minimum cell value in the raster band.
Renderer for multiband images with the color components.
Manipulates raster pixel values so that they enhanceContrast or clip into a specified numerical range...
double toDouble(bool *ok) const
bool contains(const Key &key) const
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
const_iterator constEnd() const
const_iterator constBegin() const
QList< QgsRasterRendererRegistryEntry > entries() const
virtual QList< QgsColorRampShader::ColorRampItem > colorTable(int bandNo) const
int size() const
void setRasterTransparency(QgsRasterTransparency *t)
void insertWidgetFunction(const QString &rendererName, QgsRasterRendererWidgetCreateFunc func)
Raster renderer pipe that applies colors to a raster.
Base class for raster data providers.
#define tr(sourceText)