All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 "../../../common/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 {
98 }
99 
101 {
102  m_fncts["LineSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&LineSymbolizerReader), SymbolizerWriteFnctType(&LineSymbolizerWriter));
103  m_fncts["PointSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&PointSymbolizerReader), SymbolizerWriteFnctType(&PointSymbolizerWriter));
104  m_fncts["PolygonSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&PolygonSymbolizerReader), SymbolizerWriteFnctType(&PolygonSymbolizerWriter));
105  m_fncts["RasterSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&RasterSymbolizerReader), SymbolizerWriteFnctType(&RasterSymbolizerWriter));
106  m_fncts["TextSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&TextSymbolizerReader), SymbolizerWriteFnctType(&TextSymbolizerWriter));
107 }
108 
110 {
111  assert(reader.getNodeType() == te::xml::START_ELEMENT);
112  assert(reader.getElementLocalName() == "LineSymbolizer");
113 
114  std::auto_ptr<te::se::LineSymbolizer> ls(new te::se::LineSymbolizer);
115 
116  // Common elements & attributes of Symbolizers
117  te::se::serialize::ReadSymbolizerHelper(ls.get(), reader);
118 
119  // Geometry
120  if(reader.getElementLocalName() == "Geometry")
121  ls->setGeometry(te::se::serialize::ReadGeometryPropertyHelper(reader));
122 
123  // Stroke
124  if(reader.getElementLocalName() == "Stroke")
125  ls->setStroke(te::se::serialize::ReadStroke(reader));
126 
127  // PerpendicularOffset
128  if(reader.getElementLocalName() == "PerpendicularOffset")
129  {
130  reader.next();
131  ls->setPerpendicularOffset(te::se::serialize::ReadParameterValue(reader));
132  assert(reader.getNodeType() == te::xml::END_ELEMENT);
133  reader.next();
134  }
135 
136  assert(reader.getNodeType() == te::xml::END_ELEMENT);
137  reader.next();
138 
139  return ls.release();
140 }
141 
143 {
144  assert(reader.getNodeType() == te::xml::START_ELEMENT);
145  assert(reader.getElementLocalName() == "PointSymbolizer");
146 
147  std::auto_ptr<te::se::PointSymbolizer> ps(new te::se::PointSymbolizer);
148 
149  // Common elements & attributes of Symbolizers
150  te::se::serialize::ReadSymbolizerHelper(ps.get(), reader);
151 
152  // Geometry
153  if(reader.getElementLocalName() == "Geometry")
154  ps->setGeometry(te::se::serialize::ReadGeometryPropertyHelper(reader));
155 
156  // Graphic
157  if(reader.getElementLocalName() == "Graphic")
158  ps->setGraphic(te::se::serialize::ReadGraphic(reader));
159 
160  assert(reader.getNodeType() == te::xml::END_ELEMENT);
161  reader.next();
162 
163  return ps.release();
164 }
165 
167 {
168  assert(reader.getNodeType() == te::xml::START_ELEMENT);
169  assert(reader.getElementLocalName() == "PolygonSymbolizer");
170 
171  std::auto_ptr<te::se::PolygonSymbolizer> ps(new te::se::PolygonSymbolizer);
172 
173  // Common elements & attributes of Symbolizers
174  te::se::serialize::ReadSymbolizerHelper(ps.get(), reader);
175 
176  // Geometry
177  if(reader.getElementLocalName() == "Geometry")
178  ps->setGeometry(te::se::serialize::ReadGeometryPropertyHelper(reader));
179 
180  // Fill
181  if(reader.getElementLocalName() == "Fill")
182  ps->setFill( te::se::serialize::ReadFill(reader));
183 
184  // Stroke
185  if(reader.getElementLocalName() == "Stroke")
186  ps->setStroke(te::se::serialize::ReadStroke(reader));
187 
188  // Displacement
189  if(reader.getElementLocalName() == "Displacement")
190  ps->setDisplacement(te::se::serialize::ReadDisplacement(reader));
191 
192  // PerpendicularOffset
193  if(reader.getElementLocalName() == "PerpendicularOffset")
194  {
195  reader.next();
196  ps->setPerpendicularOffset(te::se::serialize::ReadParameterValue(reader));
197  assert(reader.getNodeType() == te::xml::END_ELEMENT);
198  reader.next();
199  }
200 
201  assert(reader.getNodeType() == te::xml::END_ELEMENT);
202  reader.next();
203 
204  return ps.release();
205 }
206 
208 {
209  assert(reader.getNodeType() == te::xml::START_ELEMENT);
210  assert(reader.getElementLocalName() == "RasterSymbolizer");
211 
212  std::auto_ptr<te::se::RasterSymbolizer> rs(new te::se::RasterSymbolizer);
213 
214  // Common elements & attributes of Symbolizers
215  te::se::serialize::ReadSymbolizerHelper(rs.get(), reader);
216 
217  // TODO: Missing <Geometry> - <ogc:PropertyName> attribute on te::se::RasterSymbolizer
218 
219  // Opacity
220  if(reader.getElementLocalName() == "Opacity")
221  {
222  reader.next();
223  rs->setOpacity(te::se::serialize::ReadParameterValue(reader));
224  }
225 
226  // ChannelSelection
227  if(reader.getElementLocalName() == "ChannelSelection")
228  rs->setChannelSelection(te::se::serialize::ReadChannelSelection(reader));
229 
230  // OverlapBehavior
231  if(reader.getElementLocalName() == "OverlapBehavior")
232  rs->setOverlapBehavior(te::se::serialize::ReadOverlapBehavior(reader));
233 
234  // ColorMap
235  if(reader.getElementLocalName() == "ColorMap")
236  rs->setColorMap(te::se::serialize::ReadColorMap(reader));
237 
238  // ContrastEnhancement
239  if(reader.getElementLocalName() == "ContrastEnhancement")
240  rs->setContrastEnhancement(te::se::serialize::ReadContrastEnhancement(reader));
241 
242  // ShadedRelief
243  if(reader.getElementLocalName() == "ShadedRelief")
244  rs->setShadedRelief(te::se::serialize::ReadShadedRelief(reader));
245 
246  // ImageOutline
247  if(reader.getElementLocalName() == "ImageOutline")
248  rs->setImageOutline(te::se::serialize::ReadImageOutline(reader));
249 
250  // Gain (TerraLib extension)
251  if(reader.getElementLocalName() == "Gain")
252  {
253  reader.next();
254  std::string gain = reader.getElementValue();
255  rs->setGain(new te::se::ParameterValue(gain));
256  reader.next();
257  assert(reader.getNodeType() == te::xml::END_ELEMENT);
258  reader.next();
259  }
260 
261  std::string aaaa = reader.getElementLocalName();
262 
263  // Offset (TerraLib extension)
264  if(reader.getElementLocalName() == "Offset")
265  {
266  reader.next();
267  std::string offset = reader.getElementValue();
268  rs->setOffset(new te::se::ParameterValue(offset));
269  reader.next();
270  assert(reader.getNodeType() == te::xml::END_ELEMENT);
271  reader.next();
272  }
273 
274  assert(reader.getNodeType() == te::xml::END_ELEMENT);
275  reader.next();
276 
277  return rs.release();
278 }
279 
281 {
282  assert(reader.getNodeType() == te::xml::START_ELEMENT);
283  assert(reader.getElementLocalName() == "TextSymbolizer");
284 
285  std::auto_ptr<te::se::TextSymbolizer> ts(new te::se::TextSymbolizer);
286 
287  // Common elements & attributes of Symbolizers
288  te::se::serialize::ReadSymbolizerHelper(ts.get(), reader);
289 
290  // Geometry
291  if(reader.getElementLocalName() == "Geometry")
292  ts->setGeometry(te::se::serialize::ReadGeometryPropertyHelper(reader));
293 
294  // Label
295  if(reader.getElementLocalName() == "Label")
296  {
297  reader.next();
298  ts->setLabel(te::se::serialize::ReadParameterValue(reader));
299  }
300 
301  // Font
302  if(reader.getElementLocalName() == "Font")
303  ts->setFont(te::se::serialize::ReadFont(reader));
304 
305  // LabelPlacement
306  if(reader.getElementLocalName() == "LabelPlacement")
307  ts->setLabelPlacement(te::se::serialize::ReadLabelPlacement(reader));
308 
309  // Halo
310  if(reader.getElementLocalName() == "Halo")
311  ts->setHalo(te::se::serialize::ReadHalo(reader));
312 
313  // Fill
314  if(reader.getElementLocalName() == "Fill")
315  ts->setFill(te::se::serialize::ReadFill(reader));
316 
317  assert(reader.getNodeType() == te::xml::END_ELEMENT);
318  reader.next();
319 
320  return ts.release();
321 }
322 
324 {
325  const te::se::LineSymbolizer* ls = dynamic_cast<const te::se::LineSymbolizer*>(symbolizer);
326 
327  if(ls == 0)
328  return;
329 
330  writer.writeStartElement("se:LineSymbolizer");
331 
332  // Common elements & attributes of Symbolizers
334 
335  // Specific elements of LineSymbolizer
337  te::se::serialize::Save(ls->getStroke(), writer);
338  te::se::serialize::WriteParameterValuePtrHelper("se:PerpendicularOffset", ls->getPerpendicularOffset(), writer);
339 
340  writer.writeEndElement("se:LineSymbolizer");
341 }
342 
344 {
345  const te::se::PointSymbolizer* ps = dynamic_cast<const te::se::PointSymbolizer*>(symbolizer);
346 
347  if(ps == 0)
348  return;
349 
350  writer.writeStartElement("se:PointSymbolizer");
351 
352  // Common elements & attributes of Symbolizers
354 
355  // Specific elements of PointSymbolizer
357  te::se::serialize::Save(ps->getGraphic(), writer);
358 
359  writer.writeEndElement("se:PointSymbolizer");
360 }
361 
363 {
364  const te::se::PolygonSymbolizer* ps = dynamic_cast<const te::se::PolygonSymbolizer*>(symbolizer);
365 
366  if(ps == 0)
367  return;
368 
369  writer.writeStartElement("se:PolygonSymbolizer");
370 
371  // Common elements & attributes of Symbolizers
373 
374  // Specific elements of PolygonSymbolizer
376  te::se::serialize::Save(ps->getFill(), writer);
377  te::se::serialize::Save(ps->getStroke(), writer);
379  te::se::serialize::WriteParameterValuePtrHelper("se:PerpendicularOffset", ps->getPerpendicularOffset(), writer);
380 
381  writer.writeEndElement("se:PolygonSymbolizer");
382 }
383 
385 {
386  const te::se::RasterSymbolizer* rs = dynamic_cast<const te::se::RasterSymbolizer*>(symbolizer);
387 
388  if(rs == 0)
389  return;
390 
391  writer.writeStartElement("se:RasterSymbolizer");
392 
393  // Common elements & attributes of Symbolizers
395 
396  // Specific elements of RasterSymbolizer
397  // TODO: Missing <Geometry> - <ogc:PropertyName> attribute on te::se::RasterSymbolizer
398  te::se::serialize::WriteParameterValuePtrHelper("se:Opacity", rs->getOpacity(), writer);
399  //te::serialize::WriteParameterValuePtrHelper("Gain", rs->getGain(), writer); // Offset (TerraLib extension) TODO: In this case, how deal with xsd?!
400  //te::serialize::WriteParameterValuePtrHelper("Offset", rs->getOffset(), writer); // Offset (TerraLib extension) TODO: In this case, how deal with xsd?!
403  te::se::serialize::Save(rs->getColorMap(), writer);
407 
408  double gain = GetDouble(rs->getGain());
409  writer.writeElement("se:Gain", gain);
410 
411  double offset = GetDouble(rs->getOffset());
412  writer.writeElement("se:Offset", offset);
413 
414  writer.writeEndElement("se:RasterSymbolizer");
415 }
416 
418 {
419  const te::se::TextSymbolizer* ts = dynamic_cast<const te::se::TextSymbolizer*>(symbolizer);
420 
421  if(ts == 0)
422  return;
423 
424  writer.writeStartElement("se:TextSymbolizer");
425 
426  // Common elements & attributes of Symbolizers
428 
429  // Specific elements of TextSymbolizer
431  te::se::serialize::Save(ts->getFont(), writer);
433  te::se::serialize::Save(ts->getHalo(), writer);
434  te::se::serialize::Save(ts->getFill(), writer);
435 
436  writer.writeEndElement("se:TextSymbolizer");
437 }
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)
Definition: Symbolizer.cpp:280
const LabelPlacement * getLabelPlacement() const
const Graphic * getGraphic() const
void LineSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
Definition: Symbolizer.cpp:323
const te::fe::PropertyName * getGeometry() const
This class models a XML reader object.
Definition: 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
A Symbolizer describes how a feature is to appear on a map.
Definition: Symbolizer.h:80
te::se::Symbolizer * PolygonSymbolizerReader(te::xml::Reader &reader)
Definition: Symbolizer.cpp:166
const te::fe::PropertyName * getGeometry() const
ParameterValue * getOffset() const
void PointSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
Definition: Symbolizer.cpp:343
te::se::ChannelSelection * getChannelSelection() const
std::pair< SymbolizerReadFnctType, SymbolizerWriteFnctType > SymbolizerFnctSerializeType
Definition: Symbolizer.h:62
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.
Definition: Utils.cpp:448
This class models a XML writer object.
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:347
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
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
te::se::Symbolizer * LineSymbolizerReader(te::xml::Reader &reader)
Definition: Symbolizer.cpp:109
te::se::Symbolizer * RasterSymbolizerReader(te::xml::Reader &reader)
Definition: Symbolizer.cpp:207
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)
Definition: Utils.cpp:77
te::se::Symbolizer * read(te::xml::Reader &reader) const
Definition: Symbolizer.cpp:68
void reg(const std::string &symbolizerType, const SymbolizerFnctSerializeType &fncts)
Definition: Symbolizer.cpp:63
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)
Definition: Utils.cpp:133
const ParameterValue * getPerpendicularOffset() const
te::fe::PropertyName * ReadGeometryPropertyHelper(te::xml::Reader &reader)
Definition: Utils.cpp:143
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
Utility functions for MapTools module.
Data serialization for the Symbology Encoder module.
const te::fe::PropertyName * getGeometry() const
void TextSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
Definition: Symbolizer.cpp:417
const ParameterValue * getLabel() const
const ParameterValue * getPerpendicularOffset() const
TESEEXPORT te::se::ChannelSelection * ReadChannelSelection(te::xml::Reader &reader)
virtual NodeType getNodeType() const =0
It return the type of node read.
boost::function< te::se::Symbolizer *(te::xml::Reader &)> SymbolizerReadFnctType
Definition: Symbolizer.h:60
virtual std::string getElementValue() const =0
It returns the element data value in the case of VALUE node.
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)
const Fill * getFill() const
te::se::ColorMap * getColorMap() const
void write(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer) const
Definition: Symbolizer.cpp:82
void PolygonSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
Definition: Symbolizer.cpp:362
boost::function< void(const te::se::Symbolizer *, te::xml::AbstractWriter &)> SymbolizerWriteFnctType
Definition: Symbolizer.h:61
SymbolizerFnctIdxType m_fncts
Definition: Symbolizer.h:79
void WriteParameterValuePtrHelper(const std::string &elementName, const te::se::ParameterValue *p, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:47
virtual const std::string & getType() const =0
It returns the symbolizer type.
const Halo * getHalo() const
virtual bool next()=0
It gets the next event to be read.
te::se::Symbolizer * PointSymbolizerReader(te::xml::Reader &reader)
Definition: Symbolizer.cpp:142
void ReadSymbolizerHelper(te::se::Symbolizer *symbolizer, te::xml::Reader &reader)
Definition: Utils.cpp:88
void RasterSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::AbstractWriter &writer)
Definition: Symbolizer.cpp:384
TESEEXPORT te::se::Graphic * ReadGraphic(te::xml::Reader &reader)
TESEEXPORT te::se::ShadedRelief * ReadShadedRelief(te::xml::Reader &reader)
te::se::ImageOutline * getImageOutline() const