All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 src/terralib/maptools/serialization/xml/Utils.cpp
22 
23  \brief Auxiliary functions to read layer information from a XML document.
24 */
25 
26 // TerraLib
27 #include "../../../se/serialization/xml/Symbolizer.h"
28 #include "../../../xml/AbstractWriter.h"
29 #include "../../../xml/Reader.h"
30 #include "../../AbstractLayer.h"
31 #include "../../Chart.h"
32 #include "../../Grouping.h"
33 #include "../../GroupingItem.h"
34 #include "Utils.h"
35 
36 // Boost
37 #include <boost/lexical_cast.hpp>
38 
39 // STL
40 #include <cassert>
41 
43 {
44  return (visible == "VISIBLE") ? te::map::VISIBLE :
45  (visible == "NOT_VISIBLE") ? te::map::NOT_VISIBLE :
47 }
48 
50 {
51  return (visible == te::map::VISIBLE) ? "VISIBLE" :
52  (visible == te::map::NOT_VISIBLE) ? "NOT_VISIBLE" :
53  "PARTIALLY_VISIBLE";
54 }
55 
57 {
58  if(type == "EQUAL_STEPS")
59  return te::map::EQUAL_STEPS;
60 
61  if(type == "QUANTIL")
62  return te::map::QUANTIL;
63 
64  if(type == "STD_DEVIATION")
66 
67  assert(type == "UNIQUE_VALUE");
68 
69  return te::map::UNIQUE_VALUE;
70 }
71 
73 {
74  switch(type)
75  {
77  return "EQUAL_STEPS";
78 
79  case te::map::QUANTIL:
80  return "QUANTIL";
81 
83  return "STD_DEVIATION";
84 
85  default:
86  {
87  assert(type == te::map::UNIQUE_VALUE);
88  return "UNIQUE_VALUE";
89  }
90  }
91 }
92 
94 {
95  assert(reader.getNodeType() == te::xml::START_ELEMENT);
96  assert(reader.getElementLocalName() == "Title");
97  reader.next();
98  assert(reader.getNodeType() == te::xml::VALUE);
99  std::string title = reader.getElementValue();
100  reader.next();
101  assert(reader.getNodeType() == te::xml::END_ELEMENT);
102 
103  return title;
104 }
105 
107 {
108  assert(reader.getNodeType() == te::xml::START_ELEMENT);
109  assert(reader.getElementLocalName() == "Visible");
110  reader.next();
111  assert(reader.getNodeType() == te::xml::VALUE);
112  std::string visible = reader.getElementValue();
113  reader.next();
114  assert(reader.getNodeType() == te::xml::END_ELEMENT);
115 
116  return visible;
117 }
118 
120 {
121  if(reader.getElementLocalName() != "Grouping")
122  return 0;
123 
124  /* Property Name */
125  reader.next();
126  assert(reader.getNodeType() == te::xml::START_ELEMENT);
127  assert(reader.getElementLocalName() == "PropertyName");
128  reader.next();
129  assert(reader.getNodeType() == te::xml::VALUE);
130  std::string propertyName = reader.getElementValue();
131  reader.next();
132  assert(reader.getNodeType() == te::xml::END_ELEMENT);
133 
134  /* Property Data Type */
135  reader.next();
136  assert(reader.getNodeType() == te::xml::START_ELEMENT);
137  assert(reader.getElementLocalName() == "PropertyDataType");
138  reader.next();
139  assert(reader.getNodeType() == te::xml::VALUE);
140  int propertyType = reader.getElementValueAsInt32();
141  reader.next();
142  assert(reader.getNodeType() == te::xml::END_ELEMENT);
143 
144  /* Grouping Type */
145  reader.next();
146  assert(reader.getNodeType() == te::xml::START_ELEMENT);
147  assert(reader.getElementLocalName() == "Type");
148  reader.next();
149  assert(reader.getNodeType() == te::xml::VALUE);
150  std::string type = reader.getElementValue();
151  reader.next();
152  assert(reader.getNodeType() == te::xml::END_ELEMENT);
153 
154  /* Precision */
155  reader.next();
156  assert(reader.getNodeType() == te::xml::START_ELEMENT);
157  assert(reader.getElementLocalName() == "Precision");
158  reader.next();
159  assert(reader.getNodeType() == te::xml::VALUE);
160  std::size_t precision = static_cast<std::size_t>(reader.getElementValueAsInt32());
161  reader.next();
162  assert(reader.getNodeType() == te::xml::END_ELEMENT);
163 
164  std::auto_ptr<te::map::Grouping> g(new te::map::Grouping(propertyName, GetGroupingType(type), precision));
165  g->setPropertyType(propertyType);
166 
167  /* Smmary */
168  reader.next();
169  if(reader.getElementLocalName() == "Summary")
170  {
171  assert(reader.getNodeType() == te::xml::START_ELEMENT);
172  reader.next();
173  assert(reader.getNodeType() == te::xml::VALUE);
174  std::string summary = reader.getElementValue();
175  reader.next();
176  assert(reader.getNodeType() == te::xml::END_ELEMENT);
177  g->setSummary(summary);
178  reader.next();
179  }
180 
181  if(reader.getElementLocalName() == "StandardDeviation")
182  {
183  assert(reader.getNodeType() == te::xml::START_ELEMENT);
184  reader.next();
185  assert(reader.getNodeType() == te::xml::VALUE);
186  double stdDeviation = reader.getElementValueAsDouble();
187  reader.next();
188  assert(reader.getNodeType() == te::xml::END_ELEMENT);
189 
190  g->setStdDeviation(stdDeviation);
191 
192  reader.next();
193  }
194 
195  /* Grouping Items */
196  std::vector<te::map::GroupingItem*> items;
197  while(reader.getNodeType() == te::xml::START_ELEMENT &&
198  reader.getElementLocalName() == "GroupingItem")
199  {
200  items.push_back(ReadGroupingItem(reader));
201  }
202 
203  assert(reader.getNodeType() == te::xml::END_ELEMENT);
204  reader.next();
205 
206  g->setGroupingItems(items);
207 
208  return g.release();
209 }
210 
212 {
213  assert(reader.getNodeType() == te::xml::START_ELEMENT);
214  assert(reader.getElementLocalName() == "GroupingItem");
215 
216  std::auto_ptr<te::map::GroupingItem> item(new te::map::GroupingItem);
217 
218  reader.next();
219 
220  /* Title */
221  assert(reader.getElementLocalName() == "Title");
222  reader.next();
223  assert(reader.getNodeType() == te::xml::VALUE);
224  std::string title = reader.getElementValue();
225  reader.next();
226  assert(reader.getNodeType() == te::xml::END_ELEMENT);
227 
228  item->setTitle(title);
229 
230  reader.next();
231  assert(reader.getNodeType() == te::xml::START_ELEMENT);
232 
233  if(reader.getElementLocalName() == "From")
234  {
235  /* From */
236  reader.next();
237  assert(reader.getNodeType() == te::xml::VALUE);
238  std::string fromValue = reader.getElementValue();
239  reader.next();
240  assert(reader.getNodeType() == te::xml::END_ELEMENT);
241 
242  item->setLowerLimit(fromValue);
243 
244  reader.next();
245 
246  /* To */
247  assert(reader.getNodeType() == te::xml::START_ELEMENT);
248  assert(reader.getElementLocalName() == "To");
249  reader.next();
250  assert(reader.getNodeType() == te::xml::VALUE);
251  std::string toValue = reader.getElementValue();
252  reader.next();
253  assert(reader.getNodeType() == te::xml::END_ELEMENT);
254 
255  item->setUpperLimit(toValue);
256 
257  reader.next();
258  }
259  else
260  {
261  /* Value */
262  assert(reader.getElementLocalName() == "Value");
263  reader.next();
264  assert(reader.getNodeType() == te::xml::VALUE);
265  std::string value = reader.getElementValue();
266  reader.next();
267  assert(reader.getNodeType() == te::xml::END_ELEMENT);
268 
269  item->setValue(value);
270 
271  reader.next();
272  }
273 
274  /* Symbolizers */
275  std::vector<te::se::Symbolizer*> symbs;
276  while(reader.getNodeType() == te::xml::START_ELEMENT &&
277  reader.getElementLocalName().find("Symbolizer") != std::string::npos)
278  {
279  symbs.push_back(te::se::serialize::Symbolizer::getInstance().read(reader));
280  }
281 
282  assert(reader.getNodeType() == te::xml::END_ELEMENT);
283  reader.next();
284 
285  item->setSymbolizers(symbs);
286 
287  return item.release();
288 }
289 
290 std::auto_ptr<te::map::Chart> te::map::serialize::ReadLayerChart(te::xml::Reader& reader)
291 {
292  if(reader.getElementLocalName() != "Chart")
293  return std::auto_ptr<te::map::Chart>();
294 
295  assert(reader.getNodeType() == te::xml::START_ELEMENT);
296  assert(reader.getElementLocalName() == "Chart");
297 
298  reader.next();
299 
300  assert(reader.getNodeType() == te::xml::START_ELEMENT);
301  assert(reader.getElementLocalName() == "Type");
302 
303  reader.next();
304 
305  assert(reader.getNodeType() == te::xml::VALUE);
306 
307  te::map::ChartType type = reader.getElementValue() == "PIE" ? te::map::Pie : te::map::Bar;
308 
309  reader.next();
310 
311  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Type
312 
313  reader.next();
314 
315  assert(reader.getNodeType() == te::xml::START_ELEMENT);
316  assert(reader.getElementLocalName() == "ContourColor");
317 
318  reader.next();
319 
320  assert(reader.getNodeType() == te::xml::VALUE);
321 
322  std::string hexColor = reader.getElementValue();
323 
324  te::color::RGBAColor contourColor(hexColor);
325 
326  reader.next();
327 
328  assert(reader.getNodeType() == te::xml::END_ELEMENT); // ContourColor
329 
330  reader.next();
331 
332  assert(reader.getNodeType() == te::xml::START_ELEMENT);
333  assert(reader.getElementLocalName() == "ContourWidth");
334 
335  reader.next();
336 
337  assert(reader.getNodeType() == te::xml::VALUE);
338 
339  std::size_t contourWidth = reader.getElementValueAsInt32();
340 
341  reader.next();
342 
343  assert(reader.getNodeType() == te::xml::END_ELEMENT); // ContourWidth
344 
345  reader.next();
346 
347  assert(reader.getNodeType() == te::xml::START_ELEMENT);
348  assert(reader.getElementLocalName() == "Height");
349 
350  reader.next();
351 
352  assert(reader.getNodeType() == te::xml::VALUE);
353 
354  std::size_t height = reader.getElementValueAsInt32();
355 
356  reader.next();
357 
358  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Height
359 
360  reader.next();
361 
362  std::size_t barWidth = -1;
363 
364  if(reader.getNodeType() == te::xml::START_ELEMENT &&
365  reader.getElementLocalName() == "BarWidth")
366  {
367  reader.next();
368 
369  assert(reader.getNodeType() == te::xml::VALUE);
370 
371  barWidth = reader.getElementValueAsInt32();
372 
373  reader.next();
374 
375  assert(reader.getNodeType() == te::xml::END_ELEMENT); // BarWidth
376 
377  reader.next();
378  }
379 
380  assert(reader.getNodeType() == te::xml::START_ELEMENT);
381  assert(reader.getElementLocalName() == "IsVisible");
382 
383  reader.next();
384 
385  assert(reader.getNodeType() == te::xml::VALUE);
386 
387  bool isVisible = reader.getElementValueAsBoolean();
388 
389  reader.next();
390 
391  assert(reader.getNodeType() == te::xml::END_ELEMENT); // IsVisible
392 
393  reader.next();
394 
395  double maxValue = 0;
396  if(type == te::map::Bar)
397  {
398  assert(reader.getNodeType() == te::xml::START_ELEMENT);
399  assert(reader.getElementLocalName() == "MaxValue");
400 
401  reader.next();
402 
403  assert(reader.getNodeType() == te::xml::VALUE);
404 
405  maxValue = reader.getElementValueAsDouble();
406 
407  reader.next();
408 
409  assert(reader.getNodeType() == te::xml::END_ELEMENT); // MaxValue
410 
411  reader.next();
412  }
413 
414  std::string summary = "NONE";
415  if(reader.getNodeType() == te::xml::START_ELEMENT &&
416  reader.getElementLocalName() == "Summary")
417  {
418  reader.next();
419 
420  assert(reader.getNodeType() == te::xml::VALUE);
421 
422  summary = reader.getElementValue();
423 
424  reader.next();
425 
426  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Summary
427 
428  reader.next();
429  }
430 
431  std::vector<std::string> properties;
432  std::vector<te::color::RGBAColor> colors;
433 
434  while(reader.getNodeType() == te::xml::START_ELEMENT &&
435  reader.getElementLocalName() == "Slice")
436  {
437  reader.next();
438 
439  assert(reader.getNodeType() == te::xml::START_ELEMENT);
440  assert(reader.getElementLocalName() == "PropertyName");
441 
442  reader.next();
443 
444  assert(reader.getNodeType() == te::xml::VALUE);
445 
446  std::string propName = reader.getElementValue();
447 
448  reader.next();
449 
450  assert(reader.getNodeType() == te::xml::END_ELEMENT); // PropertyName
451 
452  reader.next();
453 
454  assert(reader.getNodeType() == te::xml::START_ELEMENT);
455  assert(reader.getElementLocalName() == "Color");
456 
457  reader.next();
458 
459  assert(reader.getNodeType() == te::xml::VALUE);
460 
461  std::string hColor = reader.getElementValue();
462  te::color::RGBAColor color(hColor);
463 
464  reader.next();
465  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Color
466 
467  reader.next();
468  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Slice
469 
470  reader.next();
471 
472  properties.push_back(propName);
473  colors.push_back(hColor);
474  }
475 
476  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Chart
477 
478  reader.next();
479 
480  std::auto_ptr<te::map::Chart> chart(new te::map::Chart(type, properties, colors));
481  chart->setContourColor(contourColor);
482  chart->setContourWidth(contourWidth);
483  chart->setHeight(height);
484  chart->setVisibility(isVisible);
485  chart->setSummary(summary);
486  if(barWidth != -1)
487  chart->setBarWidth(barWidth);
488  if(type == te::map::Bar)
489  chart->setMaxValue(maxValue);
490 
491  return chart;
492 }
493 
495 {
496  writer.writeStartElement("te_map:Chart");
497 
498  te::map::ChartType type = chart->getType();
499 
500  writer.writeElement("te_map:Type", (type == te::map::Pie ? "PIE" : "BAR"));
501 
502  writer.writeElement("te_map:ContourColor", chart->getContourColor().getColor());
503 
504  writer.writeElement("te_map:ContourWidth", boost::lexical_cast<int>(chart->getContourWidth()));
505 
506  writer.writeElement("te_map:Height", boost::lexical_cast<int>(chart->getHeight()));
507 
508  if(chart->getType() == te::map::Bar)
509  writer.writeElement("te_map:BarWidth", boost::lexical_cast<int>(chart->getBarWidth()));
510 
511  writer.writeElement("te_map:IsVisible", (chart->isVisible() ? "true" : "false"));
512 
513  if(chart->getType() == te::map::Bar)
514  writer.writeElement("te_map:MaxValue", chart->getMaxValue());
515 
516  if(chart->getSummary() != "NONE")
517  writer.writeElement("te_map:Summary", chart->getSummary());
518 
519  std::vector<std::string> properties = chart->getProperties();
520 
521  for(std::size_t i = 0; i < properties.size(); ++i)
522  {
523  writer.writeStartElement("te_map:Slice");
524 
525  writer.writeElement("te_map:PropertyName", properties[i]);
526 
527  writer.writeElement("te_map:Color", chart->getColor(i).getColor());
528 
529  writer.writeEndElement("te_map:Slice");
530  }
531 
532  writer.writeEndElement("te_map:Chart");
533 }
534 
536 {
537  writer.writeStartElement("te_map:Grouping");
538 
539  te::map::GroupingType type = g->getType();
540 
541  writer.writeElement("te_map:PropertyName", g->getPropertyName());
542  writer.writeElement("te_map:PropertyDataType", g->getPropertyType());
543  writer.writeElement("te_map:Type", GetGroupingType(type));
544  writer.writeElement("te_map:Precision", static_cast<unsigned int>(g->getPrecision()));
545 
546  if(g->getSummary() != "NONE")
547  writer.writeElement("te_map:Summary", g->getSummary());
548 
549  if(type == te::map::STD_DEVIATION)
550  writer.writeElement("te_map:StandardDeviation", g->getStdDeviation());
551 
552  const std::vector<te::map::GroupingItem*>& items = g->getGroupingItems();
553 
554  for(std::size_t i = 0; i < items.size(); ++i)
555  {
556  te::map::GroupingItem* item = items[i];
557  assert(item);
558 
559  writer.writeStartElement("te_map:GroupingItem");
560 
561  writer.writeElement("te_map:Title", item->getTitle());
562 
563  if(type != te::map::UNIQUE_VALUE)
564  {
565  writer.writeElement("te_map:From", item->getLowerLimit());
566  writer.writeElement("te_map:To", item->getUpperLimit());
567  }
568  else
569  writer.writeElement("te_map:Value", item->getValue());
570 
571  const std::vector<te::se::Symbolizer*>& symbs = item->getSymbolizers();
572 
573  for(std::size_t j = 0; j < symbs.size(); ++j)
574  te::se::serialize::Symbolizer::getInstance().write(symbs[j], writer);
575 
576  writer.writeEndElement("te_map:GroupingItem");
577  }
578 
579  writer.writeEndElement("te_map:Grouping");
580 }
581 
583 {
584  writer.writeAttribute("id", layer->getId());
585  writer.writeElement("te_map:Title", layer->getTitle());
586  writer.writeElement("te_map:Visible", GetVisibility(layer->getVisibility()));
587 
588  te::map::Grouping* g = layer->getGrouping();
589 
590  if(g != 0)
591  WriteLayerGrouping(g, writer);
592 
593  te::map::Chart* chart = layer->getChart();
594 
595  if(chart != 0)
596  WriteLayerChart(chart, writer);
597 }
TEMAPEXPORT std::string ReadLayerVisibility(te::xml::Reader &reader)
Definition: Utils.cpp:106
TEMAPEXPORT void WriteAbstractLayer(const te::map::AbstractLayer *layer, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:582
virtual const std::string & getId() const
It returns the layer id.
ChartType
The chart types.
Definition: Enums.h:163
TEMAPEXPORT te::map::GroupingItem * ReadGroupingItem(te::xml::Reader &reader)
Definition: Utils.cpp:211
ChartType getType() const
Definition: Chart.cpp:78
const std::vector< std::string > & getProperties() const
Definition: Chart.cpp:83
Auxiliary functions to read layer information from a XML document.
const double getStdDeviation() const
It gets the standard deviation used in the Standard Deviation grouping.
Definition: Grouping.cpp:120
virtual boost::int32_t getElementValueAsInt32() const
It returns the element data value in the case of VALUE node.
Definition: Reader.cpp:32
std::size_t getBarWidth() const
Definition: Chart.cpp:157
This class models a XML reader object.
Definition: Reader.h:55
This is the base class for layers.
Definition: AbstractLayer.h:76
std::string getSummary() const
It gets the grouping summary. It is used only in case 1 to n.
Definition: Chart.cpp:197
int getPropertyType() const
It gets the property type whose values will be grouped.
Definition: Grouping.cpp:79
const std::string & getValue() const
It gets the value of the legend item.
virtual const std::string & getTitle() const
It returns the layer title.
TEMAPEXPORT std::auto_ptr< te::map::Chart > ReadLayerChart(te::xml::Reader &reader)
Definition: Utils.cpp:290
virtual void writeStartElement(const std::string &qName)=0
const size_t getPrecision() const
It gets the precision used for the property values.
Definition: Grouping.cpp:100
TEMAPEXPORT std::string ReadLayerTitle(te::xml::Reader &reader)
Definition: Utils.cpp:93
std::string getPropertyName() const
It gets the property name whose values will be grouped.
Definition: Grouping.cpp:68
TEMAPEXPORT void WriteLayerGrouping(te::map::Grouping *g, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:535
virtual Visibility getVisibility() const
It returns the layer visibility.
This class models a XML writer object.
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
TEMAPEXPORT te::map::Grouping * ReadLayerGrouping(te::xml::Reader &reader)
Definition: Utils.cpp:119
virtual te::map::Chart * getChart() const
It returns the Chart associated to the Layer.
double getMaxValue() const
Definition: Chart.cpp:172
This class contains the parameters needed for grouping the values of a Property.
Definition: Grouping.h:59
const te::color::RGBAColor & getColor(std::size_t i) const
Definition: Chart.cpp:98
virtual void writeElement(const std::string &qName, const std::string &value)=0
This class represents the informations needed to build map charts.
Definition: Chart.h:51
static T & getInstance()
It returns a reference to the singleton instance.
Definition: Singleton.h:120
virtual double getElementValueAsDouble() const
It returns the element data value in the case of VALUE node.
Definition: Reader.cpp:37
A GroupingItem contains information about a grouping item associated to a layer.
Definition: GroupingItem.h:48
std::size_t getHeight() const
Definition: Chart.cpp:132
bool isVisible() const
It gets the chart visibility.
Definition: Chart.cpp:177
TEMAPEXPORT te::map::GroupingType GetGroupingType(const std::string &type)
Definition: Utils.cpp:56
virtual bool getElementValueAsBoolean() const
It returns the element data value in the case of VALUE node.
Definition: Reader.cpp:42
TEMAPEXPORT te::map::Visibility GetVisibility(const std::string &visible)
Definition: Utils.cpp:42
te::map::GroupingType GetGroupingType(TeGroupingMode mode)
Definition: Utils.cpp:75
virtual void writeAttribute(const std::string &attName, const std::string &value)=0
const std::vector< te::map::GroupingItem * > & getGroupingItems() const
It gets the vector of grouping items.
Definition: Grouping.cpp:130
GroupingType
The grouping type associated to the layer.
Definition: Enums.h:150
std::size_t getContourWidth() const
Definition: Chart.cpp:122
const te::color::RGBAColor & getContourColor() const
Definition: Chart.cpp:112
const std::string & getUpperLimit() const
It gets the upper limit value of the legend item.
virtual te::map::Grouping * getGrouping() const
It returns the Grouping associated to the Layer.
std::string getSummary() const
It gets the grouping summary. It is used only in case 1 to n.
Definition: Grouping.cpp:152
virtual NodeType getNodeType() const =0
It return the type of node read.
std::string getColor() const
It gets the color encoded using two hexadecimal digits per primary-color component, in the order Red, Green, Blue, prefixed with a hash (#) sign.
Definition: RGBAColor.h:349
A helper class for 32-bit RGBA (Red-Green-Blue-Alpha channel) color.
Definition: RGBAColor.h:57
const GroupingType getType() const
It gets the grouping type.
Definition: Grouping.cpp:90
virtual std::string getElementValue() const =0
It returns the element data value in the case of VALUE node.
virtual void writeEndElement(const std::string &qName)=0
Visibility
Each layer can have three states of visibility.
Definition: Enums.h:138
std::string getTitle()
It gets the title of the legend item.
const std::string & getLowerLimit() const
It gets the lower limit value of the legend item.
const std::vector< te::se::Symbolizer * > & getSymbolizers() const
It gets the symbolizer of the legend item.
virtual bool next()=0
It gets the next event to be read.
TEMAPEXPORT void WriteLayerChart(te::map::Chart *chart, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:494