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