attic/src/wms/serialization/xml/Layer.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/wms/serialization/xml/Config.h
22 
23  \brief Auxiliary classes and functions to read/write WMS layers from a XML document.
24 */
25 
26 // TerraLib
27 #include "../../../common/URL.h"
28 #include "../../../geometry/serialization/xml/Serializer.h"
29 #include "../../../maptools/serialization/xml/Utils.h"
30 #include "../../../se/serialization/xml/Style.h"
31 #include "../../../xml/AbstractWriter.h"
32 #include "../../../xml/Reader.h"
33 #include "../../WMSLayer.h"
34 #include "Layer.h"
35 
36 // STL
37 #include <cassert>
38 
40 {
41  std::string id = reader.getAttr("id");
42 
43  /* Title Element */
44  reader.next();
45  std::string title = te::map::serialize::ReadLayerTitle(reader);
46  reader.next();
47 
48  /* Visible Element */
49  std::string visible = te::map::serialize::ReadLayerVisibility(reader);
50  reader.next();
51 
52  /* Encoding Element */
53  std::string encoding = te::map::serialize::ReadLayerEncoding(reader);
54  if (!encoding.empty())
55  reader.next();
56  else
58 
59  /* Grouping */
61 
62  /* Chart */
63  std::auto_ptr<te::map::Chart> chart(te::map::serialize::ReadLayerChart(reader));
64 
65  /* DataSetName Element */
66  std::string dataset = te::map::serialize::ReadDataSetName(reader);
67  reader.next();
68 
69  /* DataSourceId Element */
70  std::string datasourceId = te::map::serialize::ReadDataSourceId(reader);
71  reader.next();
72 
73  /* SRID Element */
74  assert(reader.getNodeType() == te::xml::START_ELEMENT);
75  assert(reader.getElementLocalName() == "SRID");
76  reader.next();
77  assert(reader.getNodeType() == te::xml::VALUE);
78  int srid = reader.getElementValueAsInt32();
79  reader.next();
80  assert(reader.getNodeType() == te::xml::END_ELEMENT);
81 
82  /* Extent Element */
83  reader.next();
84  assert(reader.getNodeType() == te::xml::START_ELEMENT);
85  assert(reader.getElementLocalName() == "Extent");
86  std::auto_ptr<te::gm::Envelope> mbr(te::serialize::xml::ReadExtent(reader));
87 
88  /* RendererId Element */
89  assert(reader.getNodeType() == te::xml::START_ELEMENT);
90  assert(reader.getElementLocalName() == "RendererId");
91  reader.next();
92  assert(reader.getNodeType() == te::xml::VALUE);
93  std::string rendererId = reader.getElementValue();
94  reader.next();
95  assert(reader.getNodeType() == te::xml::END_ELEMENT);
96 
97  /* Composition Mode Element */
98  reader.next();
99  int compositionMode = te::map::SourceOver;
100  if(reader.getNodeType() == te::xml::START_ELEMENT && reader.getElementLocalName() == "CompositionMode")
101  {
102  reader.next();
103  assert(reader.getNodeType() == te::xml::VALUE);
104  compositionMode = reader.getElementValueAsInt32();
105  reader.next();
106  assert(reader.getNodeType() == te::xml::END_ELEMENT);
107  reader.next();
108  }
109 
110  /* has a Style Element ? */
111  std::auto_ptr<te::se::Style> style;
112 
113  if((reader.getNodeType() == te::xml::START_ELEMENT) &&
114  (reader.getElementLocalName() == "Style"))
115  {
116  reader.next();
117  assert(reader.getNodeType() == te::xml::START_ELEMENT);
118 
119  style.reset(te::se::serialize::Style::getInstance().read(reader));
120 
121  assert(reader.getNodeType() == te::xml::END_ELEMENT);
122  assert(reader.getElementLocalName() == "Style");
123 
124  reader.next();
125  }
126 
127  assert(reader.getNodeType() == te::xml::END_ELEMENT);
128  assert(reader.getElementLocalName() == "WMSLayer");
129 
130  reader.next();
131 
132  std::auto_ptr<te::wms::WMSLayer> layer(new te::wms::WMSLayer(id, title, 0));
133  layer->setSRID(srid);
134  layer->setExtent(*mbr.get());
135  layer->setVisibility(te::map::serialize::GetVisibility(visible));
136  layer->setDataSetName(dataset);
137  layer->setDataSourceId(datasourceId);
138  layer->setRendererType(rendererId);
139  layer->setCompositionMode((te::map::CompositionMode)compositionMode);
140  layer->setStyle(style.release());
141 
142  if(grouping)
143  layer->setGrouping(grouping);
144 
145  if(chart.get())
146  layer->setChart(chart.release());
147 
148  return layer.release();
149 }
150 
152 {
153  const te::wms::WMSLayer* layer = dynamic_cast<const te::wms::WMSLayer*>(alayer);
154 
155  if(layer == 0)
156  return;
157 
158  writer.writeStartElement("te_map:WMSLayer");
159 
161 
162  writer.writeElement("te_map:DataSetName", layer->getDataSetName());
163  writer.writeElement("te_map:DataSourceId", layer->getDataSourceId());
164  writer.writeElement("te_map:SRID", layer->getSRID());
165  te::serialize::xml::SaveExtent(layer->getExtent(), writer);
166  writer.writeElement("te_map:RendererId", layer->getRendererType());
167  writer.writeElement("te_map:CompositionMode", (int)layer->getCompositionMode());
168 
169  if(layer->getStyle())
170  {
171  writer.writeStartElement("te_map:Style");
172 
173  te::se::serialize::Style::getInstance().write(layer->getStyle(), writer);
174 
175  writer.writeEndElement("te_map:Style");
176  }
177 
178  writer.writeEndElement("te_map:WMSLayer");
179 }
te::map::AbstractLayer * LayerReader(te::xml::Reader &reader)
TEMAPEXPORT std::string ReadLayerVisibility(te::xml::Reader &reader)
TEMAPEXPORT void WriteAbstractLayer(const te::map::AbstractLayer *layer, te::xml::AbstractWriter &writer)
TEMAPEXPORT std::string ReadLayerEncoding(te::xml::Reader &reader)
virtual boost::int32_t getElementValueAsInt32() const
It returns the element data value in the case of VALUE node.
Definition: xml/Reader.cpp:32
This class models a XML reader object.
Definition: xml/Reader.h:55
This is the base class for layers.
Definition: AbstractLayer.h:77
virtual const te::gm::Envelope & getExtent() const
It returns the Layer extent (or minimum bounding box).
TEMAPEXPORT std::string ReadDataSourceId(te::xml::Reader &reader)
virtual void writeStartElement(const std::string &qName)=0
TEMAPEXPORT std::string ReadLayerTitle(te::xml::Reader &reader)
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
const std::string & getDataSetName() const
This class models a XML writer object.
TEMAPEXPORT std::string ReadDataSetName(te::xml::Reader &reader)
TEMAPEXPORT te::map::Grouping * ReadLayerGrouping(te::xml::Reader &reader)
te::map::CompositionMode getCompositionMode() const
It returns the composition mode.
void LayerWriter(const te::map::AbstractLayer *alayer, te::xml::AbstractWriter &writer)
CompositionMode
The composition mode used to render the canvas.
This class contains the parameters needed for grouping the values of a Property.
Definition: Grouping.h:57
virtual void writeElement(const std::string &qName, const std::string &value)=0
static std::string getEncodingName(EncodingType et)
Retrive a string from a given character encoding type enum.
A layer with reference to a WMS Layer.
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.
const std::string & getDataSourceId() const
static Style & getInstance()
It returns a reference to the singleton instance.
TEGEOMEXPORT std::unique_ptr< te::gm::Envelope > ReadExtent(te::xml::Reader &reader)
virtual te::se::Style * getStyle() const
It returns the Style associated to the layer.
TEGEOMEXPORT void SaveExtent(const te::gm::Envelope &e, te::xml::AbstractWriter &writer)
TEMAPEXPORT te::map::Visibility GetVisibility(const std::string &visible)
TEMAPEXPORT std::unique_ptr< te::map::Chart > ReadLayerChart(te::xml::Reader &reader)
const std::string & getRendererType() const
virtual void writeEndElement(const std::string &qName)=0
virtual std::string getElementValue() const =0
It returns the element data value in the case of VALUE node.
virtual NodeType getNodeType() const =0
It return the type of node read.
virtual int getSRID() const
It returns the Spatial Reference System ID associated to the Layer.
virtual bool next()=0
It gets the next event to be read.