serialization/xml/Symbolizer.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/se/serialization/xml/Symbolizer.cpp
22 
23  \brief Auxiliary classes and functions to serialize symbolizer informations from a XML document.
24 */
25 
26 // TerraLib
27 #include "../../../core/translator/Translator.h"
28 #include "../../../fe/Expression.h"
29 #include "../../../maptools/Utils.h"
30 #include "../../../xml/AbstractWriter.h"
31 #include "../../../xml/Reader.h"
32 #include "../../../se/LineSymbolizer.h"
33 #include "../../../se/ParameterValue.h"
34 #include "../../../se/PointSymbolizer.h"
35 #include "../../../se/PolygonSymbolizer.h"
36 #include "../../../se/RasterSymbolizer.h"
37 #include "../../../se/TextSymbolizer.h"
38 #include "../../../xlink/serialization/xml/XLinkSerializer.h"
39 #include "../../Exception.h"
40 #include "../../Utils.h"
41 #include "Symbolizer.h"
42 #include "SymbologySerializer.h"
43 #include "Utils.h"
44 
45 // STL
46 #include <cassert>
47 
48 // Boost
49 #include <boost/format.hpp>
50 
56 
57 void LineSymbolizerWriter(const te::se::Symbolizer* symbolizer, te::xml::AbstractWriter& writer);
61 void TextSymbolizerWriter(const te::se::Symbolizer* symbolizer, te::xml::AbstractWriter& writer);
62 
63 void te::se::serialize::Symbolizer::reg(const std::string& symbolizerType, const SymbolizerFnctSerializeType& fncts)
64 {
65  m_fncts[symbolizerType] = fncts;
66 }
67 
69 {
70  std::string symbolizerType = reader.getElementLocalName();
71 
72  SymbolizerFnctIdxType::const_iterator it = m_fncts.find(symbolizerType);
73 
74  if(it == m_fncts.end())
75  throw Exception((boost::format(TE_TR("Could not find a reader for the following symbolizer type: %1%.")) % symbolizerType).str());
76 
77  assert(it->second.second);
78 
79  return it->second.first(reader);
80 }
81 
83 {
84  assert(symbolizer);
85 
86  SymbolizerFnctIdxType::const_iterator it = m_fncts.find(symbolizer->getType());
87 
88  if(it == m_fncts.end())
89  throw Exception((boost::format(TE_TR("Could not find a writer for the following symbolizer type: %1%.")) % symbolizer->getType()).str());
90 
91  assert(it->second.second);
92 
93  return it->second.second(symbolizer, writer);
94 }
95 
97 
99 {
105 }
106 
108 {
109  assert(reader.getNodeType() == te::xml::START_ELEMENT);
110  assert(reader.getElementLocalName() == "LineSymbolizer");
111 
112  std::unique_ptr<te::se::LineSymbolizer> ls(new te::se::LineSymbolizer);
113 
114  // Common elements & attributes of Symbolizers
115  te::se::serialize::ReadSymbolizerHelper(ls.get(), reader);
116 
117  // Geometry
118  if(reader.getElementLocalName() == "Geometry")
119  ls->setGeometry(te::se::serialize::ReadGeometryPropertyHelper(reader));
120 
121  // Stroke
122  if(reader.getElementLocalName() == "Stroke")
123  ls->setStroke(te::se::serialize::ReadStroke(reader));
124 
125  // PerpendicularOffset
126  if(reader.getElementLocalName() == "PerpendicularOffset")
127  {
128  reader.next();
129  ls->setPerpendicularOffset(te::se::serialize::ReadParameterValue(reader));
130  assert(reader.getNodeType() == te::xml::END_ELEMENT);
131  reader.next();
132  }
133 
134  assert(reader.getNodeType() == te::xml::END_ELEMENT);
135  reader.next();
136 
137  return ls.release();
138 }
139 
141 {
142  assert(reader.getNodeType() == te::xml::START_ELEMENT);
143  assert(reader.getElementLocalName() == "PointSymbolizer");
144 
145  std::unique_ptr<te::se::PointSymbolizer> ps(new te::se::PointSymbolizer);
146 
147  // Common elements & attributes of Symbolizers
148  te::se::serialize::ReadSymbolizerHelper(ps.get(), reader);
149 
150  // Geometry
151  if(reader.getElementLocalName() == "Geometry")
152  ps->setGeometry(te::se::serialize::ReadGeometryPropertyHelper(reader));
153 
154  // Graphic
155  if(reader.getElementLocalName() == "Graphic")
156  ps->setGraphic(te::se::serialize::ReadGraphic(reader));
157 
158  assert(reader.getNodeType() == te::xml::END_ELEMENT);
159  reader.next();
160 
161  return ps.release();
162 }
163 
165 {
166  assert(reader.getNodeType() == te::xml::START_ELEMENT);
167  assert(reader.getElementLocalName() == "PolygonSymbolizer");
168 
169  std::unique_ptr<te::se::PolygonSymbolizer> ps(new te::se::PolygonSymbolizer);
170 
171  // Common elements & attributes of Symbolizers
172  te::se::serialize::ReadSymbolizerHelper(ps.get(), reader);
173 
174  // Geometry
175  if(reader.getElementLocalName() == "Geometry")
176  ps->setGeometry(te::se::serialize::ReadGeometryPropertyHelper(reader));
177 
178  // Fill
179  if(reader.getElementLocalName() == "Fill")
180  ps->setFill( te::se::serialize::ReadFill(reader));
181 
182  // Stroke
183  if(reader.getElementLocalName() == "Stroke")
184  ps->setStroke(te::se::serialize::ReadStroke(reader));
185 
186  // Displacement
187  if(reader.getElementLocalName() == "Displacement")
188  ps->setDisplacement(te::se::serialize::ReadDisplacement(reader));
189 
190  // PerpendicularOffset
191  if(reader.getElementLocalName() == "PerpendicularOffset")
192  {
193  reader.next();
194  ps->setPerpendicularOffset(te::se::serialize::ReadParameterValue(reader));
195  assert(reader.getNodeType() == te::xml::END_ELEMENT);
196  reader.next();
197  }
198 
199  assert(reader.getNodeType() == te::xml::END_ELEMENT);
200  reader.next();
201 
202  return ps.release();
203 }
204 
206 {
207  assert(reader.getNodeType() == te::xml::START_ELEMENT);
208  assert(reader.getElementLocalName() == "RasterSymbolizer");
209 
210  std::unique_ptr<te::se::RasterSymbolizer> rs(new te::se::RasterSymbolizer);
211 
212  // Common elements & attributes of Symbolizers
213  te::se::serialize::ReadSymbolizerHelper(rs.get(), reader);
214 
215  // TODO: Missing <Geometry> - <ogc:PropertyName> attribute on te::se::RasterSymbolizer
216 
217  // Opacity
218  if(reader.getElementLocalName() == "Opacity")
219  {
220  reader.next();
221  rs->setOpacity(te::se::serialize::ReadParameterValue(reader));
222  }
223 
224  // ChannelSelection
225  if(reader.getElementLocalName() == "ChannelSelection")
226  rs->setChannelSelection(te::se::serialize::ReadChannelSelection(reader));
227 
228  // OverlapBehavior
229  if(reader.getElementLocalName() == "OverlapBehavior")
230  rs->setOverlapBehavior(te::se::serialize::ReadOverlapBehavior(reader));
231 
232  // ColorMap
233  if(reader.getElementLocalName() == "ColorMap")
234  rs->setColorMap(te::se::serialize::ReadColorMap(reader));
235 
236  // ContrastEnhancement
237  if(reader.getElementLocalName() == "ContrastEnhancement")
238  rs->setContrastEnhancement(te::se::serialize::ReadContrastEnhancement(reader));
239 
240  // ShadedRelief
241  if(reader.getElementLocalName() == "ShadedRelief")
242  rs->setShadedRelief(te::se::serialize::ReadShadedRelief(reader));
243 
244  // ImageOutline
245  if(reader.getElementLocalName() == "ImageOutline")
246  rs->setImageOutline(te::se::serialize::ReadImageOutline(reader));
247 
248  // Gain (TerraLib extension)
249  if(reader.getElementLocalName() == "Gain")
250  {
251  reader.next();
252  std::string gain = reader.getElementValue();
253  rs->setGain(new te::se::ParameterValue(gain));
254  reader.next();
255  assert(reader.getNodeType() == te::xml::END_ELEMENT);
256  reader.next();
257  }
258 
259  std::string aaaa = reader.getElementLocalName();
260 
261  // Offset (TerraLib extension)
262  if(reader.getElementLocalName() == "Offset")
263  {
264  reader.next();
265  std::string offset = reader.getElementValue();
266  rs->setOffset(new te::se::ParameterValue(offset));
267  reader.next();
268  assert(reader.getNodeType() == te::xml::END_ELEMENT);
269  reader.next();
270  }
271 
272  // noDataValue (TerraLib extension)
273  if (reader.getElementLocalName() == "NoDataValue")
274  {
275  reader.next();
276  std::string noDataValue = reader.getElementValue();
277  rs->setNoDataValue(new te::se::ParameterValue(noDataValue));
278  reader.next();
279  assert(reader.getNodeType() == te::xml::END_ELEMENT);
280  reader.next();
281  }
282 
283  assert(reader.getNodeType() == te::xml::END_ELEMENT);
284  reader.next();
285 
286  return rs.release();
287 }
288 
290 {
291  assert(reader.getNodeType() == te::xml::START_ELEMENT);
292  assert(reader.getElementLocalName() == "TextSymbolizer");
293 
294  std::unique_ptr<te::se::TextSymbolizer> ts(new te::se::TextSymbolizer);
295 
296  // Common elements & attributes of Symbolizers
297  te::se::serialize::ReadSymbolizerHelper(ts.get(), reader);
298 
299  // Geometry
300  if(reader.getElementLocalName() == "Geometry")
301  ts->setGeometry(te::se::serialize::ReadGeometryPropertyHelper(reader));
302 
303  // Label
304  if(reader.getElementLocalName() == "Label")
305  {
306  reader.next();
307  ts->setLabel(te::se::serialize::ReadParameterValue(reader));
308  }
309 
310  // Font
311  if(reader.getElementLocalName() == "Font")
312  ts->setFont(te::se::serialize::ReadFont(reader));
313 
314  // LabelPlacement
315  if(reader.getElementLocalName() == "LabelPlacement")
316  ts->setLabelPlacement(te::se::serialize::ReadLabelPlacement(reader));
317 
318  // Halo
319  if(reader.getElementLocalName() == "Halo")
320  ts->setHalo(te::se::serialize::ReadHalo(reader));
321 
322  // Fill
323  if(reader.getElementLocalName() == "Fill")
324  ts->setFill(te::se::serialize::ReadFill(reader));
325 
326  assert(reader.getNodeType() == te::xml::END_ELEMENT);
327  reader.next();
328 
329  return ts.release();
330 }
331 
333 {
334  const te::se::LineSymbolizer* ls = dynamic_cast<const te::se::LineSymbolizer*>(symbolizer);
335 
336  if(ls == nullptr)
337  return;
338 
339  writer.writeStartElement("se:LineSymbolizer");
340 
341  // Common elements & attributes of Symbolizers
343 
344  // Specific elements of LineSymbolizer
346  te::se::serialize::Save(ls->getStroke(), writer);
347  te::se::serialize::WriteParameterValuePtrHelper("se:PerpendicularOffset", ls->getPerpendicularOffset(), writer);
348 
349  writer.writeEndElement("se:LineSymbolizer");
350 }
351 
353 {
354  const te::se::PointSymbolizer* ps = dynamic_cast<const te::se::PointSymbolizer*>(symbolizer);
355 
356  if(ps == nullptr)
357  return;
358 
359  writer.writeStartElement("se:PointSymbolizer");
360 
361  // Common elements & attributes of Symbolizers
363 
364  // Specific elements of PointSymbolizer
366  te::se::serialize::Save(ps->getGraphic(), writer);
367 
368  writer.writeEndElement("se:PointSymbolizer");
369 }
370 
372 {
373  const te::se::PolygonSymbolizer* ps = dynamic_cast<const te::se::PolygonSymbolizer*>(symbolizer);
374 
375  if(ps == nullptr)
376  return;
377 
378  writer.writeStartElement("se:PolygonSymbolizer");
379 
380  // Common elements & attributes of Symbolizers
382 
383  // Specific elements of PolygonSymbolizer
385  te::se::serialize::Save(ps->getFill(), writer);
386  te::se::serialize::Save(ps->getStroke(), writer);
388  te::se::serialize::WriteParameterValuePtrHelper("se:PerpendicularOffset", ps->getPerpendicularOffset(), writer);
389 
390  writer.writeEndElement("se:PolygonSymbolizer");
391 }
392 
394 {
395  const te::se::RasterSymbolizer* rs = dynamic_cast<const te::se::RasterSymbolizer*>(symbolizer);
396 
397  if(rs == nullptr)
398  return;
399 
400  writer.writeStartElement("se:RasterSymbolizer");
401 
402  // Common elements & attributes of Symbolizers
404 
405  // Specific elements of RasterSymbolizer
406  // TODO: Missing <Geometry> - <ogc:PropertyName> attribute on te::se::RasterSymbolizer
407  te::se::serialize::WriteParameterValuePtrHelper("se:Opacity", rs->getOpacity(), writer);
408  //te::serialize::WriteParameterValuePtrHelper("Gain", rs->getGain(), writer); // Offset (TerraLib extension) TODO: In this case, how deal with xsd?!
409  //te::serialize::WriteParameterValuePtrHelper("Offset", rs->getOffset(), writer); // Offset (TerraLib extension) TODO: In this case, how deal with xsd?!
412  te::se::serialize::Save(rs->getColorMap(), writer);
416 
417  double gain = GetDouble(rs->getGain());
418  writer.writeElement("se:Gain", gain);
419 
420  double offset = GetDouble(rs->getOffset());
421  writer.writeElement("se:Offset", offset);
422 
423  if (rs->getNoDataValue())
424  {
425  double noDataValue = GetDouble(rs->getNoDataValue());
426  writer.writeElement("se:NoDataValue", noDataValue);
427  }
428 
429  writer.writeEndElement("se:RasterSymbolizer");
430 }
431 
433 {
434  const te::se::TextSymbolizer* ts = dynamic_cast<const te::se::TextSymbolizer*>(symbolizer);
435 
436  if(ts == nullptr)
437  return;
438 
439  writer.writeStartElement("se:TextSymbolizer");
440 
441  // Common elements & attributes of Symbolizers
443 
444  // Specific elements of TextSymbolizer
446  te::se::serialize::Save(ts->getFont(), writer);
448  te::se::serialize::Save(ts->getHalo(), writer);
449  te::se::serialize::Save(ts->getFill(), writer);
450 
451  writer.writeEndElement("se:TextSymbolizer");
452 }
A TextSymbolizer is used to render text labels according to various graphical parameters.
const Fill * getFill() const
Gets the Fill associates with the PolygonSymbolizer.
te::se::Symbolizer * TextSymbolizerReader(te::xml::Reader &reader)
const LabelPlacement * getLabelPlacement() const
const Graphic * getGraphic() const
void LineSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
const te::fe::PropertyName * getGeometry() const
This class models a XML reader object.
Definition: xml/Reader.h:55
A PolygonSymbolizer is used to draw a polygon (or other area-type geometries), including filling its ...
virtual void writeStartElement(const std::string &qName)=0
Base exception class for plugin module.
A Symbolizer describes how a feature is to appear on a map.
Definition: Symbolizer.h:80
te::se::Symbolizer * PolygonSymbolizerReader(te::xml::Reader &reader)
const te::fe::PropertyName * getGeometry() const
ParameterValue * getOffset() const
void PointSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
te::se::ChannelSelection * getChannelSelection() const
std::pair< SymbolizerReadFnctType, SymbolizerWriteFnctType > SymbolizerFnctSerializeType
A PointSymbolizer specifies the rendering of a graphic Symbolizer at a point.
TESEEXPORT te::se::ContrastEnhancement * ReadContrastEnhancement(te::xml::Reader &reader)
TESEEXPORT double GetDouble(const te::se::ParameterValue *param)
It gets the parameter value as a double.
This class models a XML writer object.
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:242
TESEEXPORT te::se::Fill * ReadFill(te::xml::Reader &reader)
TESEEXPORT te::se::Halo * ReadHalo(te::xml::Reader &reader)
The "ParameterValueType" uses WFS-Filter expressions to give values for SE graphic parameters...
TESEEXPORT te::se::ParameterValue * ReadParameterValue(te::xml::Reader &reader)
te::se::ContrastEnhancement * getContrastEnhancement() const
te::se::Symbolizer * LineSymbolizerReader(te::xml::Reader &reader)
te::se::Symbolizer * RasterSymbolizerReader(te::xml::Reader &reader)
TESEEXPORT te::se::Stroke * ReadStroke(te::xml::Reader &reader)
ParameterValue * getGain() const
ShadedRelief * getShadedRelief() const
TESEEXPORT RasterSymbolizer::OverlapBehavior ReadOverlapBehavior(te::xml::Reader &reader)
virtual void writeElement(const std::string &qName, const std::string &value)=0
void WriteSymbolizerHelper(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
te::se::Symbolizer * read(te::xml::Reader &reader) const
void reg(const std::string &symbolizerType, const SymbolizerFnctSerializeType &fncts)
TESEEXPORT te::se::Displacement * ReadDisplacement(te::xml::Reader &reader)
ParameterValue * getOpacity() const
Auxiliary classes and functions to serialize Symbolizer informations from a XML document.
OverlapBehavior getOverlapBehavior() const
const Stroke * getStroke() const
Gets the Stroke associates with the PolygonSymbolizer.
The RasterSymbolizer describes how to render raster/matrix-coverage data (e.g., satellite photos...
void WriteGeometryPropertyHelper(const te::fe::PropertyName *p, te::xml::AbstractWriter &writer)
const ParameterValue * getPerpendicularOffset() const
te::fe::PropertyName * ReadGeometryPropertyHelper(te::xml::Reader &reader)
const Font * getFont() const
TESEEXPORT void Save(const te::se::AnchorPoint *ap, te::xml::AbstractWriter &writer)
const Displacement * getDisplacement() const
TESEEXPORT te::se::ColorMap * ReadColorMap(te::xml::Reader &reader)
TESEEXPORT te::se::LabelPlacement * ReadLabelPlacement(te::xml::Reader &reader)
const Stroke * getStroke() const
Data serialization for the Symbology Encoder module.
const te::fe::PropertyName * getGeometry() const
void TextSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
const ParameterValue * getLabel() const
const ParameterValue * getPerpendicularOffset() const
TESEEXPORT te::se::ChannelSelection * ReadChannelSelection(te::xml::Reader &reader)
virtual const std::string & getType() const =0
It returns the symbolizer type.
boost::function< te::se::Symbolizer *(te::xml::Reader &)> SymbolizerReadFnctType
TESEEXPORT te::se::ImageOutline * ReadImageOutline(te::xml::Reader &reader)
virtual void writeEndElement(const std::string &qName)=0
A LineSymbolizer is used to style a stroke along a linear geometry type, such as a string of line seg...
TESEEXPORT te::se::Font * ReadFont(te::xml::Reader &reader)
virtual std::string getElementValue() const =0
It returns the element data value in the case of VALUE node.
const Fill * getFill() const
virtual NodeType getNodeType() const =0
It return the type of node read.
te::se::ColorMap * getColorMap() const
void write(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer) const
void PolygonSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
boost::function< void(const te::se::Symbolizer *, te::xml::AbstractWriter &)> SymbolizerWriteFnctType
void WriteParameterValuePtrHelper(const std::string &elementName, const te::se::ParameterValue *p, te::xml::AbstractWriter &writer)
Utility functions for MapTools module.
ParameterValue * getNoDataValue() const
const Halo * getHalo() const
virtual bool next()=0
It gets the next event to be read.
te::se::Symbolizer * PointSymbolizerReader(te::xml::Reader &reader)
void ReadSymbolizerHelper(te::se::Symbolizer *symbolizer, te::xml::Reader &reader)
void RasterSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
TESEEXPORT te::se::Graphic * ReadGraphic(te::xml::Reader &reader)
TESEEXPORT te::se::ShadedRelief * ReadShadedRelief(te::xml::Reader &reader)
te::se::ImageOutline * getImageOutline() const