src/terralib/qt/plugins/datasource/terralib4/Utils.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/qt/plugins/terralib5/Utils.h
22 
23  \brief
24 */
25 
26 // TerraLib
27 #include "../../../../color/RGBAColor.h"
28 #include "../../../../common/StringUtils.h"
29 #include "../../../../fe/utils.h"
30 #include "../../../../geometry/GeometryProperty.h"
31 #include "../../../../maptools/Enums.h"
32 #include "../../../../maptools/Grouping.h"
33 #include "../../../../se/Categorize.h"
34 #include "../../../../se/ChannelSelection.h"
35 #include "../../../../se/ColorMap.h"
36 #include "../../../../se/ContrastEnhancement.h"
37 #include "../../../../se/CoverageStyle.h"
38 #include "../../../../se/Description.h"
39 #include "../../../../se/FeatureTypeStyle.h"
40 #include "../../../../se/Fill.h"
41 #include "../../../../se/LineSymbolizer.h"
42 #include "../../../../se/ParameterValue.h"
43 #include "../../../../se/PolygonSymbolizer.h"
44 #include "../../../../se/PointSymbolizer.h"
45 #include "../../../../se/RasterSymbolizer.h"
46 #include "../../../../se/Rule.h"
47 #include "../../../../se/SelectedChannel.h"
48 #include "../../../../se/Style.h"
49 #include "../../../../se/Stroke.h"
50 #include "../../../../se/Utils.h"
51 #include "../../../../terralib4/Utils.h"
52 #include "Utils.h"
53 
54 // TerraLib 4
55 #include <terralib4/kernel/TeAbstractTheme.h>
56 #include <terralib4/kernel/TeDataTypes.h>
57 #include <terralib4/kernel/TeLegendEntry.h>
58 #include <terralib4/kernel/TeRaster.h>
59 #include <terralib4/kernel/TeRasterTransform.h>
60 #include <terralib4/kernel/TeTheme.h>
61 #include <terralib4/kernel/TeVisual.h>
62 
63 // Boost
64 #include <boost/lexical_cast.hpp>
65 
66 // Qt
67 #include <QtGui/QColor>
68 #include <QObject>
69 
71 {
72  te::color::RGBAColor tl5Color(color.red_, color.green_, color.blue_, 0);
73 
74  return tl5Color;
75 }
76 
78 {
79 
80  switch(mode)
81  {
82  case TeEqualSteps:
83  return te::map::EQUAL_STEPS;
84 
85  case TeQuantil:
86  return te::map::QUANTIL;
87 
88  case TeStdDeviation:
90 
91  case TeUniqueValue:
92  return te::map::UNIQUE_VALUE;
93 
94  default:
95  return te::map::EQUAL_STEPS;
96  }
97 }
98 
100 {
101  switch(type)
102  {
103  case TeLnTypeDashed:
104  return"4 2";
105  case TeLnTypeDotted:
106  return "1 2";
107  case TeLnTypeDashDot:
108  return "4 2 1 2";
109  case TeLnTypeDashDotDot:
110  return "4 2 1 2 1 2";
111  case TeLnTypeNone:
112  return "NONE";
113  case TeLnTypeContinuous:
114  default:
115  return "";
116  }
117 }
118 
120 {
121  switch(type)
122  {
123  case TePtTypePlus:
124  return "cross";
125  case TePtTypeStar:
126  return "star";
127  case TePtTypeCircle:
128  case TePtTypeHollowCircle:
129  return "circle";
130  case TePtTypeX:
131  return "x";
132  case TePtTypeBox:
133  case TePtTypeHollowBox:
134  return "square";
135  case TePtTypeDiamond:
136  case TePtTypeHollowDiamond:
137  return "diamond";
138  default:
139  return "";
140  }
141 }
142 
144 {
145  switch(type)
146  {
147  case TePtTypeHollowCircle:
148  return true;
149  case TePtTypeHollowBox:
150  return true;
151  case TePtTypeHollowDiamond:
152  return true;
153  default:
154  return false;
155  }
156 }
157 
158 te::se::Style* te::qt::plugins::terralib4::Convert2TerraLib5(int geometryType, TeTheme* theme, bool isRaster)
159 {
160  te::se::Symbolizer* symb = 0;
161 
162  if(isRaster)
163  {
164  TeRasterVisual* vis = 0;
165  vis = theme->rasterVisual();
166  if(!vis)
167  {
168  TeRaster* raster = theme->layer()->raster();
169  theme->createRasterVisual(raster);
170  vis = theme->rasterVisual();
171  }
172 
173  symb = GetRasterSymbolizer(vis);
174  }
175  else
176  {
177 
178  TeLegendEntry legend = theme->defaultLegend();
179 
180  TeGeomRepVisualMap visualMap = legend.getVisualMap();
181 
182  TeVisual* visual = 0;
183 
184  switch(geometryType)
185  {
186  case te::gm::PolygonType:
188  {
189  visual = visualMap[TePOLYGONS];
190  symb = GetPolygonSymbolizer(visual);
191  break;
192  }
193 
196  {
197  visual = visualMap[TeLINES];
198  symb = GetLineSymbolizer(visual);
199  break;
200  }
201 
202  case te::gm::PointType:
204  {
205  visual = visualMap[TePOINTS];
206  symb = GetPointSymbolizer(visual);
207  break;
208  }
209  default:
210  {
211  break;
212  }
213  }
214  }
215 
216  te::se::Rule* rule = new te::se::Rule;
217 
218  if(symb != 0)
219  rule->push_back(symb);
220 
221  te::se::Style* style = 0;
222 
223  if(isRaster)
224  style = new te::se::CoverageStyle;
225  else
226  style = new te::se::FeatureTypeStyle;
227 
228  style->push_back(rule);
229 
230  return style;
231 }
232 
234 {
235  switch(geometryType)
236  {
237  case te::gm::PolygonType:
238  return GetPolygonSymbolizer(visual);
239 
241  return GetLineSymbolizer(visual);
242 
243  case te::gm::PointType:
244  return GetPointSymbolizer(visual);
245 
246  default:
247  return 0;
248  }
249 }
250 
252 {
253  TeColor tl4Color = visual->color();
254 
255  // Stroke
256  std::string color = Convert2TerraLib5(visual->contourColor()).getColor();
257  std::string width = boost::lexical_cast<std::string>(visual->contourWidth());
258 
259  te::se::Stroke* stroke = te::se::CreateStroke(color, width, "1.0");
260 
261  std::string style = GetLineStyle(visual->contourStyle());
262 
263  if(!style.empty())
264  {
265  if(style == "NOME")
266  stroke = 0;
267  else
268  stroke->setDashArray(style);
269  }
270 
271  // Fill
272  color = Convert2TerraLib5(visual->color()).getColor();
273  double numericOpacity = (100-visual->transparency())/100.0;
274  std::string opacity = boost::lexical_cast<std::string>(numericOpacity);
275 
276  te::se::Fill* fill = te::se::CreateFill(color, opacity);
277 
278  return te::se::CreatePolygonSymbolizer(stroke, fill);
279 }
280 
282 {
283  std::string color = Convert2TerraLib5(visual->color()).getColor();
284  std::string width = boost::lexical_cast<std::string>(visual->width());
285 
286  te::se::Stroke* stroke = te::se::CreateStroke(color, width);
287 
288  std::string style = GetLineStyle(visual->style());
289 
290  if(!style.empty())
291  {
292  if(style == "NOME")
293  stroke = 0;
294  else
295  stroke->setDashArray(style);
296  }
297 
298  return te::se::CreateLineSymbolizer(stroke);
299 }
300 
302 {
303  std::string color = Convert2TerraLib5(visual->color()).getColor();
304 
305  te::se::Fill* fill = te::se::CreateFill(color, "1.0");
306 
307  std::string style = GetPointStyle(visual->style());
308 
309  if(IsHollow(visual->style()))
310  fill = 0;
311 
312  te::se::Mark* mark = te::se::CreateMark(style, 0, fill);
313 
314  std::string size = boost::lexical_cast<std::string>(visual->size());
315 
316  te::se::Graphic* gr = te::se::CreateGraphic(mark, size, "0", "1.0");
317 
319 }
320 
322 {
323  TeLegendEntryVector leg = theme->legend();
324  TeGrouping group = theme->grouping();
325 
326  TeAttributeRep attr = group.groupAttribute_;
327  std::string propertyName = ::terralib4::Convert2Utf8(attr.name_);
328  std::vector<std::string> tokens;
329  te::common::Tokenize(propertyName, tokens, ".");
330  propertyName = tokens[1];
331 
332  TeGroupingMode mode = group.groupMode_;
333  int tl5Type = ::terralib4::Convert2T5(attr.type_);
334  std::size_t precision = static_cast<std::size_t>(group.groupPrecision_);
335  int slices = group.groupNumSlices_;
336  double stdDeviation = group.groupStdDev_;
337 
338  te::map::Grouping* grouping = new te::map::Grouping(propertyName, GetGroupingType(mode), precision);
339  grouping->setPropertyType(tl5Type);
340  grouping->setStdDeviation(stdDeviation);
341 
342  std::vector<te::se::Rule*> rules;
343 
344  for(int i = 0; i < slices; ++i)
345  {
346  te::se::Rule* ruleItem = new te::se::Rule;
347 
348  TeLegendEntry le = leg[i];
349 
350  std::string* ruleNamePtr = new std::string(le.label());
351 
352  ruleItem->setName(ruleNamePtr);
353 
354  std::string fromValue = le.from();
355  std::string toValue = le.to();
356 
357  if(mode == TeUniqueValue)
358  {
359  ruleItem->setFilter(te::fe::CreateFilterByUniqueValue(propertyName, fromValue));
360  }
361  else
362  {
363  ruleItem->setFilter(te::fe::CreateFilterByStep(propertyName, fromValue, toValue));
364  }
365 
366  std::vector<te::se::Symbolizer*> symbs;
367 
368  TeGeomRepVisualMap map = le.getVisualMap();
369 
370  TeGeomRep geomRep = map.begin()->first;
371  TeVisual* visual = map.begin()->second;
372 
373  symbs.push_back(GetSymbolizer(::terralib4::Convert2T5GeomType(geomRep), visual));
374 
375  ruleItem->setSymbolizers(symbs);
376 
377  rules.push_back(ruleItem);
378  }
379 
380  //update style
381  std::string prefixName = "Grouping Style: ";
382  std::string* styleName = new std::string(prefixName + propertyName);
383  style->setName(styleName);
384 
385  //set style description
386  QString descInfo = QObject::tr("Grouping Information") + ":\n";
387 
388  descInfo += QObject::tr("\tProperty: ") + QString(propertyName.c_str()) + "\n";
389  descInfo += QObject::tr("\tNum Slices: ") + QString::number(slices) + "\n";
390  descInfo += QObject::tr("\tPrecision: ") + QString::number(precision) + "\n";
391  descInfo += QObject::tr("\tStd Deviation: ") + QString::number(stdDeviation) + "\n";
392 
393  te::se::Description* descStyle = new te::se::Description;
394  descStyle->setTitle(descInfo.toUtf8().data());
395  style->setDescription(descStyle);
396 
397  style->removeRules();
398 
399  for (std::size_t t = 0; t < rules.size(); ++t)
400  {
401  te::se::Rule* rule = rules[t];
402 
403  //set rule description
404  std::string descStr = std::string("Rule Item");
406  desc->setTitle(descStr);
407  rule->setDescription(desc);
408 
409  style->push_back(rule);
410  }
411 
412  return grouping;
413 }
414 
416 {
417  TeLegendEntryVector leg = theme->legend();
418  TeGrouping group = theme->grouping();
419 
420  int slices = group.groupNumSlices_;
421 
423 
424  c->setFallbackValue("#000000");
425  c->setLookupValue(new te::se::ParameterValue("Rasterdata"));
426 
427  QColor cWhite(Qt::white);
428  std::string colorWhiteStr = cWhite.name().toUtf8().data();
429 
430  //added dummy color for values < than min values...
431  c->addValue(new te::se::ParameterValue(colorWhiteStr));
432 
433  for(int i = 0; i < slices; ++i)
434  {
435  TeLegendEntry le = leg[i];
436 
437  std::string title = ::terralib4::Convert2Utf8(le.label());
438 
439  TeGeomRepVisualMap map = le.getVisualMap();
440 
441  TeVisual* visual = map.begin()->second;
442 
443  QColor color(visual->color().red_, visual->color().green_, visual->color().blue_, 0);
444 
445  std::string rangeStr = ::terralib4::Convert2Utf8(le.from());
446  std::string colorStr = color.name().toUtf8().data();
447 
448  c->addThreshold(new te::se::ParameterValue(rangeStr));
449  c->addValue(new te::se::ParameterValue(colorStr));
450 
451  if(i == slices - 1)
452  {
453  rangeStr = ::terralib4::Convert2Utf8(le.to());
454  c->addThreshold(new te::se::ParameterValue(rangeStr));
455  }
456  }
457 
458  //added dummy color for values > than max values...
459  c->addValue(new te::se::ParameterValue(colorWhiteStr));
460 
462 
464  cm->setCategorize(c);
465 
466  return cm;
467 }
468 
470 {
472 
473  double opacity = ((visual->getTransparency()*100.0)/255)/100.0;
474  double offset = visual->getOffset();
475  double gain = visual->getGain();
476 
477  symb->setOpacity(new te::se::ParameterValue(boost::lexical_cast<std::string>(opacity)));
478  symb->setOffset(new te::se::ParameterValue(boost::lexical_cast<std::string>(offset)));
479  symb->setGain(new te::se::ParameterValue(boost::lexical_cast<std::string>(gain)));
480 
481  TeRasterTransform::TeRasterTransfFunctions func = visual->getTransfFunction();
482 
484 
485  te::se::SelectedChannel* scRed = 0;
486  te::se::SelectedChannel* scGreen = 0;
487  te::se::SelectedChannel* scBlue = 0;
488  te::se::SelectedChannel* scMono = 0;
489 
490  if (func == TeRasterTransform::TeBand2Band)
491  {
492  scRed = new te::se::SelectedChannel;
493  scRed->setSourceChannelName("0");
494 
495  scGreen = new te::se::SelectedChannel;
496  scGreen->setSourceChannelName("1");
497 
498  scBlue = new te::se::SelectedChannel;
499  scBlue->setSourceChannelName("2");
500 
502 
503  }
504  else if (func == TeRasterTransform::TeExtractBand)
505  {
506 
507  short db = visual->getDestBand();
508 
509  if (db == TeRasterTransform::TeREDCHANNEL)
510  {
511 
512  scRed = new te::se::SelectedChannel;
513  scRed->setSourceChannelName(boost::lexical_cast<std::string>(visual->getSrcBand()));
514 
516 
517  }
518  else if (db == TeRasterTransform::TeGREENCHANNEL)
519  {
520 
521  scGreen = new te::se::SelectedChannel;
522  scGreen->setSourceChannelName(boost::lexical_cast<std::string>(visual->getSrcBand()));
523 
525 
526  }
527  else if (db == TeRasterTransform::TeBLUECHANNEL)
528  {
529 
530  scBlue = new te::se::SelectedChannel;
531  scBlue->setSourceChannelName(boost::lexical_cast<std::string>(visual->getSrcBand()));
532 
534 
535  }
536  }
537  else if (func == TeRasterTransform::TeMono2Three)
538  {
539 
540  scMono = new te::se::SelectedChannel;
541  scMono->setSourceChannelName(boost::lexical_cast<std::string>(visual->getSrcBand()));
542 
544 
545  }
546  else if (func == TeRasterTransform::TeExtractRGB)
547  {
548  std::map<TeRasterTransform::TeRGBChannels,short>& RGBmap = visual->getRGBMap();
549 
550  scRed = new te::se::SelectedChannel;
551  scRed->setSourceChannelName(boost::lexical_cast<std::string>(RGBmap[TeRasterTransform::TeREDCHANNEL]));
552 
553  scGreen = new te::se::SelectedChannel;
554  scGreen->setSourceChannelName(boost::lexical_cast<std::string>(RGBmap[TeRasterTransform::TeGREENCHANNEL]));
555 
556  scBlue = new te::se::SelectedChannel;
557  scBlue->setSourceChannelName(boost::lexical_cast<std::string>(RGBmap[TeRasterTransform::TeBLUECHANNEL]));
558 
560 
561  }
562  else if (func == TeRasterTransform::TeThreeBand2RGB)
563  {
564  scRed = new te::se::SelectedChannel;
565  scRed->setSourceChannelName("0");
566 
567  scGreen = new te::se::SelectedChannel;
568  scGreen->setSourceChannelName("1");
569 
570  scBlue = new te::se::SelectedChannel;
571  scBlue->setSourceChannelName("2");
572 
574  }
575 
576  else if (func == TeRasterTransform::TeExtractBands)
577  {
578 
579  std::map<TeRasterTransform::TeRGBChannels,short>& RGBmap = visual->getRGBMap();
580 
581  if (RGBmap[TeRasterTransform::TeREDCHANNEL] != -1)
582  scRed->setSourceChannelName(boost::lexical_cast<std::string>(RGBmap[TeRasterTransform::TeREDCHANNEL]));
583  if (RGBmap[TeRasterTransform::TeGREENCHANNEL] != -1)
584  scGreen->setSourceChannelName(boost::lexical_cast<std::string>(RGBmap[TeRasterTransform::TeGREENCHANNEL]));
585  if (RGBmap[TeRasterTransform::TeBLUECHANNEL] != -1)
586  scBlue->setSourceChannelName(boost::lexical_cast<std::string>(RGBmap[TeRasterTransform::TeBLUECHANNEL]));
587 
589  }
590 
591  if(scRed)
592  cs->setRedChannel(scRed);
593  if(scGreen)
594  cs->setGreenChannel(scGreen);
595  if(scBlue)
596  cs->setBlueChannel(scBlue);
597  if(scMono)
598  cs->setGrayChannel(scMono);
599 
600  symb->setChannelSelection(cs);
601 
602  return symb;
603 }
te::map::Grouping * GetGrouping(TeTheme *theme, te::se::Style *style)
te::se::Symbolizer * GetSymbolizer(int geometryType, TeVisual *visual)
void setRedChannel(SelectedChannel *c)
A selected channel to be display.
A Description gives human-readable descriptive information for the object it is included within...
Definition: Description.h:56
The transformation of continuous values to distinct values (Categorize function). ...
Definition: Categorize.h:90
The Style defines the styling that is to be applied to a geographic dataset (vector geometries or cov...
Definition: Style.h:65
A Mark specifies a geometric shape and applies coloring to it.
Definition: Mark.h:84
TETERRALIB4EXPORT std::string Convert2Utf8(const std::string &str)
A PolygonSymbolizer is used to draw a polygon (or other area-type geometries), including filling its ...
te::se::PointSymbolizer * GetPointSymbolizer(TeVisual *visual)
A Symbolizer describes how a feature is to appear on a map.
Definition: Symbolizer.h:80
void setDescription(Description *d)
Definition: Rule.cpp:69
The CoverageStyle defines the styling that is to be applied to a subset of Coverage data...
Definition: CoverageStyle.h:45
ParameterValue * getOffset() const
void setName(std::string *name)
Definition: Rule.cpp:58
void setGain(ParameterValue *p)
void setDescription(Description *d)
Definition: Style.cpp:64
void setLookupValue(ParameterValue *v)
Definition: Categorize.cpp:81
A PointSymbolizer specifies the rendering of a graphic Symbolizer at a point.
void setCategorize(Categorize *c)
Definition: ColorMap.cpp:67
void push_back(const std::string &semanticTypeIdentifier)
Definition: Style.cpp:75
void setGrayChannel(SelectedChannel *c)
void setStdDeviation(double stdDeviation)
It sets the standard deviation for the Standard Deviation grouping.
Definition: Grouping.cpp:124
void setFilter(te::fe::Filter *f)
Definition: Rule.cpp:91
TESEEXPORT LineSymbolizer * CreateLineSymbolizer(Stroke *stroke)
Creates a line symbolizer.
A Graphic is a graphic symbol with an inherent shape, color(s), and possibly size.
Definition: Graphic.h:66
TESEEXPORT PolygonSymbolizer * CreatePolygonSymbolizer(Stroke *stroke, Fill *fill)
Creates a polygon symbolizer.
void push_back(Symbolizer *s)
Definition: Rule.cpp:138
The "ParameterValueType" uses WFS-Filter expressions to give values for SE graphic parameters...
std::unique_ptr< te::dt::Property > Convert2T5(const TeAttributeRep &attRep)
It creates a valid TerraLib 5 property given a valid TerraLib 4.x attribute representation.
This class contains the parameters needed for grouping the values of a Property.
Definition: Grouping.h:57
void Tokenize(const std::string &str, std::vector< std::string > &tokens, const std::string &delimiters=" ")
It tokenizes a given string with a delimiter of your own choice.
Definition: StringUtils.h:221
TEFEEXPORT te::fe::Filter * CreateFilterByStep(const std::string &attrName, const std::string &minValue, const std::string &maxValue)
TEFEEXPORT te::fe::Filter * CreateFilterByUniqueValue(const std::string &attrName, const std::string &value)
te::gm::GeomType Convert2T5GeomType(TeAttrDataType type)
The FeatureTypeStyle defines the styling that is to be applied to a dataset that can be viewed as a f...
void setColorCompositionType(ColorCompositionType cct)
void setChannelSelection(ChannelSelection *c)
void setTitle(const std::string &title)
Definition: Description.cpp:33
te::se::PolygonSymbolizer * GetPolygonSymbolizer(TeVisual *visual)
void removeRules()
Definition: Style.cpp:120
void setPropertyType(const int &type)
It sets the property type whose values will be grouped.
Definition: Grouping.cpp:83
TESEEXPORT Graphic * CreateGraphic(Mark *mark, const std::string &size, const std::string &rotation, const std::string &opacity)
Creates a graphic.
The RasterSymbolizer describes how to render raster/matrix-coverage data (e.g., satellite photos...
A Fill specifies the pattern for filling an area geometry.
Definition: Fill.h:59
void setOpacity(ParameterValue *p)
void setSymbolizers(const std::vector< Symbolizer * > &symbs)
Definition: Rule.cpp:152
TESEEXPORT Mark * CreateMark(const std::string &wellKnownName, Stroke *stroke, Fill *fill)
Creates a mark.
struct TeRaster_t TeRaster
Definition: CTypes.h:69
TESEEXPORT Stroke * CreateStroke(const std::string &color, const std::string &width)
Creates a stroke.
te::se::RasterSymbolizer * GetRasterSymbolizer(TeRasterTransform *visual)
GroupingType
The grouping type associated to the layer.
void setName(std::string *name)
Definition: Style.cpp:53
A Rule is used to attach property/scale conditions to and group the individual symbols used for rende...
Definition: Rule.h:76
void setOffset(ParameterValue *p)
A Stroke specifies the appearance of a linear geometry.
Definition: Stroke.h:67
te::se::LineSymbolizer * GetLineSymbolizer(TeVisual *visual)
A helper class for 32-bit RGBA (Red-Green-Blue-Alpha channel) color.
Definition: RGBAColor.h:57
void setSourceChannelName(const std::string &name)
A LineSymbolizer is used to style a stroke along a linear geometry type, such as a string of line seg...
void setBlueChannel(SelectedChannel *c)
void setThresholdsBelongTo(ThresholdsBelongToType t)
Definition: Categorize.cpp:104
void addThreshold(ParameterValue *v)
Definition: Categorize.cpp:94
A ColorMap defines either the colors of a pallette-type raster source or the mapping of numeric pixel...
Definition: ColorMap.h:61
void addValue(ParameterValue *v)
Definition: Categorize.cpp:99
void setFallbackValue(const std::string &v)
Definition: se/Function.cpp:33
TESEEXPORT PointSymbolizer * CreatePointSymbolizer(Graphic *graphic)
Creates a point symbolizer.
TESEEXPORT Fill * CreateFill(const std::string &color, const std::string &opacity)
Creates a fill.
void setGreenChannel(SelectedChannel *c)
te::map::GroupingType GetGroupingType(TeGroupingMode mode)
ChannelSelection specifies the false-color channel selection for a multi-spectral raster source (such...