All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Symbolizer.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2011-2011 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/serialization/se/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 "../../xml/Reader.h"
29 #include "../../xml/Writer.h"
30 #include "../../se/LineSymbolizer.h"
31 #include "../../se/PointSymbolizer.h"
32 #include "../../se/PolygonSymbolizer.h"
33 #include "../../se/RasterSymbolizer.h"
34 #include "../../se/TextSymbolizer.h"
35 #include "../xlink/SimpleLink.h"
36 #include "../Exception.h"
37 #include "ChannelSelection.h"
38 #include "ColorMap.h"
39 #include "ContrastEnhancement.h"
40 #include "Description.h"
41 #include "Displacement.h"
42 #include "Fill.h"
43 #include "Font.h"
44 #include "Graphic.h"
45 #include "Halo.h"
46 #include "ImageOutline.h"
47 #include "LabelPlacement.h"
48 #include "OverlapBehavior.h"
49 #include "ParameterValue.h"
50 #include "ShadedRelief.h"
51 #include "Stroke.h"
52 #include "Symbolizer.h"
53 #include "Utils.h"
54 
55 // STL
56 #include <cassert>
57 
58 // Boost
59 #include <boost/format.hpp>
60 
66 
67 void LineSymbolizerWriter(const te::se::Symbolizer* symbolizer, te::xml::Writer& writer);
68 void PointSymbolizerWriter(const te::se::Symbolizer* symbolizer, te::xml::Writer& writer);
69 void PolygonSymbolizerWriter(const te::se::Symbolizer* symbolizer, te::xml::Writer& writer);
70 void RasterSymbolizerWriter(const te::se::Symbolizer* symbolizer, te::xml::Writer& writer);
71 void TextSymbolizerWriter(const te::se::Symbolizer* symbolizer, te::xml::Writer& writer);
72 
73 void te::serialize::Symbolizer::reg(const std::string& symbolizerType, const SymbolizerFnctSerializeType& fncts)
74 {
75  m_fncts[symbolizerType] = fncts;
76 }
77 
79 {
80  std::string symbolizerType = reader.getElementLocalName();
81 
82  SymbolizerFnctIdxType::const_iterator it = m_fncts.find(symbolizerType);
83 
84  if(it == m_fncts.end())
85  throw Exception((boost::format(TR_SERIALIZATION("Could not find a reader for the following symbolizer type: %1%.")) % symbolizerType).str());
86 
87  assert(it->second.second);
88 
89  return it->second.first(reader);
90 }
91 
93 {
94  assert(symbolizer);
95 
96  SymbolizerFnctIdxType::const_iterator it = m_fncts.find(symbolizer->getType());
97 
98  if(it == m_fncts.end())
99  throw Exception((boost::format(TR_SERIALIZATION("Could not find a writer for the following symbolizer type: %1%.")) % symbolizer->getType()).str());
100 
101  assert(it->second.second);
102 
103  return it->second.second(symbolizer, writer);
104 }
105 
107 {
108 }
109 
111 {
112  m_fncts["LineSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&LineSymbolizerReader), SymbolizerWriteFnctType(&LineSymbolizerWriter));
113  m_fncts["PointSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&PointSymbolizerReader), SymbolizerWriteFnctType(&PointSymbolizerWriter));
114  m_fncts["PolygonSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&PolygonSymbolizerReader), SymbolizerWriteFnctType(&PolygonSymbolizerWriter));
115  m_fncts["RasterSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&RasterSymbolizerReader), SymbolizerWriteFnctType(&RasterSymbolizerWriter));
116  m_fncts["TextSymbolizer"] = std::make_pair(SymbolizerReadFnctType(&TextSymbolizerReader), SymbolizerWriteFnctType(&TextSymbolizerWriter));
117 }
118 
120 {
121  assert(reader.getNodeType() == te::xml::START_ELEMENT);
122  assert(reader.getElementLocalName() == "LineSymbolizer");
123 
124  std::auto_ptr<te::se::LineSymbolizer> ls(new te::se::LineSymbolizer);
125 
126  // Common elements & attributes of Symbolizers
127  te::serialize::ReadSymbolizerHelper(ls.get(), reader);
128 
129  // Geometry
130  if(reader.getElementLocalName() == "Geometry")
131  ls->setGeometry(te::serialize::ReadGeometryPropertyHelper(reader));
132 
133  // Stroke
134  if(reader.getElementLocalName() == "Stroke")
135  ls->setStroke(te::serialize::ReadStroke(reader));
136 
137  // PerpendicularOffset
138  if(reader.getElementLocalName() == "PerpendicularOffset")
139  {
140  reader.next();
141  ls->setPerpendicularOffset(te::serialize::ReadParameterValue(reader));
142  assert(reader.getNodeType() == te::xml::END_ELEMENT);
143  reader.next();
144  }
145 
146  assert(reader.getNodeType() == te::xml::END_ELEMENT);
147  reader.next();
148 
149  return ls.release();
150 }
151 
153 {
154  assert(reader.getNodeType() == te::xml::START_ELEMENT);
155  assert(reader.getElementLocalName() == "PointSymbolizer");
156 
157  std::auto_ptr<te::se::PointSymbolizer> ps(new te::se::PointSymbolizer);
158 
159  // Common elements & attributes of Symbolizers
160  te::serialize::ReadSymbolizerHelper(ps.get(), reader);
161 
162  // Geometry
163  if(reader.getElementLocalName() == "Geometry")
164  ps->setGeometry(te::serialize::ReadGeometryPropertyHelper(reader));
165 
166  // Graphic
167  if(reader.getElementLocalName() == "Graphic")
168  ps->setGraphic(te::serialize::ReadGraphic(reader));
169 
170  assert(reader.getNodeType() == te::xml::END_ELEMENT);
171  reader.next();
172 
173  return ps.release();
174 }
175 
177 {
178  assert(reader.getNodeType() == te::xml::START_ELEMENT);
179  assert(reader.getElementLocalName() == "PolygonSymbolizer");
180 
181  std::auto_ptr<te::se::PolygonSymbolizer> ps(new te::se::PolygonSymbolizer);
182 
183  // Common elements & attributes of Symbolizers
184  te::serialize::ReadSymbolizerHelper(ps.get(), reader);
185 
186  // Geometry
187  if(reader.getElementLocalName() == "Geometry")
188  ps->setGeometry(te::serialize::ReadGeometryPropertyHelper(reader));
189 
190  // Fill
191  if(reader.getElementLocalName() == "Fill")
192  ps->setFill( te::serialize::ReadFill(reader));
193 
194  // Stroke
195  if(reader.getElementLocalName() == "Stroke")
196  ps->setStroke(te::serialize::ReadStroke(reader));
197 
198  // Displacement
199  if(reader.getElementLocalName() == "Displacement")
200  ps->setDisplacement(te::serialize::ReadDisplacement(reader));
201 
202  // PerpendicularOffset
203  if(reader.getElementLocalName() == "PerpendicularOffset")
204  {
205  reader.next();
206  ps->setPerpendicularOffset(te::serialize::ReadParameterValue(reader));
207  assert(reader.getNodeType() == te::xml::END_ELEMENT);
208  reader.next();
209  }
210 
211  assert(reader.getNodeType() == te::xml::END_ELEMENT);
212  reader.next();
213 
214  return ps.release();
215 }
216 
218 {
219  assert(reader.getNodeType() == te::xml::START_ELEMENT);
220  assert(reader.getElementLocalName() == "RasterSymbolizer");
221 
222  std::auto_ptr<te::se::RasterSymbolizer> rs(new te::se::RasterSymbolizer);
223 
224  // Common elements & attributes of Symbolizers
225  te::serialize::ReadSymbolizerHelper(rs.get(), reader);
226 
227  // TODO: Missing <Geometry> - <ogc:PropertyName> attribute on te::se::RasterSymbolizer
228 
229  // Opacity
230  if(reader.getElementLocalName() == "Opacity")
231  {
232  reader.next();
233  rs->setOpacity(te::serialize::ReadParameterValue(reader));
234  }
235 
236  // Gain (TerraLib extension) TODO: In this case, how deal with xsd?!
237  /*if(reader.getElementLocalName() == "Opacity")
238  {
239  reader.next();
240  rs->setGain(te::serialize::ReadParameterValue(reader));
241  }*/
242 
243  // Offset (TerraLib extension) TODO: In this case, how deal with xsd?!
244  /*if(reader.getElementLocalName() == "Offset")
245  {
246  reader.next();
247  rs->setOffset(te::serialize::ReadParameterValue(reader));
248  }*/
249 
250  // ChannelSelection
251  if(reader.getElementLocalName() == "ChannelSelection")
252  rs->setChannelSelection(te::serialize::ReadChannelSelection(reader));
253 
254  // OverlapBehavior
255  if(reader.getElementLocalName() == "OverlapBehavior")
256  rs->setOverlapBehavior(te::serialize::ReadOverlapBehavior(reader));
257 
258  // ColorMap
259  if(reader.getElementLocalName() == "ColorMap")
260  rs->setColorMap(te::serialize::ReadColorMap(reader));
261 
262  // ContrastEnhancement
263  if(reader.getElementLocalName() == "ContrastEnhancement")
264  rs->setContrastEnhancement(te::serialize::ReadContrastEnhancement(reader));
265 
266  // ShadedRelief
267  if(reader.getElementLocalName() == "ShadedRelief")
268  rs->setShadedRelief(te::serialize::ReadShadedRelief(reader));
269 
270  // ImageOutline
271  if(reader.getElementLocalName() == "ImageOutline")
272  rs->setImageOutline(te::serialize::ReadImageOutline(reader));
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::serialize::ReadSymbolizerHelper(ts.get(), reader);
289 
290  // Geometry
291  if(reader.getElementLocalName() == "Geometry")
292  ts->setGeometry(te::serialize::ReadGeometryPropertyHelper(reader));
293 
294  // Label
295  if(reader.getElementLocalName() == "Label")
296  {
297  reader.next();
298  ts->setLabel(te::serialize::ReadParameterValue(reader));
299  }
300 
301  // Font
302  if(reader.getElementLocalName() == "Font")
303  ts->setFont(te::serialize::ReadFont(reader));
304 
305  // LabelPlacement
306  if(reader.getElementLocalName() == "LabelPlacement")
307  ts->setLabelPlacement(te::serialize::ReadLabelPlacement(reader));
308 
309  // Halo
310  if(reader.getElementLocalName() == "Halo")
311  ts->setHalo(te::serialize::ReadHalo(reader));
312 
313  // Fill
314  if(reader.getElementLocalName() == "Fill")
315  ts->setFill(te::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::serialize::Save(ls->getStroke(), writer);
338  te::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::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::serialize::Save(ps->getFill(), writer);
377  te::serialize::Save(ps->getStroke(), writer);
378  te::serialize::Save(ps->getDisplacement(), writer);
379  te::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::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::serialize::Save(rs->getColorMap(), writer);
405  te::serialize::Save(rs->getShadedRelief(), writer);
406  te::serialize::Save(rs->getImageOutline(), writer);
407 
408  writer.writeEndElement("se:RasterSymbolizer");
409 }
410 
412 {
413  const te::se::TextSymbolizer* ts = dynamic_cast<const te::se::TextSymbolizer*>(symbolizer);
414 
415  if(ts == 0)
416  return;
417 
418  writer.writeStartElement("se:TextSymbolizer");
419 
420  // Common elements & attributes of Symbolizers
422 
423  // Specific elements of TextSymbolizer
424  te::serialize::WriteParameterValuePtrHelper("se:Label", ts->getLabel(), writer);
425  te::serialize::Save(ts->getFont(), writer);
426  te::serialize::Save(ts->getLabelPlacement(), writer);
427  te::serialize::Save(ts->getHalo(), writer);
428  te::serialize::Save(ts->getFill(), writer);
429 
430  writer.writeEndElement("se:TextSymbolizer");
431 }
A LineSymbolizer is used to style a stroke along a linear geometry type, such as a string of line seg...
Auxiliary classes and functions to serialize Symbolizer informations from a XML document.
ParameterValue * getOpacity() const
Support for Fill serialization.
The RasterSymbolizer describes how to render raster/matrix-coverage data (e.g., satellite photos...
Support for Stroke serialization.
const te::fe::PropertyName * getGeometry() const
const Fill * getFill() const
const ParameterValue * getPerpendicularOffset() const
te::se::ChannelSelection * getChannelSelection() const
Support for ColorMap serialization.
TESERIALIZATIONEXPORT te::se::ParameterValue * ReadParameterValue(te::xml::Reader &reader)
virtual const std::string & getType() const =0
It returns the symbolizer type.
void WriteSymbolizerHelper(const te::se::Symbolizer *symbolizer, te::xml::Writer &writer)
Definition: Utils.cpp:76
te::se::Symbolizer * LineSymbolizerReader(te::xml::Reader &reader)
Definition: Symbolizer.cpp:119
Utility methods for Symbology serialization.
std::pair< SymbolizerReadFnctType, SymbolizerWriteFnctType > SymbolizerFnctSerializeType
Definition: Symbolizer.h:60
A Symbolizer describes how a feature is to appear on a map.
Definition: Symbolizer.h:80
A PolygonSymbolizer is used to draw a polygon (or other area-type geometries), including filling its ...
te::se::Symbolizer * read(te::xml::Reader &reader) const
Definition: Symbolizer.cpp:78
This class models a XML reader object.
Definition: Reader.h:55
void WriteParameterValuePtrHelper(const std::string &elementName, const te::se::ParameterValue *p, te::xml::Writer &writer)
Definition: Utils.cpp:46
te::se::Symbolizer * TextSymbolizerReader(te::xml::Reader &reader)
Definition: Symbolizer.cpp:280
Support for Font serialization.
virtual bool next()=0
It gets the next event to be read.
boost::function< void(const te::se::Symbolizer *, te::xml::Writer &)> SymbolizerWriteFnctType
Definition: Symbolizer.h:59
#define TR_SERIALIZATION(message)
It marks a string in order to get translated. This is a special mark used in the XML module of TerraL...
Definition: Config.h:58
const te::fe::PropertyName * getGeometry() const
SymbolizerFnctIdxType m_fncts
Definition: Symbolizer.h:77
void RasterSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::Writer &writer)
Definition: Symbolizer.cpp:384
Support for ImageOutline serialization.
Support for ChannelSelection serialization.
virtual void writeStartElement(const std::string &qName)
Definition: Writer.cpp:44
te::se::Symbolizer * RasterSymbolizerReader(te::xml::Reader &reader)
Definition: Symbolizer.cpp:217
TESERIALIZATIONEXPORT te::se::LabelPlacement * ReadLabelPlacement(te::xml::Reader &reader)
const Stroke * getStroke() const
te::se::Symbolizer * PolygonSymbolizerReader(te::xml::Reader &reader)
Definition: Symbolizer.cpp:176
const Font * getFont() const
OverlapBehavior getOverlapBehavior() const
virtual void writeEndElement(const std::string &qName)
Definition: Writer.cpp:156
TESERIALIZATIONEXPORT te::se::Halo * ReadHalo(te::xml::Reader &reader)
Definition: Halo.cpp:39
const Stroke * getStroke() const
Gets the Stroke associates with the PolygonSymbolizer.
TESERIALIZATIONEXPORT te::se::Font * ReadFont(te::xml::Reader &reader)
Definition: Font.cpp:37
A PointSymbolizer specifies the rendering of a graphic Symbolizer at a point.
Support for OverlapBehavior serialization.
TESERIALIZATIONEXPORT te::se::ContrastEnhancement * ReadContrastEnhancement(te::xml::Reader &reader)
TESERIALIZATIONEXPORT void Save(const te::fe::Filter *filter, te::xml::Writer &writer)
Definition: Filter.cpp:54
te::fe::PropertyName * ReadGeometryPropertyHelper(te::xml::Reader &reader)
Definition: Utils.cpp:142
Support for Displacement serialization.
TESERIALIZATIONEXPORT te::se::ShadedRelief * ReadShadedRelief(te::xml::Reader &reader)
const Halo * getHalo() const
TESERIALIZATIONEXPORT te::se::ColorMap * ReadColorMap(te::xml::Reader &reader)
Definition: ColorMap.cpp:39
Support for Graphic serialization.
TESERIALIZATIONEXPORT te::se::ChannelSelection * ReadChannelSelection(te::xml::Reader &reader)
const Graphic * getGraphic() const
const ParameterValue * getPerpendicularOffset() const
A TextSymbolizer is used to render text labels according to various graphical parameters.
TESERIALIZATIONEXPORT te::se::Stroke * ReadStroke(te::xml::Reader &reader)
Definition: Stroke.cpp:39
te::se::ImageOutline * getImageOutline() const
void PointSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::Writer &writer)
Definition: Symbolizer.cpp:343
void LineSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::Writer &writer)
Definition: Symbolizer.cpp:323
te::se::ColorMap * getColorMap() const
Support for Description serialization.
void ReadSymbolizerHelper(te::se::Symbolizer *symbolizer, te::xml::Reader &reader)
Definition: Utils.cpp:87
TESERIALIZATIONEXPORT te::se::RasterSymbolizer::OverlapBehavior ReadOverlapBehavior(te::xml::Reader &reader)
Support for Halo serialization.
boost::function< te::se::Symbolizer *(te::xml::Reader &)> SymbolizerReadFnctType
Definition: Symbolizer.h:58
const LabelPlacement * getLabelPlacement() const
void PolygonSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::Writer &writer)
Definition: Symbolizer.cpp:362
void WriteGeometryPropertyHelper(const te::fe::PropertyName *p, te::xml::Writer &writer)
Definition: Utils.cpp:132
ShadedRelief * getShadedRelief() const
Support for LabelPlacement serialization.
const Fill * getFill() const
Gets the Fill associates with the PolygonSymbolizer.
void TextSymbolizerWriter(const te::se::Symbolizer *symbolizer, te::xml::Writer &writer)
Definition: Symbolizer.cpp:411
TESERIALIZATIONEXPORT te::se::Displacement * ReadDisplacement(te::xml::Reader &reader)
void reg(const std::string &symbolizerType, const SymbolizerFnctSerializeType &fncts)
Definition: Symbolizer.cpp:73
TESERIALIZATIONEXPORT te::se::Graphic * ReadGraphic(te::xml::Reader &reader)
Definition: Graphic.cpp:42
te::se::ContrastEnhancement * getContrastEnhancement() const
virtual NodeType getNodeType() const =0
It return the type of node read.
const ParameterValue * getLabel() const
const te::fe::PropertyName * getGeometry() const
TESERIALIZATIONEXPORT te::se::ImageOutline * ReadImageOutline(te::xml::Reader &reader)
const Displacement * getDisplacement() const
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
Support for ShadedRelief serialization.
Support for ContrastEnhancement serialization.
TESERIALIZATIONEXPORT te::se::Fill * ReadFill(te::xml::Reader &reader)
Definition: Fill.cpp:38
te::se::Symbolizer * PointSymbolizerReader(te::xml::Reader &reader)
Definition: Symbolizer.cpp:152
void write(const te::se::Symbolizer *symbolizer, te::xml::Writer &writer) const
Definition: Symbolizer.cpp:92
This class models a XML writer object.
Definition: Writer.h:52