SymbologySerializer.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/SymbologySerializer.cpp
22 
23  \brief Data serialization for the Symbology Encoding module.
24 */
25 
26 // TerraLib
27 #include "../../../fe/serialization/xml/Filter.h"
28 #include "../../../fe/serialization/xml/Expression.h"
29 #include "../../../xlink/serialization/xml/XLinkSerializer.h"
30 #include "../../../xml/AbstractWriter.h"
31 #include "../../../xml/Reader.h"
32 #include "../../AnchorPoint.h"
33 #include "../../Categorize.h"
34 #include "../../ChannelSelection.h"
35 #include "../../ColorMap.h"
36 #include "../../ContrastEnhancement.h"
37 #include "../../Description.h"
38 #include "../../Displacement.h"
39 #include "../../ExternalGraphic.h"
40 #include "../../Fill.h"
41 #include "../../Font.h"
42 #include "../../Graphic.h"
43 #include "../../GraphicStroke.h"
44 #include "../../Halo.h"
45 #include "../../ImageOutline.h"
46 #include "../../InlineContent.h"
47 #include "../../Interpolate.h"
48 #include "../../InterpolationPoint.h"
49 #include "../../LabelPlacement.h"
50 #include "../../LinePlacement.h"
51 #include "../../MapItem.h"
52 #include "../../Mark.h"
53 #include "../../ParameterValue.h"
54 #include "../../PointPlacement.h"
55 #include "../../RasterSymbolizer.h"
56 #include "../../Recode.h"
57 #include "../../Rule.h"
58 #include "../../SelectedChannel.h"
59 #include "../../ShadedRelief.h"
60 #include "../../Stroke.h"
61 #include "../../SvgParameter.h"
62 #include "../../Symbolizer.h"
63 #include "SymbologySerializer.h"
64 #include "Symbolizer.h"
65 #include "Utils.h"
66 
67 // STL
68 #include <cassert>
69 #include <memory>
70 
71 //#ifdef TE_ENABLED_XML
72 
74 {
75  assert(reader.getNodeType() == te::xml::START_ELEMENT);
76  assert(reader.getElementLocalName() == "AnchorPoint");
77 
78  reader.next();
79 
80  std::unique_ptr<te::se::AnchorPoint> ap(new te::se::AnchorPoint);
81 
82  assert(reader.getElementLocalName() == "AnchorPointX");
83  reader.next();
84  ap->setAnchorPointX(ReadParameterValue(reader));
85 
86  assert(reader.getElementLocalName() == "AnchorPointY");
87  reader.next();
88  ap->setAnchorPointY(ReadParameterValue(reader));
89 
90  assert(reader.getNodeType() == te::xml::END_ELEMENT);
91  reader.next();
92 
93  return ap.release();
94 }
95 
97 {
98  if(ap == nullptr)
99  return;
100 
101  writer.writeStartElement("se:AnchorPoint");
102 
103  WriteParameterValuePtrHelper("se:AnchorPointX", ap->getAnchorPointX(), writer);
104  WriteParameterValuePtrHelper("se:AnchorPointY", ap->getAnchorPointY(), writer);
105 
106  writer.writeEndElement("se:AnchorPoint");
107 }
108 
110 {
111  assert(reader.getNodeType() == te::xml::START_ELEMENT);
112  assert(reader.getElementLocalName() == "Categorize");
113 
114  assert(reader.hasAttrs());
115 
116  std::unique_ptr<te::se::Categorize> c(new te::se::Categorize);
117 
118  // FallBackValue Attribute
119  std::string fbv = reader.getAttr("fallbackValue");
120  assert(!fbv.empty());
121  c->setFallbackValue(fbv);
122 
123  // ThreshholdsBelongTo Attribute
124  std::string tbt = reader.getAttr("threshholdsBelongTo");
125  assert(!tbt.empty() && (tbt == "preceding" || tbt == "succeeding"));
126  tbt == "preceding" ? c->setThresholdsBelongTo(te::se::Categorize::PRECEDING) : c->setThresholdsBelongTo(te::se::Categorize::SUCCEEDING);
127 
128  reader.next();
129 
130  // LookupValue
131  assert(reader.getElementLocalName() == "LookupValue");
132  reader.next();
133  c->setLookupValue(ReadParameterValue(reader));
134 
135  // Value
136  assert(reader.getElementLocalName() == "Value");
137  reader.next();
138  c->addValue(ReadParameterValue(reader));
139 
140  // Threshold + Value
141  while(reader.getNodeType() == te::xml::START_ELEMENT &&
142  reader.getElementLocalName() == "Threshold")
143  {
144  reader.next();
145  c->addThreshold(ReadParameterValue(reader));
146 
147  assert(reader.getElementLocalName() == "Value");
148  reader.next();
149  c->addValue(ReadParameterValue(reader));
150  }
151 
152  assert(reader.getNodeType() == te::xml::END_ELEMENT);
153  reader.next();
154 
155  return c.release();
156 }
157 
159 {
160  if(c == nullptr)
161  return;
162 
163  writer.writeStartElement("se:Categorize");
164 
165  writer.writeAttribute("fallbackValue", c->getFallbackValue());
166 
168  switch(type)
169  {
171  break;
172 
174  writer.writeAttribute("threshholdsBelongTo", "preceding");
175  break;
176 
178  writer.writeAttribute("threshholdsBelongTo", "succeeding");
179  break;
180  }
181 
182  WriteParameterValuePtrHelper("se:LookupValue", c->getLookupValue(), writer);
183  WriteParameterValuePtrHelper("se:Value", c->getValue(), writer);
184 
185  std::vector<te::se::ParameterValue*> thresholds = c->getThresholds();
186  std::vector<te::se::ParameterValue*> values = c->getThresholdValues();
187  assert(thresholds.size() == values.size()-1);
188 
189  for(std::size_t i = 0; i < values.size(); ++i)
190  {
191  WriteParameterValuePtrHelper("se:Value", values[i], writer);
192 
193  if(i != values.size()-1)
194  WriteParameterValuePtrHelper("se:Threshold", thresholds[i], writer);
195  }
196 
197  writer.writeEndElement("se:Categorize");
198 }
199 
201 {
202  assert(reader.getNodeType() == te::xml::START_ELEMENT);
203  assert(reader.getElementLocalName() == "ChannelSelection");
204 
205  reader.next();
206 
207  std::unique_ptr<te::se::ChannelSelection> cs(new te::se::ChannelSelection);
208  cs->setColorCompositionType(te::se::UNKNOWN_COMPOSITION);
209 
210  // GrayChannel
211  if(reader.getElementLocalName() == "GrayChannel")
212  {
213  cs->setGrayChannel(ReadSelectedChannel(reader));
214  cs->setColorCompositionType(te::se::GRAY_COMPOSITION);
215 
216  assert(reader.getNodeType() == te::xml::END_ELEMENT);
217  reader.next();
218 
219  return cs.release();
220  }
221 
222  std::size_t nChannels = 0; // To count the number of channels
223 
224  // RedChannel
225  if(reader.getElementLocalName() == "RedChannel")
226  {
227  cs->setRedChannel(ReadSelectedChannel(reader));
228  cs->setColorCompositionType(te::se::RED_COMPOSITION);
229  nChannels++;
230  }
231 
232  // GreenChannel
233  if(reader.getElementLocalName() == "GreenChannel")
234  {
235  cs->setGreenChannel(ReadSelectedChannel(reader));
236  cs->setColorCompositionType(te::se::GREEN_COMPOSITION);
237  nChannels++;
238  }
239 
240  // BlueChannel
241  if(reader.getElementLocalName() == "BlueChannel")
242  {
243  cs->setBlueChannel(ReadSelectedChannel(reader));
244  cs->setColorCompositionType(te::se::BLUE_COMPOSITION);
245  nChannels++;
246  }
247 
248  assert(nChannels > 0);
249 
250  // Adjusting...
251  if(nChannels > 1)
252  nChannels == 3 ? cs->setColorCompositionType(te::se::RGB_COMPOSITION) : cs->setColorCompositionType(te::se::UNKNOWN_COMPOSITION);
253 
254  assert(reader.getNodeType() == te::xml::END_ELEMENT);
255  reader.next();
256 
257  return cs.release();
258 }
259 
261 {
262  if(cs == nullptr)
263  return;
264 
265  writer.writeStartElement("se:ChannelSelection");
266 
268  {
269  WriteSelectedChannelHelper("se:GrayChannel", cs->getGrayChannel(), writer);
270  }
272  {
273  WriteSelectedChannelHelper("se:RedChannel", cs->getRedChannel(), writer);
274  }
276  {
277  WriteSelectedChannelHelper("se:GreenChannel", cs->getGreenChannel(), writer);
278  }
280  {
281  WriteSelectedChannelHelper("se:BlueChannel", cs->getBlueChannel(), writer);
282  }
284  {
285  WriteSelectedChannelHelper("se:RedChannel", cs->getRedChannel(), writer);
286  WriteSelectedChannelHelper("se:GreenChannel", cs->getGreenChannel(), writer);
287  WriteSelectedChannelHelper("se:BlueChannel", cs->getBlueChannel(), writer);
288  }
289 
290  writer.writeEndElement("se:ChannelSelection");
291 }
292 
294 {
295  assert(reader.getNodeType() == te::xml::START_ELEMENT);
296  assert(reader.getElementLocalName() == "ColorMap");
297 
298  reader.next();
299 
300  std::unique_ptr<te::se::ColorMap> cm(new te::se::ColorMap);
301 
302  if(reader.getElementLocalName() == "Categorize")
303  cm->setCategorize(ReadCategorize(reader));
304  else if (reader.getElementLocalName() == "Interpolate")
305  cm->setInterpolate(ReadInterpolate(reader));
306  else
307  cm->setRecode(ReadRecode(reader));
308 
309  assert(reader.getNodeType() == te::xml::END_ELEMENT);
310  reader.next();
311 
312  return cm.release();
313 }
314 
316 {
317  if(cm == nullptr)
318  return;
319 
320  writer.writeStartElement("se:ColorMap");
321 
322  te::se::Categorize* categorize = cm->getCategorize();
323  te::se::Interpolate* interpolate = cm->getInterpolate();
324  te::se::Recode* recode = cm->getRecode();
325  if(categorize)
326  Save(categorize, writer);
327  else if (interpolate)
328  {
329  assert(interpolate);
330  Save(interpolate, writer);
331  }
332  else if (recode)
333  {
334  Save(recode, writer);
335  }
336 
337  writer.writeEndElement("se:ColorMap");
338 }
339 
341 {
342  assert(reader.getNodeType() == te::xml::START_ELEMENT);
343  assert(reader.getElementLocalName() == "ContrastEnhancement");
344 
345  reader.next();
346 
347  std::unique_ptr<te::se::ContrastEnhancement> ce(new te::se::ContrastEnhancement);
348  ce->setContrastEnhancementType(te::se::ContrastEnhancement::ENHANCEMENT_NONE);
349 
350  if(reader.getElementLocalName() == "Histogram")
351  {
352  ce->setContrastEnhancementType(te::se::ContrastEnhancement::ENHANCEMENT_HISTOGRAM);
353  reader.next();
354  }
355  else if(reader.getElementLocalName() == "Normalize")
356  {
357  ce->setContrastEnhancementType(te::se::ContrastEnhancement::ENHANCEMENT_NORMALIZE);
358  reader.next();
359  }
360 
361  if(reader.getElementLocalName() == "GammaValue")
362  {
363  reader.next();
364  assert(reader.getNodeType() == te::xml::VALUE);
365  ce->setGammaValue(reader.getElementValueAsDouble());
366  reader.next();
367  assert(reader.getNodeType() == te::xml::END_ELEMENT);
368  reader.next();
369  }
370 
371  assert(reader.getNodeType() == te::xml::END_ELEMENT);
372  reader.next();
373 
374  return ce.release();
375 }
376 
378 {
379  if(ce == nullptr)
380  return;
381 
382  writer.writeStartElement("se:ContrastEnhancement");
384  switch(type)
385  {
387  break;
388 
390  writer.writeElement("se:Histogram", ""); // TODO: Writer method to writer a empty element, i.e. <Histogram/>
391  break;
392 
394  writer.writeElement("se:Normalize", ""); // TODO: Writer method to writer a empty element, i.e. <Normalize/>
395  break;
396  }
397 
398  writer.writeElement("se:GammaValue", ce->getGammaValue());
399 
400  writer.writeEndElement("se:ContrastEnhancement");
401 }
402 
404 {
405  assert(reader.getNodeType() == te::xml::START_ELEMENT);
406  assert(reader.getElementLocalName() == "Description");
407 
408  reader.next();
409 
410  std::unique_ptr<te::se::Description> description(new te::se::Description);
411 
412  // Title
413  if(reader.getElementLocalName() == "Title")
414  {
415  reader.next();
416  assert(reader.getNodeType() == te::xml::VALUE);
417  std::string title = reader.getElementValue();
418  description->setTitle(title);
419  reader.next();
420 
421  assert(reader.getNodeType() == te::xml::END_ELEMENT);
422  reader.next();
423  }
424 
425  // Abstract
426  if(reader.getElementLocalName() == "Abstract")
427  {
428  reader.next();
429  assert(reader.getNodeType() == te::xml::VALUE);
430  std::string abs = reader.getElementValue();
431  description->setAbstract(abs);
432  reader.next();
433 
434  assert(reader.getNodeType() == te::xml::END_ELEMENT);
435  reader.next();
436  }
437 
438  assert(reader.getNodeType() == te::xml::END_ELEMENT);
439  reader.next();
440 
441  return description.release();
442 }
443 
445 {
446  if(d == nullptr)
447  return;
448 
449  writer.writeStartElement("se:Description");
450 
451  if(!d->getTitle().empty())
452  writer.writeElement("se:Title", d->getTitle());
453 
454  if(!d->getAbstract().empty())
455  writer.writeElement("se:Abstract", d->getAbstract());
456 
457  writer.writeEndElement("se:Description");
458 }
459 
461 {
462  assert(reader.getNodeType() == te::xml::START_ELEMENT);
463  assert(reader.getElementLocalName() == "Displacement");
464 
465  reader.next();
466 
467  std::unique_ptr<te::se::Displacement> d(new te::se::Displacement);
468 
469  assert(reader.getElementLocalName() == "DisplacementX");
470  reader.next();
471  d->setDisplacementX(ReadParameterValue(reader));
472 
473  assert(reader.getElementLocalName() == "DisplacementY");
474  reader.next();
475  d->setDisplacementY(ReadParameterValue(reader));
476 
477  assert(reader.getNodeType() == te::xml::END_ELEMENT);
478  reader.next();
479 
480  return d.release();
481 }
482 
484 {
485  if(d == nullptr)
486  return;
487 
488  writer.writeStartElement("se:Displacement");
489 
490  WriteParameterValuePtrHelper("se:DisplacementX", d->getDisplacementX(), writer);
491  WriteParameterValuePtrHelper("se:DisplacementY", d->getDisplacementY(), writer);
492 
493  writer.writeEndElement("se:Displacement");
494 }
495 
497 {
498  assert(reader.getNodeType() == te::xml::START_ELEMENT);
499  assert(reader.getElementLocalName() == "ExternalGraphic");
500 
501  reader.next();
502 
503  std::unique_ptr<te::se::ExternalGraphic> eg(new te::se::ExternalGraphic);
504 
505  if(reader.getElementLocalName() == "OnlineResource")
506  eg->setOnlineResource(te::xl::serialize::ReadSimpleLink(reader));
507  else // InlineContent
508  eg->setInlineContent(ReadInlineContent(reader));
509 
510  reader.next();
511  assert(reader.getNodeType() == te::xml::END_ELEMENT);
512 
513  reader.next();
514 
515  // Format
516  assert(reader.getElementLocalName() == "Format");
517  reader.next();
518  assert(reader.getNodeType() == te::xml::VALUE);
519  eg->setFormat(reader.getElementValue());
520  reader.next();
521 
522  // Recodes (...)
523 
524  assert(reader.getNodeType() == te::xml::END_ELEMENT);
525  reader.next();
526 
527  assert(reader.getNodeType() == te::xml::END_ELEMENT);
528  reader.next();
529 
530  return eg.release();
531 }
532 
534 {
535  if(eg == nullptr)
536  return;
537 
538  writer.writeStartElement("se:ExternalGraphic");
539 
541  if(link)
543  else
544  {
545  const te::se::InlineContent* ic = eg->getInlineContent();
546  assert(ic);
547  Save(ic, writer);
548  }
549  const std::string& format = eg->getFormat();
550  assert(!format.empty());
551  writer.writeElement("se:Format", format);
552 
553  // Recodes (...)
554 
555  writer.writeEndElement("se:ExternalGraphic");
556 }
557 
559 {
560  assert(reader.getNodeType() == te::xml::START_ELEMENT);
561  assert(reader.getElementLocalName() == "Fill");
562 
563  reader.next();
564 
565  std::unique_ptr<te::se::Fill> fill(new te::se::Fill);
566 
567  // GraphicFill
568  if(reader.getElementLocalName() == "GraphicFill")
569  {
570  reader.next();
571  fill->setGraphicFill(ReadGraphic(reader));
572  assert(reader.getNodeType() == te::xml::END_ELEMENT);
573  reader.next();
574  }
575 
576  // SvgParameters
577  while(reader.getNodeType() == te::xml::START_ELEMENT &&
578  reader.getElementLocalName() == "SvgParameter")
579  fill->add(ReadSvgParameter(reader));
580 
581  assert(reader.getNodeType() == te::xml::END_ELEMENT);
582  reader.next();
583 
584  return fill.release();
585 }
586 
588 {
589  if(fill == nullptr)
590  return;
591 
592  writer.writeStartElement("se:Fill");
593 
594  const te::se::Graphic* g = fill->getGraphicFill();
595  if(g)
596  {
597  writer.writeStartElement("se:GraphicFill");
598  Save(g, writer);
599  writer.writeEndElement("se:GraphicFill");
600  }
601  else
602  {
603  Save(fill->getColor(), writer);
604  Save(fill->getOpacity(), writer);
605  }
606 
607  writer.writeEndElement("se:Fill");
608 }
609 
611 {
612  assert(reader.getNodeType() == te::xml::START_ELEMENT);
613  assert(reader.getElementLocalName() == "Font");
614 
615  reader.next();
616 
617  std::unique_ptr<te::se::Font> font(new te::se::Font);
618 
619  // SvgParameters
620  while(reader.getNodeType() == te::xml::START_ELEMENT &&
621  reader.getElementLocalName() == "SvgParameter")
622  font->add(ReadSvgParameter(reader));
623 
624  assert(reader.getNodeType() == te::xml::END_ELEMENT);
625  reader.next();
626 
627  return font.release();
628 }
629 
631 {
632  if(font == nullptr)
633  return;
634 
635  writer.writeStartElement("se:Font");
636 
637  Save(font->getFamily(), writer);
638  Save(font->getStyle(), writer);
639  Save(font->getWeight(), writer);
640  Save(font->getSize(), writer);
641 
642  writer.writeEndElement("se:Font");
643 }
644 
646 {
647  assert(reader.getNodeType() == te::xml::START_ELEMENT);
648  assert(reader.getElementLocalName() == "Graphic");
649 
650  reader.next();
651 
652  std::unique_ptr<te::se::Graphic> graphic(new te::se::Graphic);
653 
654  while(reader.getNodeType() == te::xml::START_ELEMENT &&
655  (reader.getElementLocalName() == "Mark" ||
656  reader.getElementLocalName() == "ExternalGraphic"))
657  reader.getElementLocalName() == "Mark" ? graphic->add(ReadMark(reader)) : graphic->add(ReadExternalGraphic(reader));
658 
659  // Opacity
660  if(reader.getElementLocalName() == "Opacity")
661  {
662  reader.next();
663  graphic->setOpacity(ReadParameterValue(reader));
664  }
665 
666  // Size
667  if(reader.getElementLocalName() == "Size")
668  {
669  reader.next();
670  graphic->setSize(ReadParameterValue(reader));
671  }
672 
673  // Rotation
674  if(reader.getElementLocalName() == "Rotation")
675  {
676  reader.next();
677  graphic->setRotation(ReadParameterValue(reader));
678  }
679 
680  // AnchorPoint
681  if(reader.getElementLocalName() == "AnchorPoint")
682  graphic->setAnchorPoint(ReadAnchorPoint(reader));
683 
684  // Displacement
685  if(reader.getElementLocalName() == "Displacement")
686  graphic->setDisplacement(ReadDisplacement(reader));
687 
688  assert(reader.getNodeType() == te::xml::END_ELEMENT);
689  reader.next();
690 
691  return graphic.release();
692 }
693 
695 {
696  if(graphic == nullptr)
697  return;
698 
699  writer.writeStartElement("se:Graphic");
700 
701  const std::vector<te::se::Mark*> marks = graphic->getMarks();
702  for(std::size_t i = 0; i < marks.size(); ++i)
703  Save(marks[i], writer);
704 
705  const std::vector<te::se::ExternalGraphic*> egs = graphic->getExternalGraphics();
706  for(std::size_t i = 0; i < egs.size(); ++i)
707  Save(egs[i], writer);
708 
709  WriteParameterValuePtrHelper("se:Opacity", graphic->getOpacity(), writer);
710  WriteParameterValuePtrHelper("se:Size", graphic->getSize(), writer);
711  WriteParameterValuePtrHelper("se:Rotation", graphic->getRotation(), writer);
712 
713  Save(graphic->getAnchorPoint(), writer);
714  Save(graphic->getDisplacement(), writer);
715 
716  writer.writeEndElement("se:Graphic");
717 }
718 
720 {
721  assert(reader.getNodeType() == te::xml::START_ELEMENT);
722  assert(reader.getElementLocalName() == "GraphicStroke");
723 
724  reader.next();
725 
726  std::unique_ptr<te::se::GraphicStroke> graphicStroke(new te::se::GraphicStroke);
727 
728  assert(reader.getElementLocalName() == "Graphic");
729  graphicStroke->setGraphic(ReadGraphic(reader));
730 
731  // InitialGap
732  if(reader.getElementLocalName() == "InitialGap")
733  {
734  reader.next();
735  graphicStroke->setInitialGap(ReadParameterValue(reader));
736  }
737 
738  // Gap
739  if(reader.getElementLocalName() == "Gap")
740  {
741  reader.next();
742  graphicStroke->setGap(ReadParameterValue(reader));
743  }
744 
745  assert(reader.getNodeType() == te::xml::END_ELEMENT);
746  reader.next();
747 
748  return graphicStroke.release();
749 }
750 
752 {
753  if(graphicStroke == nullptr)
754  return;
755 
756  writer.writeStartElement("se:GraphicStroke");
757 
758  const te::se::Graphic* graphic = graphicStroke->getGraphic();
759  assert(graphic);
760  Save(graphic, writer);
761 
762  WriteParameterValuePtrHelper("se:InitialGap", graphicStroke->getInitialGap(), writer);
763  WriteParameterValuePtrHelper("se:Gap", graphicStroke->getGap(), writer);
764 
765  writer.writeEndElement("se:GraphicStroke");
766 }
767 
769 {
770  assert(reader.getNodeType() == te::xml::START_ELEMENT);
771  assert(reader.getElementLocalName() == "Halo");
772 
773  reader.next();
774 
775  std::unique_ptr<te::se::Halo> halo(new te::se::Halo);
776 
777  // Radius
778  if(reader.getElementLocalName() == "Radius")
779  {
780  reader.next();
781  halo->setRadius(ReadParameterValue(reader));
782  }
783 
784  // Fill
785  if(reader.getElementLocalName() == "Fill")
786  halo->setFill(ReadFill(reader));
787 
788  assert(reader.getNodeType() == te::xml::END_ELEMENT);
789  reader.next();
790 
791  return halo.release();
792 }
793 
795 {
796  if(halo == nullptr)
797  return;
798 
799  writer.writeStartElement("se:Halo");
800 
801  WriteParameterValuePtrHelper("se:Radius", halo->getRadius(), writer);
802  Save(halo->getFill(), writer);
803 
804  writer.writeEndElement("se:Halo");
805 }
806 
808 {
809  assert(reader.getNodeType() == te::xml::START_ELEMENT);
810  assert(reader.getElementLocalName() == "ImageOutline");
811 
812  reader.next();
813 
814  std::unique_ptr<te::se::ImageOutline> imageOutline(new te::se::ImageOutline);
815  imageOutline->setSymbolizer(Symbolizer::getInstance().read(reader));
816 
817  assert(reader.getNodeType() == te::xml::END_ELEMENT);
818  reader.next();
819 
820  return imageOutline.release();
821 }
822 
824 {
825  if(imageOutline == nullptr)
826  return;
827 
828  writer.writeStartElement("se:ImageOutline");
829 
830  assert(imageOutline->getSymbolizer());
831  Symbolizer::getInstance().write(imageOutline->getSymbolizer(), writer);
832 
833  writer.writeEndElement("se:ImageOutline");
834 }
835 
837 {
838  assert(reader.getNodeType() == te::xml::START_ELEMENT);
839  assert(reader.getElementLocalName() == "InlineContent");
840 
841  std::string encondingValue = reader.getAttr("enconding");
842  assert(encondingValue == "xml" || encondingValue == "base64");
843 
845  encondingValue == "xml" ? encodingType = te::se::InlineContent::XML : encodingType = te::se::InlineContent::BASE64;
846 
847  std::string data = reader.getElementValue();
848 
849  std::unique_ptr<te::se::InlineContent> ic(new te::se::InlineContent(encodingType));
850  ic->setData(data);
851 
852  reader.next();
853 
854  assert(reader.getNodeType() == te::xml::END_ELEMENT);
855  reader.next();
856 
857  return ic.release();
858 }
859 
861 {
862  if(ic == nullptr)
863  return;
864 
865  writer.writeStartElement("se:InlineContent");
866  ic->getEncoding() == te::se::InlineContent::XML ? writer.writeAttribute("enconding", "xml") : writer.writeAttribute("enconding", "base64");
867  writer.writeValue(ic->getData());
868  writer.writeEndElement("se:InlineContent");
869 }
870 
872 {
873  assert(reader.getNodeType() == te::xml::START_ELEMENT);
874  assert(reader.getElementLocalName() == "Interpolate");
875 
876  assert(reader.hasAttrs());
877 
878  std::unique_ptr<te::se::Interpolate> interpolate(new te::se::Interpolate);
879 
880  // FallBackValue Attribute
881  std::string fbv = reader.getAttr("fallbackValue");
882  assert(!fbv.empty());
883  interpolate->setFallbackValue(fbv);
884 
885  // Mode Attribute
886  std::string mode = reader.getAttr("mode");
887  assert(!mode.empty() && (mode == "linear" || mode == "cosine" || mode == "cubic"));
888  if(mode == "linear")
889  interpolate->setModeType(te::se::Interpolate::LINEAR);
890  else if(mode == "cosine")
891  interpolate->setModeType(te::se::Interpolate::COSINE);
892  else
893  interpolate->setModeType(te::se::Interpolate::CUBIC);
894 
895  // Method Attribute
896  std::string method = reader.getAttr("method");
897  assert(!method.empty() && (method == "numeric" || method == "color"));
898  method == "numeric" ? interpolate->setMethodType(te::se::Interpolate::NUMERIC) : interpolate->setMethodType(te::se::Interpolate::COLOR);
899 
900  reader.next();
901 
902  // LookupValue
903  assert(reader.getElementLocalName() == "LookupValue");
904  reader.next();
905  interpolate->setLookupValue(ReadParameterValue(reader));
906 
907  // InterpolationPoints
908  while(reader.getNodeType() == te::xml::START_ELEMENT &&
909  reader.getElementLocalName() == "InterpolationPoint")
910  {
911  //reader.next();
912  interpolate->add(ReadInterpolationPoint(reader));
913  }
914 
915  assert(reader.getNodeType() == te::xml::END_ELEMENT);
916  reader.next();
917 
918  return interpolate.release();
919 }
920 
922 {
923  if(interpolate == nullptr)
924  return;
925 
926  writer.writeStartElement("se:Interpolate");
927 
928  writer.writeAttribute("fallbackValue", interpolate->getFallbackValue());
929 
930  te::se::Interpolate::ModeType modeType = interpolate->getModeType();
931  switch(modeType)
932  {
934  writer.writeAttribute("mode", "linear");
935  break;
936 
938  writer.writeAttribute("mode", "cosine");
939  break;
940 
942  writer.writeAttribute("mode", "cubic");
943  break;
944  }
945 
946  te::se::Interpolate::MethodType methodType = interpolate->geMethodType();
947  switch(methodType)
948  {
950  writer.writeAttribute("method", "numeric");
951  break;
952 
954  writer.writeAttribute("method", "color");
955  break;
956  }
957 
958  WriteParameterValuePtrHelper("se:LookupValue", interpolate->getLookupValue(), writer);
959 
960  const std::vector<te::se::InterpolationPoint*> ipts = interpolate->getInterpolationPoints();
961  assert(!ipts.empty());
962  for(std::size_t i = 0; i < ipts.size(); ++i)
963  Save(ipts[i], writer);
964 
965  writer.writeEndElement("se:Interpolate");
966 }
967 
969 {
970  assert(reader.getNodeType() == te::xml::START_ELEMENT);
971  assert(reader.getElementLocalName() == "InterpolationPoint");
972 
973  std::unique_ptr<te::se::InterpolationPoint> ip(new te::se::InterpolationPoint);
974 
975  reader.next();
976  assert(reader.getElementLocalName() == "Data");
977  reader.next();
978  assert(reader.getNodeType() == te::xml::VALUE);
979  double data = reader.getElementValueAsDouble();
980  ip->setData(data);
981 
982  reader.next();
983  reader.next();
984 
985  assert(reader.getElementLocalName() == "Value");
986  reader.next();
987  ip->setValue(ReadParameterValue(reader));
988 
989  assert(reader.getNodeType() == te::xml::END_ELEMENT);
990  reader.next();
991 
992  return ip.release();
993 }
994 
996 {
997  if(ip == nullptr)
998  return;
999 
1000  writer.writeStartElement("se:InterpolationPoint");
1001 
1002  writer.writeElement("se:Data", ip->getData());
1003  assert(ip->getValue());
1004  WriteParameterValuePtrHelper("se:Value", ip->getValue(), writer);
1005 
1006  writer.writeEndElement("se:InterpolationPoint");
1007 }
1008 
1010 {
1011  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1012  assert(reader.getElementLocalName() == "LabelPlacement");
1013 
1014  reader.next();
1015 
1016  std::unique_ptr<te::se::LabelPlacement> lp(new te::se::LabelPlacement);
1017 
1018  if(reader.getElementLocalName() == "PointPlacement")
1019  lp->setPointPlacement(ReadPointPlacement(reader));
1020  else // LinePlacement
1021  lp->setLinePlacement(ReadLinePlacement(reader));
1022 
1023  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1024  reader.next();
1025 
1026  return lp.release();
1027 }
1028 
1030 {
1031  if(lp == nullptr)
1032  return;
1033 
1034  writer.writeStartElement("se:LabelPlacement");
1035 
1036  const te::se::PointPlacement* pp = lp->getPointPlacement();
1037  if(pp)
1038  Save(pp, writer);
1039  else
1040  {
1041  const te::se::LinePlacement* linePlacement = lp->getLinePlacement();
1042  assert(linePlacement);
1043  Save(linePlacement, writer);
1044  }
1045 
1046  writer.writeEndElement("se:LabelPlacement");
1047 }
1048 
1050 {
1051  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1052  assert(reader.getElementLocalName() == "LinePlacement");
1053 
1054  reader.next();
1055 
1056  std::unique_ptr<te::se::LinePlacement> lp(new te::se::LinePlacement);
1057 
1058  // PerpendicularOffset
1059  if(reader.getElementLocalName() == "PerpendicularOffset")
1060  {
1061  reader.next();
1062  lp->setPerpendicularOffset(ReadParameterValue(reader));
1063  }
1064 
1065  // IsRepeated
1066  if(reader.getElementLocalName() == "IsRepeated")
1067  {
1068  reader.next();
1069  assert(reader.getNodeType() == te::xml::VALUE);
1070  bool isRepeated = reader.getElementValueAsBoolean();
1071  lp->setIsRepeated(isRepeated);
1072  reader.next();
1073 
1074  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1075  reader.next();
1076  }
1077 
1078  // InitialGap
1079  if(reader.getElementLocalName() == "InitialGap")
1080  {
1081  reader.next();
1082  lp->setInitialGap(ReadParameterValue(reader));
1083  }
1084 
1085  // Gap
1086  if(reader.getElementLocalName() == "Gap")
1087  {
1088  reader.next();
1089  lp->setGap(ReadParameterValue(reader));
1090  }
1091 
1092  // IsAligned
1093  if(reader.getElementLocalName() == "IsAligned")
1094  {
1095  reader.next();
1096  assert(reader.getNodeType() == te::xml::VALUE);
1097  bool isAligned = reader.getElementValueAsBoolean();
1098  lp->setIsAligned(isAligned);
1099  reader.next();
1100 
1101  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1102  reader.next();
1103  }
1104 
1105  // GeneralizeLine
1106  if(reader.getElementLocalName() == "GeneralizeLine")
1107  {
1108  reader.next();
1109  assert(reader.getNodeType() == te::xml::VALUE);
1110  bool generalizeLine = reader.getElementValueAsBoolean();
1111  lp->setGeneralizeLine(generalizeLine);
1112  reader.next();
1113 
1114  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1115  reader.next();
1116  }
1117 
1118  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1119  reader.next();
1120 
1121  return lp.release();
1122 }
1123 
1125 {
1126  if(lp == nullptr)
1127  return;
1128 
1129  writer.writeStartElement("se:LinePlacement");
1130 
1131  WriteParameterValuePtrHelper("se:PerpendicularOffset", lp->getPerpendicularOffset(), writer);
1132 
1133  std::string isRepeated;
1134  lp->isRepeated() ? isRepeated = "true" : isRepeated = "false";
1135  writer.writeElement("se:IsRepeated", isRepeated);
1136 
1137  WriteParameterValuePtrHelper("se:InitialGap", lp->getInitialGap(), writer);
1138  WriteParameterValuePtrHelper("se:Gap", lp->getGap(), writer);
1139 
1140  std::string isAligned;
1141  lp->isAligned() ? isAligned = "true" : isAligned = "false";
1142  writer.writeElement("se:IsAligned", isAligned);
1143 
1144  std::string generalizeLine;
1145  lp->getGeneralizeLine() ? generalizeLine = "true" : generalizeLine = "false";
1146  writer.writeElement("se:GeneralizeLine", generalizeLine);
1147 
1148  writer.writeEndElement("se:LinePlacement");
1149 }
1150 
1152 {
1153  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1154  assert(reader.getElementLocalName() == "MapItem");
1155 
1156  reader.next();
1157 
1158  std::unique_ptr<te::se::MapItem> mapItem(new te::se::MapItem);
1159 
1160  if (reader.getElementLocalName() == "Data")
1161  {
1162  reader.next();
1163 
1164  double data = reader.getElementValueAsDouble();
1165  mapItem->setData(data);
1166 
1167  reader.next();
1168 
1169  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1170 
1171  reader.next();
1172  }
1173 
1174  if (reader.getElementLocalName() == "Value")
1175  {
1176  reader.next();
1177 
1178  te::se::ParameterValue* value = ReadParameterValue(reader);
1179 
1180  mapItem->setValue(value);
1181 
1182  }
1183 
1184  if (reader.getElementLocalName() == "Title")
1185  {
1186  reader.next();
1187 
1188  if (reader.getNodeType() != te::xml::END_ELEMENT)
1189  {
1190  std::string title = reader.getElementValue();
1191  mapItem->setTitle(title);
1192 
1193  reader.next();
1194  }
1195 
1196  reader.next();
1197  }
1198 
1199  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1200 
1201  reader.next();
1202 
1203  return mapItem.release();
1204 }
1205 
1207 {
1208  if (!mapItem)
1209  return;
1210 
1211  double data = mapItem->getData();
1212  te::se::ParameterValue* value = mapItem->getValue();
1213  std::string title = mapItem->getTitle();
1214 
1215  writer.writeStartElement("se:MapItem");
1216 
1217  writer.writeElement("Data", data);
1218  writer.writeStartElement("Value");
1219  Save(value, writer);
1220  writer.writeEndElement("Value");
1221  writer.writeElement("Title", title);
1222 
1223  writer.writeEndElement("se:MapItem");
1224 }
1225 
1227 {
1228  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1229  assert(reader.getElementLocalName() == "Mark");
1230 
1231  reader.next();
1232 
1233  std::unique_ptr<te::se::Mark> mark(new te::se::Mark);
1234 
1235  // WellKnownName
1236  if(reader.getElementLocalName() == "WellKnownName")
1237  {
1238  reader.next();
1239  assert(reader.getNodeType() == te::xml::VALUE);
1240  mark->setWellKnownName(new std::string(reader.getElementValue()));
1241  reader.next();
1242 
1243  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1244  reader.next();
1245  }
1246  else if(reader.getElementLocalName() == "OnlineResource")
1247  mark->setOnlineResource(te::xl::serialize::ReadSimpleLink(reader));
1248  else // InlineContent
1249  mark->setInlineContent(ReadInlineContent(reader));
1250 
1251  // Fill
1252  if(reader.getElementLocalName() == "Fill")
1253  mark->setFill(ReadFill(reader));
1254 
1255  // Stroke
1256  if(reader.getElementLocalName() == "Stroke")
1257  mark->setStroke(ReadStroke(reader));
1258 
1259  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1260  reader.next();
1261 
1262  return mark.release();
1263 }
1264 
1266 {
1267  if(mark == nullptr)
1268  return;
1269 
1270  writer.writeStartElement("se:Mark");
1271 
1272  const std::string* wellKnownName = mark->getWellKnownName();
1273  if(wellKnownName)
1274  writer.writeElement("se:WellKnownName", *wellKnownName);
1275  else
1276  {
1277  const te::xl::SimpleLink* link = mark->getOnlineResource();
1278  if(link)
1279  WriteOnlineResourceHelper(link, writer);
1280  else
1281  {
1282  const te::se::InlineContent* ic = mark->getInlineContent();
1283  assert(ic);
1284  Save(ic, writer);
1285  }
1286  const std::string* format = mark->getFormat();
1287  assert(format);
1288  writer.writeElement("se:Format", *format);
1289 
1290  writer.writeElement("se:MarkIndex", mark->getMarkIndex());
1291  }
1292 
1293  Save(mark->getFill(), writer);
1294  Save(mark->getStroke(), writer);
1295 
1296  writer.writeEndElement("se:Mark");
1297 }
1298 
1300 {
1301  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1302  assert(reader.getElementLocalName() == "OverlapBehavior");
1303 
1304  reader.next();
1305  assert(reader.getNodeType() == te::xml::VALUE);
1306  std::string type = reader.getElementValue();
1307  reader.next();
1308 
1309  if(type == "AVERAGE")
1311 
1312  if(type == "EARLIEST_ON_TOP")
1314 
1315  if(type == "LATEST_ON_TOP")
1317 
1318  if(type == "RANDOM")
1320 
1321  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1322  reader.next();
1323 
1325 }
1326 
1328 {
1329  switch(type)
1330  {
1332  break;
1333 
1335  writer.writeElement("se:OverlapBehavior", "AVERAGE");
1336  break;
1337 
1339  writer.writeElement("se:OverlapBehavior", "EARLIEST_ON_TOP");
1340  break;
1341 
1343  writer.writeElement("se:OverlapBehavior", "LATEST_ON_TOP");
1344  break;
1345 
1347  writer.writeElement("se:OverlapBehavior", "RANDOM");
1348  break;
1349  }
1350 }
1351 
1353 {
1354  std::unique_ptr<te::se::ParameterValue> param(new te::se::ParameterValue);
1355 
1356  // Expression TODO: (n's expressions?)
1359 
1360  // TODO: and mixed data?!
1361 
1362  param->add(p);
1363 
1364  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1365  reader.next();
1366 
1367  return param.release();
1368 }
1369 
1371 {
1372  if(p == nullptr)
1373  return;
1374 
1375  std::size_t n = p->getNParameters();
1376 
1377  for(std::size_t i = 0; i != n; ++i)
1378  {
1379  const te::se::ParameterValue::Parameter* param = p->getParameter(i);
1380 
1381  if(param->m_mixedData)
1382  writer.writeValue(*(param->m_mixedData));
1383  else
1385  }
1386 }
1387 
1389 {
1390  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1391  assert(reader.getElementLocalName() == "PointPlacement");
1392 
1393  reader.next();
1394 
1395  std::unique_ptr<te::se::PointPlacement> pp(new te::se::PointPlacement);
1396 
1397  // AnchorPoint
1398  if(reader.getElementLocalName() == "AnchorPoint")
1399  pp->setAnchorPoint(ReadAnchorPoint(reader));
1400 
1401  // Displacement
1402  if(reader.getElementLocalName() == "Displacement")
1403  pp->setDisplacement(ReadDisplacement(reader));
1404 
1405  // Rotation
1406  if(reader.getElementLocalName() == "Rotation")
1407  {
1408  reader.next();
1409  pp->setRotation(ReadParameterValue(reader));
1410  }
1411 
1412  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1413  reader.next();
1414 
1415  return pp.release();
1416 }
1417 
1419 {
1420  if(pp == nullptr)
1421  return;
1422 
1423  writer.writeStartElement("se:PointPlacement");
1424 
1425  Save(pp->getAnchorPoint(), writer);
1426  Save(pp->getDisplacement(), writer);
1427  WriteParameterValuePtrHelper("se:Rotation", pp->getRotation(), writer);
1428 
1429  writer.writeEndElement("se:PointPlacement");
1430 }
1431 
1433 {
1434  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1435  assert(reader.getElementLocalName() == "Recode");
1436 
1437  std::unique_ptr<te::se::Recode> recode(new te::se::Recode);
1438 
1439  reader.next();
1440 
1441  if (reader.getNodeType() == te::xml::END_ELEMENT && reader.getElementLocalName() == "Recode")
1442  return nullptr;
1443 
1444  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1445  assert(reader.getElementLocalName() == "fallbackValue");
1446 
1447  reader.next();
1448 
1449  if (reader.getNodeType() == te::xml::VALUE)
1450  {
1451  recode->setFallbackValue(reader.getElementValue());
1452 
1453  reader.next();
1454  }
1455 
1456  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1457  assert(reader.getElementLocalName() == "fallbackValue");
1458 
1459  reader.next();
1460 
1461  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1462  assert(reader.getElementLocalName() == "MapItem");
1463 
1464  while (reader.getNodeType() == te::xml::START_ELEMENT && reader.getElementLocalName() == "MapItem")
1465  {
1466 
1467  te::se::MapItem* mapItem = ReadMapItem(reader);
1468 
1469  recode->add(mapItem);
1470  }
1471 
1472  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1473  assert(reader.getElementLocalName() == "Recode");
1474 
1475  reader.next();
1476 
1477  return recode.release();
1478 }
1479 
1481 {
1482  if (!recode)
1483  return;
1484 
1485  writer.writeStartElement("se:Recode");
1486 
1487  std::string fallbackValue = recode->getFallbackValue();
1488 
1489  writer.writeElement("fallbackValue", fallbackValue);
1490 
1491  std::vector<te::se::MapItem*> items = recode->getMapItems();
1492 
1493  for (std::size_t i = 0; i < items.size(); ++i)
1494  {
1495  Save(items[i], writer);
1496  }
1497 
1498  writer.writeEndElement("se:Recode");
1499 }
1500 
1502 {
1503  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1504  assert(reader.getElementLocalName() == "Rule");
1505 
1506  reader.next();
1507 
1508  std::unique_ptr<te::se::Rule> rule(new te::se::Rule);
1509 
1510  // Name
1511  if(reader.getElementLocalName() == "Name")
1512  {
1513  reader.next();
1514  assert(reader.getNodeType() == te::xml::VALUE);
1515  rule->setName(new std::string(reader.getElementValue()));
1516  reader.next();
1517 
1518  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1519  reader.next();
1520  }
1521 
1522  // Description
1523  if(reader.getElementLocalName() == "Description")
1524  rule->setDescription(ReadDescription(reader));
1525 
1526  // LegendGraphic
1527  if(reader.getElementLocalName() == "LegendGraphic")
1528  {
1529  reader.next();
1530  rule->setLegendGraphic(ReadGraphic(reader));
1531 
1532  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1533  reader.next();
1534  }
1535 
1536  // Filter / ElseFilter
1537  if(reader.getElementLocalName() == "Filter")
1538  rule->setFilter(te::fe::serialize::ReadFilter(reader));
1539  else if(reader.getElementLocalName() == "ElseFilter")
1540  {
1541  rule->enableElseFilter();
1542  reader.next();
1543  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1544  reader.next();
1545  }
1546 
1547  // MinScaleDenominator
1548  if(reader.getElementLocalName() == "MinScaleDenominator")
1549  {
1550  reader.next();
1551  assert(reader.getNodeType() == te::xml::VALUE);
1552  double minScale = reader.getElementValueAsDouble();
1553  rule->setMinScaleDenominator(minScale);
1554  reader.next();
1555 
1556  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1557  reader.next();
1558  }
1559 
1560  // MaxScaleDenominator
1561  if(reader.getElementLocalName() == "MaxScaleDenominator")
1562  {
1563  reader.next();
1564  assert(reader.getNodeType() == te::xml::VALUE);
1565  double maxScale = reader.getElementValueAsDouble();
1566  rule->setMaxScaleDenominator(maxScale);
1567  reader.next();
1568 
1569  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1570  reader.next();
1571  }
1572 
1573  // Symbolizers
1574  while(reader.getNodeType() == te::xml::START_ELEMENT &&
1575  reader.getElementLocalName().find("Symbolizer") != std::string::npos) // TODO: For while using find("Symbolizer")... Actually, I would like to search by the registered names of symbolizer.
1576  rule->push_back(te::se::serialize::Symbolizer::getInstance().read(reader));
1577 
1578  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1579  reader.next();
1580 
1581  return rule.release();
1582 }
1583 
1585 {
1586  if(rule == nullptr)
1587  return;
1588 
1589  writer.writeStartElement("se:Rule");
1590 
1591  WriteStringPtrHelper("se:Name", rule->getName(), writer);
1592  Save(rule->getDescription(), writer);
1593 
1594  const te::se::Graphic* legendGraphic = rule->getLegendGraphic();
1595  if(legendGraphic)
1596  {
1597  writer.writeStartElement("se:LegendGraphic");
1598  Save(rule->getLegendGraphic(), writer);
1599  writer.writeEndElement("se:LegendGraphic");
1600  }
1601 
1602  if(rule->getFilter())
1603  te::fe::serialize::Save(rule->getFilter(), writer);
1604  else if(rule->hasElseFilter())
1605  writer.writeElement("se:ElseFilter", "");
1606 
1607  if(rule->getMinScaleDenominator() != 0.0)
1608  writer.writeElement("se:MinScaleDenominator", rule->getMinScaleDenominator());
1609 
1610  if(rule->getMaxScaleDenominator() != std::numeric_limits<double>::infinity())
1611  writer.writeElement("se:MaxScaleDenominator", rule->getMaxScaleDenominator());
1612 
1613  const std::vector<te::se::Symbolizer*>& symbs = rule->getSymbolizers();
1614  for(std::size_t i = 0; i < symbs.size(); ++i)
1615  Symbolizer::getInstance().write(symbs[i], writer);
1616 
1617  writer.writeEndElement("se:Rule");
1618 }
1619 
1621 {
1622  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1623  assert(reader.getElementLocalName() == "GrayChannel" || reader.getElementLocalName() == "RedChannel" ||
1624  reader.getElementLocalName() == "GreenChannel" || reader.getElementLocalName() == "BlueChannel");
1625 
1626  reader.next();
1627 
1628  std::unique_ptr<te::se::SelectedChannel> sc(new te::se::SelectedChannel);
1629 
1630  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1631  assert(reader.getElementLocalName() == "SourceChannelName");
1632 
1633  // SourceChannelName
1634  reader.next();
1635  assert(reader.getNodeType() == te::xml::VALUE);
1636  sc->setSourceChannelName(reader.getElementValue());
1637  reader.next();
1638 
1639  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1640  reader.next();
1641 
1642  // ContrastEnhancement
1643  if(reader.getElementLocalName() == "ContrastEnhancement")
1644  sc->setContrastEnhancement(ReadContrastEnhancement(reader));
1645 
1646  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1647  reader.next();
1648 
1649  return sc.release();
1650 }
1651 
1653 {
1654  if(sc == nullptr)
1655  return;
1656 
1657  assert(!sc->getSourceChannelName().empty());
1658  writer.writeElement("se:SourceChannelName", sc->getSourceChannelName());
1659 
1660  Save(sc->getContrastEnhancement(), writer);
1661 }
1662 
1664 {
1665  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1666  assert(reader.getElementLocalName() == "ShadedRelief");
1667 
1668  reader.next();
1669 
1670  std::unique_ptr<te::se::ShadedRelief> sr(new te::se::ShadedRelief);
1671 
1672  if(reader.getElementLocalName() == "BrightnessOnly")
1673  {
1674  reader.next();
1675  assert(reader.getNodeType() == te::xml::VALUE);
1676  sr->setBrightnessOnly(reader.getElementValueAsBoolean());
1677  reader.next();
1678  }
1679 
1680  if(reader.getElementLocalName() == "ReliefFactor")
1681  {
1682  reader.next();
1683  assert(reader.getNodeType() == te::xml::VALUE);
1684  sr->setReliefFactor(reader.getElementValueAsDouble());
1685  reader.next();
1686  }
1687 
1688  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1689  reader.next();
1690 
1691  return sr.release();
1692 }
1693 
1695 {
1696  if(sr == nullptr)
1697  return;
1698 
1699  writer.writeStartElement("se:ShadedRelief");
1700 
1701  std::string brightnessOnlyValue;
1702  sr->isBrightnessOnly() ? brightnessOnlyValue = "true" : brightnessOnlyValue = "false";
1703 
1704  writer.writeElement("se:BrightnessOnly", brightnessOnlyValue);
1705  writer.writeElement("se:ReliefFactor", sr->getReliefFactor());
1706 
1707  writer.writeEndElement("se:ShadedRelief");
1708 }
1709 
1711 {
1712  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1713  assert(reader.getElementLocalName() == "Stroke");
1714 
1715  reader.next();
1716 
1717  std::unique_ptr<te::se::Stroke> stroke(new te::se::Stroke);
1718 
1719  // GraphicFill
1720  if(reader.getElementLocalName() == "GraphicFill")
1721  {
1722  reader.next();
1723  stroke->setGraphicFill(ReadGraphic(reader));
1724 
1725  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1726  reader.next();
1727  }
1728  // GraphicStroke
1729  else if(reader.getElementLocalName() == "GraphicStroke")
1730  stroke->setGraphicStroke(ReadGraphicStroke(reader));
1731 
1732  // SvgParameters
1733  while(reader.getNodeType() == te::xml::START_ELEMENT &&
1734  reader.getElementLocalName() == "SvgParameter")
1735  stroke->add(ReadSvgParameter(reader));
1736 
1737  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1738  reader.next();
1739 
1740  return stroke.release();
1741 }
1742 
1744 {
1745  if(stroke == nullptr)
1746  return;
1747 
1748  writer.writeStartElement("se:Stroke");
1749 
1750  if(stroke->getGraphicFill())
1751  {
1752  writer.writeStartElement("se:GraphicFill");
1753  Save(stroke->getGraphicFill(), writer);
1754  writer.writeEndElement("se:GraphicFill");
1755  }
1756  else if(stroke->getGraphicStroke())
1757  Save(stroke->getGraphicStroke(), writer);
1758 
1759  Save(stroke->getColor(), writer);
1760  Save(stroke->getOpacity(), writer);
1761  Save(stroke->getWidth(), writer);
1762  Save(stroke->getLineJoin(), writer);
1763  Save(stroke->getLineCap(), writer);
1764  Save(stroke->getDashArray(), writer);
1765  Save(stroke->setDashOffset(), writer);
1766 
1767  writer.writeEndElement("se:Stroke");
1768 }
1769 
1771 {
1772  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1773  assert(reader.getElementLocalName() == "SvgParameter");
1774  assert(reader.hasAttrs());
1775 
1776  std::string name = reader.getAttr("name");
1777  assert(!name.empty());
1778 
1779  std::unique_ptr<te::se::SvgParameter> svgParam(new te::se::SvgParameter(name));
1780 
1781  reader.next();
1782 
1783  // Expression TODO: (n's expressions?)
1785 
1786  if(reader.getNodeType() == te::xml::VALUE)
1787  {
1788  p->m_mixedData = new std::string(reader.getElementValue());
1789  reader.next();
1790  }
1791  else
1792  {
1794  }
1795 
1796  svgParam->add(p);
1797 
1798  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1799  reader.next();
1800 
1801  return svgParam.release();
1802 }
1803 
1805 {
1806  if(p == nullptr)
1807  return;
1808 
1809  writer.writeStartElement("se:SvgParameter");
1810 
1811  writer.writeAttribute("name", p->getName());
1812 
1813  Save(static_cast<const te::se::ParameterValue*>(p), writer);
1814 
1815  writer.writeEndElement("se:SvgParameter");
1816 }
1817 
1818 //#endif
const ParameterValue * getRotation() const
Definition: Graphic.cpp:131
ParameterValue * getValue() const
TEXSDEXPORT void Save(All *all, te::xml::AbstractWriter &writer)
int getMarkIndex() const
Definition: Mark.cpp:103
double getData() const
Definition: MapItem.cpp:68
bool isAligned() const
A selected channel to be display.
const SvgParameter * getLineCap() const
Definition: Stroke.cpp:143
const ParameterValue * getDisplacementX() const
const AnchorPoint * getAnchorPoint() const
ContrastEnhancementType
The type of contrast enhancement.
A Description gives human-readable descriptive information for the object it is included within...
Definition: Description.h:56
const ParameterValue * getRadius() const
Definition: Halo.cpp:49
The transformation of continuous values to distinct values (Categorize function). ...
Definition: Categorize.h:90
bool hasElseFilter() const
Definition: Rule.cpp:113
double getReliefFactor() const
A Mark specifies a geometric shape and applies coloring to it.
Definition: Mark.h:84
This class models a XML reader object.
Definition: xml/Reader.h:55
TESEEXPORT te::se::InterpolationPoint * ReadInterpolationPoint(te::xml::Reader &reader)
Interpolate * getInterpolate() const
Definition: ColorMap.cpp:84
A Displacement gives X and Y offset displacements to use for rendering a text label, graphic or other Symbolizer near a point.
Definition: Displacement.h:58
A LinePlacement specifies how a text label should be rendered relative to a linear geometry...
Definition: LinePlacement.h:61
The LabelPlacement specifies where and how a text label should be rendered relative to a geometry...
const std::vector< ExternalGraphic * > getExternalGraphics() const
Definition: Graphic.cpp:76
const std::string & getTitle() const
Definition: Description.cpp:38
const std::string & getFallbackValue() const
Definition: se/Function.cpp:38
virtual void writeStartElement(const std::string &qName)=0
virtual bool hasAttrs() const =0
It tells if the element has attributes in the case of an element node.
const ParameterValue * getGap() const
const Displacement * getDisplacement() const
TESEEXPORT te::se::SvgParameter * ReadSvgParameter(te::xml::Reader &reader)
te::fe::Expression * m_expression
Parameter from an expression.
virtual void writeValue(const std::string &value)=0
const double & getMinScaleDenominator() const
Definition: Rule.cpp:123
const SvgParameter * getLineJoin() const
Definition: Stroke.cpp:138
TESEEXPORT te::se::Recode * ReadRecode(te::xml::Reader &reader)
bool isBrightnessOnly() const
const ParameterValue * getInitialGap() const
TEFEEXPORT te::fe::Filter * ReadFilter(te::xml::Reader &reader)
ThresholdsBelongToType
It controls the interval order.
Definition: Categorize.h:99
const SvgParameter * getFamily() const
Definition: Font.cpp:88
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
std::string * m_mixedData
Parameter from a mixed data content.
ParameterValue * getLookupValue() const
Definition: Interpolate.h:149
const std::vector< InterpolationPoint * > & getInterpolationPoints() const
Definition: Interpolate.cpp:91
const std::string & getAbstract() const
Definition: Description.cpp:48
bool isRepeated() const
Definition: LinePlacement.h:89
SelectedChannel * getRedChannel() const
TESEEXPORT te::se::GraphicStroke * ReadGraphicStroke(te::xml::Reader &reader)
const std::string & getData() const
const ThresholdsBelongToType & getThresholdsBelongTo() const
Definition: Categorize.h:147
TESEEXPORT te::se::ContrastEnhancement * ReadContrastEnhancement(te::xml::Reader &reader)
Utility methods for the Symbology serialization.
SelectedChannel * getBlueChannel() const
void setDashOffset(const std::string &offset)
Definition: Stroke.cpp:118
std::string getTitle() const
Definition: MapItem.cpp:78
const te::fe::Filter * getFilter() const
Definition: Rule.cpp:97
const ParameterValue * getRotation() const
This class models a XML writer object.
A Graphic is a graphic symbol with an inherent shape, color(s), and possibly size.
Definition: Graphic.h:66
const SvgParameter * getWeight() const
Definition: Font.cpp:98
The transformation of continuous values to a number of values (Interpolate function).
Definition: Interpolate.h:88
const MethodType & geMethodType() const
Definition: Interpolate.h:159
const AnchorPoint * getAnchorPoint() const
Definition: Graphic.cpp:142
TESEEXPORT te::se::Fill * ReadFill(te::xml::Reader &reader)
TESEEXPORT te::se::Halo * ReadHalo(te::xml::Reader &reader)
InlineContent is XML- or base64-encoded encoded content in some externally-defined format that is inc...
Definition: InlineContent.h:51
The "ParameterValueType" uses WFS-Filter expressions to give values for SE graphic parameters...
void WriteStringPtrHelper(const std::string &elementName, const std::string *s, te::xml::AbstractWriter &writer)
const std::string * getFormat() const
Definition: Mark.cpp:93
TESEEXPORT te::se::Mark * ReadMark(te::xml::Reader &reader)
TESEEXPORT te::se::ParameterValue * ReadParameterValue(te::xml::Reader &reader)
const ParameterValue * getGap() const
Definition: LinePlacement.h:97
An AnchorPoint identifies the location inside of a text label to use an &#39;anchor&#39; for positioning it r...
Definition: AnchorPoint.h:63
std::string getSourceChannelName() const
const ParameterValue * getDisplacementY() const
TESEEXPORT te::se::Stroke * ReadStroke(te::xml::Reader &reader)
const std::vector< ParameterValue * > & getThresholds() const
Definition: Categorize.cpp:109
const SvgParameter * getSize() const
Definition: Font.cpp:103
const Parameter * getParameter(size_t i) const
const te::xl::SimpleLink * getOnlineResource() const
TESEEXPORT te::se::Categorize * ReadCategorize(te::xml::Reader &reader)
std::pair< std::string, std::string > Parameter
Definition: LibraryInfo.h:62
A PointPlacement specifies how a text label should be rendered relative to a geometric point...
ParameterValue * getValue() const
Definition: MapItem.cpp:73
TESEEXPORT RasterSymbolizer::OverlapBehavior ReadOverlapBehavior(te::xml::Reader &reader)
virtual void writeElement(const std::string &qName, const std::string &value)=0
The ExternalGraphic allows a reference to be made to an external graphic file with a Web URL or to in...
const SvgParameter * getOpacity() const
Definition: Stroke.cpp:128
who udp maintains data bases showing who s shell tcp cmd syslog udp printer tcp spooler printer udp spooler videotex tcp videotex videotex udp videotex talk tcp like tenex link
virtual std::string getAttr(const std::string &name) const =0
It returns the attribute value in the case of an element node with valid attributes.
TESEEXPORT te::se::Interpolate * ReadInterpolate(te::xml::Reader &reader)
OverlapBehavior
OverlapBehavior tells a system how to behave when multiple raster images in a layer overlap each othe...
const Graphic * getGraphicFill() const
Gets the GraphicFill element associate to this Stroke.
Definition: Stroke.cpp:63
static T & getInstance()
It returns a reference to the singleton instance.
Definition: Singleton.h:126
virtual double getElementValueAsDouble() const
It returns the element data value in the case of VALUE node.
Definition: xml/Reader.cpp:37
TESEEXPORT te::se::ExternalGraphic * ReadExternalGraphic(te::xml::Reader &reader)
TESEEXPORT te::se::Displacement * ReadDisplacement(te::xml::Reader &reader)
const SvgParameter * getColor() const
Definition: Stroke.cpp:123
const Graphic * getGraphicFill() const
Gets the GraphicFill element associate to this Fill.
Definition: Fill.cpp:52
ModeType
It controls the ...
Definition: Interpolate.h:97
const GraphicStroke * getGraphicStroke() const
Gets the GraphicStroke element associate to this Stroke.
Definition: Stroke.cpp:74
ParameterValue * getLookupValue() const
Definition: Categorize.h:135
EncodingType getEncoding() const
ContrastEnhancement defines the &#39;stretching&#39; of contrast for a channel of a false-color image or for ...
static te::dt::DateTime d(2010, 8, 9, 15, 58, 39)
const InlineContent * getInlineContent() const
MethodType
It controls the ...
Definition: Interpolate.h:109
A Font specifies the text font to use in a text symbolizer.
Definition: Font.h:63
Auxiliary classes and functions to serialize Symbolizer informations from a XML document.
ColorCompositionType getColorCompositionType() const
te::gm::Polygon * p
Recode * getRecode() const
Definition: ColorMap.cpp:95
size_t getNParameters() const
void WriteOnlineResourceHelper(const te::xl::SimpleLink *link, te::xml::AbstractWriter &writer)
ImageOutline specifies how individual source rasters in a multi-raster set (such as a set of satellit...
Definition: ImageOutline.h:53
A Fill specifies the pattern for filling an area geometry.
Definition: Fill.h:59
const ParameterValue * getAnchorPointX() const
Definition: AnchorPoint.cpp:48
std::string getName() const
const std::string * getWellKnownName() const
Definition: Mark.cpp:60
const std::string & getFormat() const
TESEEXPORT te::se::SelectedChannel * ReadSelectedChannel(te::xml::Reader &reader)
TESEEXPORT void Save(const te::se::AnchorPoint *ap, te::xml::AbstractWriter &writer)
const Stroke * getStroke() const
Definition: Mark.cpp:125
ParameterValue * getValue() const
Definition: Categorize.h:139
TESEEXPORT te::se::ColorMap * ReadColorMap(te::xml::Reader &reader)
Transformation of discrete values to other values.
Definition: Recode.h:75
virtual bool getElementValueAsBoolean() const
It returns the element data value in the case of VALUE node.
Definition: xml/Reader.cpp:42
TESEEXPORT te::se::LabelPlacement * ReadLabelPlacement(te::xml::Reader &reader)
TESEEXPORT te::se::InlineContent * ReadInlineContent(te::xml::Reader &reader)
const std::vector< Symbolizer * > & getSymbolizers() const
Definition: Rule.cpp:158
std::vector< MapItem * > getMapItems() const
Definition: Recode.cpp:73
const te::xl::SimpleLink * getOnlineResource() const
Definition: Mark.cpp:71
ContrastEnhancementType getContrastEnhancementType() const
const ParameterValue * getInitialGap() const
Definition: LinePlacement.h:93
InlineContent * getInlineContent() const
Definition: Mark.cpp:82
SelectedChannel * getGreenChannel() const
const Displacement * getDisplacement() const
Definition: Graphic.cpp:153
Data serialization for the Symbology Encoder module.
virtual void writeAttribute(const std::string &attName, const std::string &value)=0
TESEEXPORT te::se::LinePlacement * ReadLinePlacement(te::xml::Reader &reader)
ContrastEnhancement * getContrastEnhancement() const
const std::vector< Mark * > getMarks() const
Definition: Graphic.cpp:98
const LinePlacement * getLinePlacement() const
const SvgParameter * getDashArray() const
Definition: Stroke.cpp:148
A Rule is used to attach property/scale conditions to and group the individual symbols used for rende...
Definition: Rule.h:76
EncodingType
The format type of encoded data.
Definition: InlineContent.h:60
They are used to define a graph of points.
A Stroke specifies the appearance of a linear geometry.
Definition: Stroke.h:67
TESEEXPORT te::se::ChannelSelection * ReadChannelSelection(te::xml::Reader &reader)
TESEEXPORT te::se::PointPlacement * ReadPointPlacement(te::xml::Reader &reader)
const Fill * getFill() const
Definition: Halo.cpp:60
TEFEEXPORT void Save(const te::fe::Filter *filter, te::xml::AbstractWriter &writer)
Categorize * getCategorize() const
Definition: ColorMap.cpp:73
TESEEXPORT te::se::ImageOutline * ReadImageOutline(te::xml::Reader &reader)
const SvgParameter * getStyle() const
Definition: Font.cpp:93
virtual void writeEndElement(const std::string &qName)=0
const ParameterValue * getAnchorPointY() const
Definition: AnchorPoint.cpp:59
TESEEXPORT te::se::Font * ReadFont(te::xml::Reader &reader)
const double & getMaxScaleDenominator() const
Definition: Rule.cpp:133
virtual std::string getElementValue() const =0
It returns the element data value in the case of VALUE node.
const SvgParameter * getColor() const
Definition: Fill.cpp:76
virtual NodeType getNodeType() const =0
It return the type of node read.
A SvgParameter refers to an SVG/CSS graphical-formatting parameter.
Definition: SvgParameter.h:48
const ModeType & getModeType() const
Definition: Interpolate.h:155
TESEEXPORT te::se::Rule * ReadRule(te::xml::Reader &reader)
void WriteParameterValuePtrHelper(const std::string &elementName, const te::se::ParameterValue *p, te::xml::AbstractWriter &writer)
const Description * getDescription() const
Definition: Rule.cpp:75
TESEEXPORT te::se::Description * ReadDescription(te::xml::Reader &reader)
Symbolizer * getSymbolizer() const
SelectedChannel * getGrayChannel() const
A Halo is a type of Fill that is applied to the backgrounds of font glyphs.
Definition: Halo.h:64
const PointPlacement * getPointPlacement() const
virtual bool next()=0
It gets the next event to be read.
const ParameterValue * getPerpendicularOffset() const
Definition: LinePlacement.h:85
const ParameterValue * getSize() const
Definition: Graphic.cpp:120
A ColorMap defines either the colors of a pallette-type raster source or the mapping of numeric pixel...
Definition: ColorMap.h:61
ShadedRelief specifies the application of relief shading (or "hill shading") to a DEM raster to give ...
Definition: ShadedRelief.h:58
const Graphic * getGraphic() const
const Graphic * getLegendGraphic() const
Definition: Rule.cpp:86
TESEEXPORT te::se::Graphic * ReadGraphic(te::xml::Reader &reader)
A GraphicStroke defines a repeated-linear graphic pattern to be used for stroking a line...
Definition: GraphicStroke.h:50
TESEEXPORT te::se::ShadedRelief * ReadShadedRelief(te::xml::Reader &reader)
const std::vector< ParameterValue * > & getThresholdValues() const
Definition: Categorize.cpp:114
const SvgParameter * getWidth() const
Definition: Stroke.cpp:133
void WriteSelectedChannelHelper(const std::string &elementName, const te::se::SelectedChannel *sc, te::xml::AbstractWriter &writer)
bool getGeneralizeLine() const
TESEEXPORT te::se::MapItem * ReadMapItem(te::xml::Reader &reader)
const Fill * getFill() const
Definition: Mark.cpp:114
const SvgParameter * getOpacity() const
Definition: Fill.cpp:81
ChannelSelection specifies the false-color channel selection for a multi-spectral raster source (such...
TESEEXPORT te::se::AnchorPoint * ReadAnchorPoint(te::xml::Reader &reader)
const ParameterValue * getOpacity() const
Definition: Graphic.cpp:109
const std::string * getName() const
Definition: Rule.cpp:64