src/terralib/maptools/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 src/terralib/maptools/serialization/xml/Layer.cpp
22 
23  \brief Auxiliary classes and functions to read layer information from a XML document.
24 */
25 
26 // TerraLib
27 #include "../../../common/BoostUtils.h"
28 #include "../../../core/translator/Translator.h"
29 #include "../../../color/RGBAColor.h"
30 #include "../../../dataaccess/dataset/AttributeConverterManager.h"
31 #include "../../../dataaccess/dataset/DataSetTypeConverter.h"
32 #include "../../../dataaccess/datasource/DataSourceManager.h"
33 #include "../../../dataaccess/serialization/xml/Serializer.h"
34 #include "../../../dataaccess/utils/Utils.h"
35 #include "../../../datatype/DateTimeProperty.h"
36 #include "../../../datatype/NumericProperty.h"
37 #include "../../../datatype/Property.h"
38 #include "../../../datatype/SimpleProperty.h"
39 #include "../../../datatype/StringProperty.h"
40 #include "../../../datatype/serialization/xml/Serializer.h"
41 #include "../../../geometry/Envelope.h"
42 #include "../../../geometry/GeometryProperty.h"
43 #include "../../../geometry/serialization/xml/Serializer.h"
44 #include "../../../se/CoverageStyle.h"
45 #include "../../../xml/AbstractWriter.h"
46 #include "../../../xml/Reader.h"
47 #include "../../../maptools/AbstractLayer.h"
48 #include "../../../maptools/Chart.h"
49 #include "../../../maptools/DataSetAdapterLayer.h"
50 #include "../../../maptools/DataSetLayer.h"
51 #include "../../../maptools/FolderLayer.h"
52 #include "../../../maptools/Grouping.h"
53 #include "../../../maptools/QueryLayer.h"
54 #include "../../../maptools/RasterLayer.h"
55 #include "../../../maptools/RasterContrast.h"
56 #include "../../../se/RasterSymbolizer.h"
57 #include "../../../se/serialization/xml/Style.h"
58 #include "../../../se/serialization/xml/Symbolizer.h"
59 #include "../../Exception.h"
60 #include "Layer.h"
61 #include "Utils.h"
62 
63 // STL
64 #include <cassert>
65 #include <memory>
66 
67 // Boost
68 #include <boost/algorithm/string/case_conv.hpp>
69 #include <boost/format.hpp>
70 #include <boost/lexical_cast.hpp>
71 
82 
83 te::dt::SimpleProperty* GetProperty(std::string name, int dataType, int geomType, int srid)
84 {
85  te::dt::SimpleProperty* simpleProperty = nullptr;
86 
87  switch(dataType)
88  {
90  case te::dt::CHAR_TYPE:
92  case te::dt::FLOAT_TYPE:
93  case te::dt::INT16_TYPE:
94  case te::dt::INT32_TYPE:
95  case te::dt::INT64_TYPE:
96  case te::dt::UCHAR_TYPE:
100  {
101  simpleProperty = new te::dt::SimpleProperty(name, dataType);
102  break;
103  }
104 
105  case te::dt::STRING_TYPE:
106  {
107  simpleProperty = new te::dt::StringProperty(name);
108  break;
109  }
110 
112  {
113  simpleProperty = new te::dt::NumericProperty(name, 0, 0);
114  break;
115  }
116 
118  {
119  simpleProperty = new te::dt::DateTimeProperty(name);
120  break;
121  }
122 
124  {
125  simpleProperty = new te::gm::GeometryProperty(name, srid, static_cast<te::gm::GeomType>(geomType));
126  break;
127  }
128 
129  default:
130  {
131  simpleProperty = nullptr;
132  return nullptr;
133  }
134  }
135 
136  return simpleProperty;
137 }
138 
139 void te::map::serialize::Layer::reg(const std::string& layerType, const LayerFnctSerializeType& fncts)
140 {
141  m_fncts[layerType] = fncts;
142 }
143 
145 {
146  std::string layerType = boost::to_upper_copy(reader.getElementLocalName());
147 
148  LayerFnctIdxType::const_iterator it = m_fncts.find(layerType);
149 
150  if(it == m_fncts.end())
151  throw Exception((boost::format(TE_TR("Could not find a reader for the following layer type: %1%.")) % layerType).str());
152 
153  assert(it->second.second);
154 
155  return it->second.first(reader);
156 }
157 
159 {
160  assert(alayer);
161 
162  LayerFnctIdxType::const_iterator it = m_fncts.find(alayer->getType());
163 
164  if(it == m_fncts.end())
165  throw Exception((boost::format(TE_TR("Could not find a writer for the following layer type: %1%.")) % alayer->getType()).str());
166 
167  assert(it->second.second);
168 
169  return it->second.second(alayer, writer);
170 }
171 
173 
175 {
181 }
182 
184 {
185  std::string id = reader.getAttr("id");
186 
187  /* Title Element */
188  reader.next();
189  std::string title = te::map::serialize::ReadLayerTitle(reader);
190  reader.next();
191 
192  /* Visible Element */
193  std::string visible = te::map::serialize::ReadLayerVisibility(reader);
194  reader.next();
195 
196  /* Encoding Element */
197  std::string encoding = te::map::serialize::ReadLayerEncoding(reader);
198  if (!encoding.empty())
199  reader.next();
200  else
202 
203  /* Grouping */
205 
206  /* Chart */
207  std::unique_ptr<te::map::Chart> chart(te::map::serialize::ReadLayerChart(reader));
208 
209  /* RasterContrast */
210  std::unique_ptr<te::map::RasterContrast> rc(te::map::serialize::ReadLayerRasterContrast(reader));
211 
212  /* DataSetName Element */
213  std::string dataset = te::map::serialize::ReadDataSetName(reader);
214  reader.next();
215 
216  /* DataSourceId Element */
217  std::string datasourceId = te::map::serialize::ReadDataSourceId(reader);
218  reader.next();
219 
220  /* SRID Element */
221  int srid = te::map::serialize::ReadSRIDValue(reader);
222 
223  /* Extent Element */
224  reader.next();
225  assert(reader.getNodeType() == te::xml::START_ELEMENT);
226  assert(reader.getElementLocalName() == "Extent");
227  std::unique_ptr<te::gm::Envelope> mbr(te::serialize::xml::ReadExtent(reader));
228 
229  /* RendererId Element */
230  assert(reader.getNodeType() == te::xml::START_ELEMENT);
231  assert(reader.getElementLocalName() == "RendererId");
232  reader.next();
233  assert(reader.getNodeType() == te::xml::VALUE);
234  std::string rendererId = reader.getElementValue();
235  reader.next();
236  assert(reader.getNodeType() == te::xml::END_ELEMENT);
237 
238  /* Composition Mode Element */
239  reader.next();
240  int compositionMode = te::map::SourceOver;
241  if(reader.getNodeType() == te::xml::START_ELEMENT && reader.getElementLocalName() == "CompositionMode")
242  {
243  reader.next();
244  assert(reader.getNodeType() == te::xml::VALUE);
245  compositionMode = reader.getElementValueAsInt32();
246  reader.next();
247  assert(reader.getNodeType() == te::xml::END_ELEMENT);
248  reader.next();
249  }
250 
251  /* has a Style Element ? */
252  std::unique_ptr<te::se::Style> style;
253 
254  if((reader.getNodeType() == te::xml::START_ELEMENT) &&
255  (reader.getElementLocalName() == "Style"))
256  {
257  reader.next();
258  assert(reader.getNodeType() == te::xml::START_ELEMENT);
259 
260  style.reset(te::se::serialize::Style::getInstance().read(reader));
261 
262  assert(reader.getNodeType() == te::xml::END_ELEMENT);
263  assert(reader.getElementLocalName() == "Style");
264 
265  reader.next();
266  }
267 
268  /* has a Selection Style Element ? */
269  std::unique_ptr<te::se::Style> selectionStyle;
270 
271  if ((reader.getNodeType() == te::xml::START_ELEMENT) &&
272  (reader.getElementLocalName() == "SelectionStyle"))
273  {
274  reader.next();
275  assert(reader.getNodeType() == te::xml::START_ELEMENT);
276 
277  selectionStyle.reset(te::se::serialize::Style::getInstance().read(reader));
278 
279  assert(reader.getNodeType() == te::xml::END_ELEMENT);
280  assert(reader.getElementLocalName() == "SelectionStyle");
281 
282  reader.next();
283  }
284 
285  assert(reader.getNodeType() == te::xml::END_ELEMENT);
286  assert(reader.getElementLocalName() == "DataSetLayer");
287 
288  reader.next();
289 
290  std::unique_ptr<te::map::DataSetLayer> layer(new te::map::DataSetLayer(id, title, nullptr));
291  layer->setExtent(*mbr.get());
292  layer->setVisibility(te::map::serialize::GetVisibility(visible));
293  layer->setDataSetName(dataset);
294  layer->setDataSourceId(datasourceId);
295  layer->setRendererType(rendererId);
296  layer->setCompositionMode(static_cast<te::map::CompositionMode>(compositionMode));
297  layer->setStyle(style.release());
298  layer->setSelectionStyle(selectionStyle.release());
299  layer->setSRID(srid);
300  layer->setEncoding(te::core::CharEncoding::getEncodingType(encoding));
301 
302  if(grouping)
303  layer->setGrouping(grouping);
304 
305  if(chart.get())
306  layer->setChart(chart.release());
307 
308  if (rc.get())
309  layer->setRasterContrast(rc.release());
310 
311  return layer.release();
312 }
313 
315 {
316  std::string id = reader.getAttr("id");
317 
318  /* Title Element */
319  reader.next();
320  std::string title = te::map::serialize::ReadLayerTitle(reader);
321 
322  /* Visible Element */
323  reader.next();
324  std::string visible = te::map::serialize::ReadLayerVisibility(reader);
325  reader.next();
326 
327  /* Encoding Element */
328  std::string encoding = te::map::serialize::ReadLayerEncoding(reader);
329  if (!encoding.empty())
330  reader.next();
331  else
333 
334  /* Grouping */
336 
337  /* Chart */
338  std::unique_ptr<te::map::Chart> chart(te::map::serialize::ReadLayerChart(reader));
339 
340  /* RasterContrast */
341  std::unique_ptr<te::map::RasterContrast> rc(te::map::serialize::ReadLayerRasterContrast(reader));
342 
343  /* Query Element */
344  assert(reader.getNodeType() == te::xml::START_ELEMENT);
345  assert(reader.getElementLocalName() == "Select");
347 
348  /* DataSetName Element */
349  std::string dataset;
350  if(reader.getElementLocalName() == "DataSetName")
351  {
352  dataset = te::map::serialize::ReadDataSetName(reader);
353  reader.next();
354  }
355 
356  /* DataSourceId Element */
357  std::string datasourceId = te::map::serialize::ReadDataSourceId(reader);
358  reader.next();
359 
360  /* SRID Element */
361  int srid = te::map::serialize::ReadSRIDValue(reader);
362 
363  /* Extent Element */
364  reader.next();
365  assert(reader.getNodeType() == te::xml::START_ELEMENT);
366  assert(reader.getElementLocalName() == "Extent");
367  std::unique_ptr<te::gm::Envelope> mbr(te::serialize::xml::ReadExtent(reader));
368 
369  /* RendererId Element */
370  assert(reader.getNodeType() == te::xml::START_ELEMENT);
371  assert(reader.getElementLocalName() == "RendererId");
372  reader.next();
373  assert(reader.getNodeType() == te::xml::VALUE);
374  std::string rendererId = reader.getElementValue();
375  reader.next();
376  assert(reader.getNodeType() == te::xml::END_ELEMENT);
377 
378  /* Composition Mode Element */
379  reader.next();
380  int compositionMode = te::map::SourceOver;
381  if(reader.getNodeType() == te::xml::START_ELEMENT && reader.getElementLocalName() == "CompositionMode")
382  {
383  reader.next();
384  assert(reader.getNodeType() == te::xml::VALUE);
385  compositionMode = reader.getElementValueAsInt32();
386  reader.next();
387  assert(reader.getNodeType() == te::xml::END_ELEMENT);
388  reader.next();
389  }
390 
391  /* has a Style Element ? */
392  std::unique_ptr<te::se::Style> style;
393 
394  if((reader.getNodeType() == te::xml::START_ELEMENT) &&
395  (reader.getElementLocalName() == "Style"))
396  {
397  reader.next();
398  assert(reader.getNodeType() == te::xml::START_ELEMENT);
399 
400  style.reset(te::se::serialize::Style::getInstance().read(reader));
401 
402  assert(reader.getNodeType() == te::xml::END_ELEMENT);
403  assert(reader.getElementLocalName() == "Style");
404 
405  reader.next();
406  }
407 
408  /* has a Selection Style Element ? */
409  std::unique_ptr<te::se::Style> selectionStyle;
410 
411  if ((reader.getNodeType() == te::xml::START_ELEMENT) &&
412  (reader.getElementLocalName() == "SelectionStyle"))
413  {
414  reader.next();
415  assert(reader.getNodeType() == te::xml::START_ELEMENT);
416 
417  selectionStyle.reset(te::se::serialize::Style::getInstance().read(reader));
418 
419  assert(reader.getNodeType() == te::xml::END_ELEMENT);
420  assert(reader.getElementLocalName() == "SelectionStyle");
421 
422  reader.next();
423  }
424 
425  assert(reader.getNodeType() == te::xml::END_ELEMENT);
426  assert(reader.getElementLocalName() == "QueryLayer");
427 
428  reader.next();
429 
430  std::unique_ptr<te::map::QueryLayer> layer(new te::map::QueryLayer(id, title, nullptr));
431  layer->setDataSetName(dataset);
432  layer->setDataSourceId(datasourceId);
433  layer->setSRID(srid);
434  layer->setExtent(*mbr.get());
435  layer->setVisibility(te::map::serialize::GetVisibility(visible));
436  layer->setQuery(query);
437  layer->setDataSourceId(datasourceId);
438  layer->setRendererType(rendererId);
439  layer->setCompositionMode(static_cast<te::map::CompositionMode>(compositionMode));
440  layer->setStyle(style.release());
441  layer->setSelectionStyle(selectionStyle.release());
442  layer->setEncoding(te::core::CharEncoding::getEncodingType(encoding));
443 
444  if(grouping)
445  layer->setGrouping(grouping);
446 
447  if(chart.get())
448  layer->setChart(chart.release());
449 
450  if (rc.get())
451  layer->setRasterContrast(rc.release());
452 
453  return layer.release();
454 }
455 
457 {
458  std::string id = reader.getAttr("id");
459 
460  /* Title Element */
461  reader.next();
462  std::string title = te::map::serialize::ReadLayerTitle(reader);
463 
464  /* Visible Element */
465  reader.next();
466  std::string visible = te::map::serialize::ReadLayerVisibility(reader);
467 
468  reader.next();
469  assert(reader.getNodeType() == te::xml::START_ELEMENT);
470  assert(reader.getElementLocalName() == "LayerList");
471 
472  reader.next();
473 
474  std::unique_ptr<te::map::FolderLayer> flayer(new te::map::FolderLayer(id, title, nullptr));
475 
476  flayer->setVisibility(te::map::serialize::GetVisibility(visible));
477 
479 
480  while((reader.getNodeType() != te::xml::END_ELEMENT) &&
481  (reader.getElementLocalName() != "LayerList"))
482  {
483  te::map::AbstractLayerPtr layer(lserial.read(reader));
484 
485  if(layer.get() == nullptr)
486  break;
487 
488  flayer->add(layer);
489  }
490 
491  reader.next();
492  assert(reader.getNodeType() == te::xml::END_ELEMENT);
493  assert(reader.getElementLocalName() == "FolderLayer");
494 
495  reader.next();
496 
497  return flayer.release();
498 }
499 
501 {
502  std::string id = reader.getAttr("id");
503 
504  /* Title Element */
505  reader.next();
506  std::string title = te::map::serialize::ReadLayerTitle(reader);
507 
508  /* Visible Element */
509  reader.next();
510  std::string visible = te::map::serialize::ReadLayerVisibility(reader);
511 
512  /* DataSetName Element */
513  std::string dataset = te::map::serialize::ReadDataSetName(reader);
514  reader.next();
515 
516  /* DataSourceId Element */
517  std::string datasourceId = te::map::serialize::ReadDataSourceId(reader);
518  reader.next();
519 
520  /* ConnectionInfo Element */
521  assert(reader.getNodeType() == te::xml::START_ELEMENT);
522  assert(reader.getElementLocalName() == "ConnectionInfo");
523 
524  std::map<std::string, std::string> conninfo;
525 
526  while(reader.next() &&
527  (reader.getNodeType() == te::xml::START_ELEMENT) &&
528  (reader.getElementLocalName() == "Parameter"))
529  {
530  // Parameter Name
531  reader.next();
532  assert(reader.getNodeType() == te::xml::START_ELEMENT);
533  assert(reader.getElementLocalName() == "Name");
534  reader.next();
535  assert(reader.getNodeType() == te::xml::VALUE);
536  std::string paramName = reader.getElementValue();
537  reader.next();
538  assert(reader.getNodeType() == te::xml::END_ELEMENT);
539 
540  // Parameter Value
541  reader.next();
542  assert(reader.getNodeType() == te::xml::START_ELEMENT);
543  assert(reader.getElementLocalName() == "Value");
544  reader.next();
545  assert(reader.getNodeType() == te::xml::VALUE);
546  std::string paramValue = reader.getElementValue();
547  reader.next();
548  assert(reader.getNodeType() == te::xml::END_ELEMENT);
549 
550  conninfo[paramName] = paramValue;
551 
552  reader.next();
553  assert(reader.getNodeType() == te::xml::END_ELEMENT);
554  }
555 
556  assert(reader.getNodeType() == te::xml::END_ELEMENT); // End of ConnectionInfo Element
557 
558  /* SRID Element */
559  int srid = te::map::serialize::ReadSRIDValue(reader);
560 
561  /* Extent Element */
562  reader.next();
563  assert(reader.getNodeType() == te::xml::START_ELEMENT);
564  assert(reader.getElementLocalName() == "Extent");
565  std::unique_ptr<te::gm::Envelope> mbr(te::serialize::xml::ReadExtent(reader));
566 
567  /* RendererId Element */
568  assert(reader.getNodeType() == te::xml::START_ELEMENT);
569  assert(reader.getElementLocalName() == "RendererId");
570  reader.next();
571  assert(reader.getNodeType() == te::xml::VALUE);
572  std::string rendererId = reader.getElementValue();
573  reader.next();
574  assert(reader.getNodeType() == te::xml::END_ELEMENT);
575 
576  /* Composition Mode Element */
577  reader.next();
578  int compositionMode = te::map::SourceOver;
579  if(reader.getNodeType() == te::xml::START_ELEMENT && reader.getElementLocalName() == "CompositionMode")
580  {
581  reader.next();
582  assert(reader.getNodeType() == te::xml::VALUE);
583  compositionMode = reader.getElementValueAsInt32();
584  reader.next();
585  assert(reader.getNodeType() == te::xml::END_ELEMENT);
586  reader.next();
587  }
588 
589  /* has a Style Element ? */
590  std::unique_ptr<te::se::Style> style;
591 
592  if((reader.getNodeType() == te::xml::START_ELEMENT) &&
593  (reader.getElementLocalName() == "Style"))
594  {
595  reader.next();
596  assert(reader.getNodeType() == te::xml::START_ELEMENT);
597 
598  style.reset(te::se::serialize::Style::getInstance().read(reader));
599 
600  assert(reader.getNodeType() == te::xml::END_ELEMENT);
601  assert(reader.getElementLocalName() == "Style");
602 
603  reader.next();
604  }
605 
606  assert(reader.getNodeType() == te::xml::END_ELEMENT);
607  assert(reader.getElementLocalName() == "RasterLayer");
608 
609  reader.next();
610 
611  std::unique_ptr<te::map::RasterLayer> layer(new te::map::RasterLayer(id, title, nullptr));
612  layer->setDataSetName(dataset);
613  layer->setDataSourceId(datasourceId);
614  layer->setSRID(srid);
615  layer->setExtent(*mbr.get());
616  layer->setRasterInfo(conninfo);
617  layer->setVisibility(te::map::serialize::GetVisibility(visible));
618  layer->setRendererType(rendererId);
619  layer->setCompositionMode(static_cast<te::map::CompositionMode>(compositionMode));
620  layer->setStyle(dynamic_cast<te::se::CoverageStyle*>(style.release()));
621 
622  return layer.release();
623 }
624 
626 {
627  std::string id = reader.getAttr("id");
628 
629  /* Title Element */
630  reader.next();
631  std::string title = te::map::serialize::ReadLayerTitle(reader);
632 
633  /* Visible Element */
634  reader.next();
635  std::string visible = te::map::serialize::ReadLayerVisibility(reader);
636  reader.next();
637 
638  /* Encoding Element */
639  std::string encoding = te::map::serialize::ReadLayerEncoding(reader);
640  reader.next();
641 
642  /* DataSetName Element */
643  std::string dataSetName = te::map::serialize::ReadDataSetName(reader);
644  reader.next();
645 
646  /* DataSourceId Element */
647  std::string dataSourceId = te::map::serialize::ReadDataSourceId(reader);
648  reader.next();
649 
650  assert(reader.getNodeType() == te::xml::START_ELEMENT);
651  assert(reader.getElementLocalName() == "RendererType");
652 
653  reader.next();
654 
655  assert(reader.getNodeType() == te::xml::VALUE);
656 
657  std::string rendererType = reader.getElementValue();
658 
659  reader.next();
660 
661  assert(reader.getNodeType() == te::xml::END_ELEMENT); //RendererType
662 
663  /* Composition Mode Element */
664  reader.next();
665  int compositionMode = te::map::SourceOver;
666  if(reader.getNodeType() == te::xml::START_ELEMENT && reader.getElementLocalName() == "CompositionMode")
667  {
668  reader.next();
669  assert(reader.getNodeType() == te::xml::VALUE);
670  compositionMode = reader.getElementValueAsInt32();
671  reader.next();
672  assert(reader.getNodeType() == te::xml::END_ELEMENT);
673  reader.next();
674  }
675 
676  /* has a Style Element ? */
677  std::unique_ptr<te::se::Style> style;
678 
679  if((reader.getNodeType() == te::xml::START_ELEMENT) &&
680  (reader.getElementLocalName() == "Style"))
681  {
682  reader.next();
683  assert(reader.getNodeType() == te::xml::START_ELEMENT);
684 
685  style.reset(te::se::serialize::Style::getInstance().read(reader));
686 
687  assert(reader.getNodeType() == te::xml::END_ELEMENT);
688  assert(reader.getElementLocalName() == "Style");
689 
690  reader.next();
691  }
692 
693  /* has a Selection Style Element ? */
694  std::unique_ptr<te::se::Style> selectionStyle;
695 
696  if ((reader.getNodeType() == te::xml::START_ELEMENT) &&
697  (reader.getElementLocalName() == "SelectionStyle"))
698  {
699  reader.next();
700  assert(reader.getNodeType() == te::xml::START_ELEMENT);
701 
702  selectionStyle.reset(te::se::serialize::Style::getInstance().read(reader));
703 
704  assert(reader.getNodeType() == te::xml::END_ELEMENT);
705  assert(reader.getElementLocalName() == "SelectionStyle");
706 
707  reader.next();
708  }
709 
710  assert(reader.getNodeType() == te::xml::START_ELEMENT);
711  assert(reader.getElementLocalName() == "Converter");
712 
713  reader.next();
714 
715  assert(reader.getNodeType() == te::xml::START_ELEMENT);
716  assert(reader.getElementLocalName() == "InDataSetTypeName");
717 
718  reader.next();
719 
720  std::string inDataSetName = reader.getElementValue();
721 
722  reader.next();
723 
724  assert(reader.getNodeType() == te::xml::END_ELEMENT); // InDataSetTypeName
725 
726  reader.next();
727 
728  std::vector<std::pair<std::string, std::vector<std::size_t> > > props;
729 
730  while(reader.getNodeType() == te::xml::START_ELEMENT &&
731  reader.getElementLocalName() == "OutPropInfo")
732  {
733  reader.next();
734 
735  assert(reader.getNodeType() == te::xml::START_ELEMENT);
736  assert(reader.getElementLocalName() == "type");
737 
738  reader.next();
739 
740  assert(reader.getNodeType() == te::xml::VALUE);
741 
742  int type = reader.getElementValueAsInt32();
743 
744  reader.next();
745 
746  assert(reader.getNodeType() == te::xml::END_ELEMENT); // type
747 
748  reader.next();
749 
750  assert(reader.getNodeType() == te::xml::START_ELEMENT);
751  assert(reader.getElementLocalName() == "name");
752 
753  reader.next();
754 
755  assert(reader.getNodeType() == te::xml::VALUE);
756 
757  std::string name = reader.getElementValue();
758 
759  reader.next();
760 
761  assert(reader.getNodeType() == te::xml::END_ELEMENT); // name
762 
763  reader.next();
764 
765  int geomType;
766 
767  assert(reader.getNodeType() == te::xml::START_ELEMENT);
768  assert(reader.getElementLocalName() == "geomType");
769 
770  reader.next();
771 
772  assert(reader.getNodeType() == te::xml::VALUE);
773 
774  geomType = reader.getElementValueAsInt32();
775 
776  reader.next();
777 
778  assert(reader.getNodeType() == te::xml::END_ELEMENT); // geomType
779  reader.next();
780 
781  int srid = te::map::serialize::ReadSRIDValue(reader);
782 
783  reader.next();
784 
785  assert(reader.getNodeType() == te::xml::END_ELEMENT); // OutPropInfo
786 
787  reader.next();
788 
789  std::pair<std::string, std::vector<std::size_t> > prop;
790  prop.first = name;
791  std::vector<std::size_t> typeVec;
792  typeVec.push_back(static_cast<unsigned long>(type));
793  typeVec.push_back(static_cast<unsigned long>(geomType));
794  typeVec.push_back(static_cast<unsigned long>(srid));
795  prop.second = typeVec;
796  props.push_back(prop);
797  }
798 
799  std::vector<std::vector<std::size_t> > propertyIndexes;
800 
801  while(reader.getNodeType() == te::xml::START_ELEMENT &&
802  reader.getElementLocalName() == "PropertyIndex")
803  {
804  reader.next();
805 
806  std::vector<std::size_t> inIdxs;
807 
808  while(reader.getNodeType() == te::xml::START_ELEMENT &&
809  reader.getElementLocalName() == "InIdx")
810  {
811  reader.next();
812 
813  assert(reader.getNodeType() == te::xml::VALUE);
814 
815  inIdxs.push_back(static_cast<unsigned long>(reader.getElementValueAsInt32()));
816 
817  reader.next();
818 
819  assert(reader.getNodeType() == te::xml::END_ELEMENT); // InIdx
820 
821  reader.next();
822  }
823 
824  assert(reader.getNodeType() == te::xml::END_ELEMENT); // InIdx
825 
826  propertyIndexes.push_back(inIdxs);
827 
828  reader.next();
829  }
830 
831  std::vector<std::string> functionsNames;
832 
833  while(reader.getNodeType() == te::xml::START_ELEMENT &&
834  reader.getElementLocalName() == "FunctionName")
835  {
836 
837  reader.next();
838 
839  assert(reader.getNodeType() == te::xml::VALUE);
840 
841  functionsNames.push_back(reader.getElementValue());
842 
843  reader.next();
844 
845  assert(reader.getNodeType() == te::xml::END_ELEMENT); // FunctionName
846 
847  reader.next();
848  }
849 
850  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Converter
851 
852  reader.next();
853 
854  assert(reader.getNodeType() == te::xml::END_ELEMENT); // DataSetAdapterLayer
855 
856  reader.next();
857 
859  result->setTitle(title);
860 
862  result->setDataSetName(dataSetName);
863  result->setDataSourceId(dataSourceId);
864  result->setRendererType(rendererType);
865  result->setCompositionMode(static_cast<te::map::CompositionMode>(compositionMode));
866  result->setStyle(style.release());
867  result->setSelectionStyle(selectionStyle.release());
868 
870  std::unique_ptr<te::da::DataSetType> dst = ds->getDataSetType(dataSetName);
871 
872  std::unique_ptr<te::da::DataSetTypeConverter> converter(new te::da::DataSetTypeConverter(dst.get()));
873 
874  for(std::size_t i = 0; i < propertyIndexes.size(); ++i)
875  {
876  converter->add(propertyIndexes[i], GetProperty(props[i].first, static_cast<int>(props[i].second[0]), static_cast<int>(props[i].second[1]), static_cast<int>(props[i].second[2])), functionsNames[i]);
877  }
878 
879  std::vector<te::dt::Property*> convertedProps = converter->getResult()->getProperties();
880 
881  te::da::PrimaryKey* pkIn = dst->getPrimaryKey();
882  if(pkIn)
883  {
884  te::da::PrimaryKey* pk = new te::da::PrimaryKey(converter->getResult());
885 
886  std::vector<te::dt::Property*> pkProps = pkIn->getProperties();
887  for(std::size_t i = 0; i < convertedProps.size(); ++i)
888  {
889  for(std::size_t t = 0; t < pkProps.size(); ++t)
890  {
891  if(convertedProps[i]->getName() == pkProps[t]->getName())
892  pk->add(convertedProps[i]);
893 
894  }
895  }
896  }
897 
898  result->setConverter(std::move(converter));
899 
901 
902  std::unique_ptr<te::da::DataSet> dataset = result->getData();
903 
905 
906  if(gp)
907  {
908  while(dataset->moveNext())
909  {
910  te::gm::Geometry* geom = dataset->getGeometry(gp->getName()).release();
911  assert(geom);
912  env->Union(*geom->getMBR());
913  }
914  result->setSRID(gp->getSRID());
915  }
916 
917  result->setExtent(*env);
918 
919  return result;
920 }
921 
923 {
924  const te::map::DataSetLayer* layer = dynamic_cast<const te::map::DataSetLayer*>(alayer);
925 
926  if(layer == nullptr)
927  return;
928 
929  writer.writeStartElement("te_map:DataSetLayer");
930 
932 
933  writer.writeElement("te_map:DataSetName", layer->getDataSetName());
934  writer.writeElement("te_map:DataSourceId", layer->getDataSourceId());
936  te::serialize::xml::SaveExtent(layer->getExtent(), writer);
937  writer.writeElement("te_map:RendererId", layer->getRendererType());
938  writer.writeElement("te_map:CompositionMode", static_cast<int>(layer->getCompositionMode()));
939 
940  if(layer->getStyle())
941  {
942  writer.writeStartElement("te_map:Style");
943 
944  te::se::serialize::Style::getInstance().write(layer->getStyle(), writer);
945 
946  writer.writeEndElement("te_map:Style");
947  }
948 
949  if (layer->getSelectionStyle())
950  {
951  writer.writeStartElement("te_map:SelectionStyle");
952 
954 
955  writer.writeEndElement("te_map:SelectionStyle");
956  }
957 
958  writer.writeEndElement("te_map:DataSetLayer");
959 }
960 
962 {
963  const te::map::QueryLayer* layer = dynamic_cast<const te::map::QueryLayer*>(alayer);
964 
965  if(layer == nullptr)
966  return;
967 
968  writer.writeStartElement("te_map:QueryLayer");
969 
971 
972  te::serialize::xml::Save(layer->getQuery(), writer);
973 
974  if (layer->getDataSetName() != "")
975  writer.writeElement("te_map:DataSetName", layer->getDataSetName());
976 
977  writer.writeElement("te_map:DataSourceId", layer->getDataSourceId());
979  te::serialize::xml::SaveExtent(layer->getExtent(), writer);
980  writer.writeElement("te_map:RendererId", layer->getRendererType());
981  writer.writeElement("te_map:CompositionMode", static_cast<int>(layer->getCompositionMode()));
982 
983  if(layer->getStyle())
984  {
985  writer.writeStartElement("te_map:Style");
986 
987  te::se::serialize::Style::getInstance().write(layer->getStyle(), writer);
988 
989  writer.writeEndElement("te_map:Style");
990  }
991 
992  if (layer->getSelectionStyle())
993  {
994  writer.writeStartElement("te_map:SelectionStyle");
995 
997 
998  writer.writeEndElement("te_map:SelectionStyle");
999  }
1000 
1001  writer.writeEndElement("te_map:QueryLayer");
1002 }
1003 
1005 {
1006  const te::map::FolderLayer* folderLayer = static_cast<const te::map::FolderLayer*>(alayer);
1007 
1008  writer.writeStartElement("te_map:FolderLayer");
1009 
1010  writer.writeAttribute("id", folderLayer->getId());
1011  writer.writeElement("te_map:Title", folderLayer->getTitle());
1012  writer.writeElement("te_map:Visible", te::map::serialize::GetVisibility(folderLayer->getVisibility()));
1013 
1014  writer.writeStartElement("te_map:LayerList");
1015 
1016  size_t count = folderLayer->getChildrenCount();
1017 
1018  for(size_t i=0; i<count; i++)
1019  te::map::serialize::Layer::getInstance().write(static_cast<const te::map::AbstractLayer*>(folderLayer->getChild(i).get()), writer);
1020 
1021  writer.writeEndElement("te_map:LayerList");
1022 
1023  writer.writeEndElement("te_map:FolderLayer");
1024 }
1025 
1027 {
1028  const te::map::RasterLayer* layer = dynamic_cast<const te::map::RasterLayer*>(alayer);
1029 
1030  if(layer == nullptr)
1031  return;
1032 
1033  writer.writeStartElement("te_map:RasterLayer");
1034 
1036 
1037  writer.writeStartElement("te_map:ConnectionInfo");
1038  std::map<std::string, std::string> info = layer->getRasterInfo();
1039  std::map<std::string, std::string>::iterator conIt;
1040 
1041  for(conIt=info.begin(); conIt!=info.end(); ++conIt)
1042  {
1043  writer.writeStartElement("te_map:Parameter");
1044 
1045  writer.writeStartElement("te_map:Name");
1046  writer.writeValue(conIt->first);
1047  writer.writeEndElement("te_map:Name");
1048 
1049  writer.writeStartElement("te_map:Value");
1050  writer.writeValue(conIt->second);
1051  writer.writeEndElement("te_map:Value");
1052 
1053  writer.writeEndElement("te_map:Parameter");
1054  }
1055  writer.writeEndElement("te_map:ConnectionInfo");
1056 
1057  te::map::serialize::WriteSRIDValue(layer->getSRID(), writer);
1058  te::serialize::xml::SaveExtent(layer->getExtent(), writer);
1059  writer.writeElement("te_map:RendererId", layer->getRendererType());
1060  writer.writeElement("te_map:CompositionMode", static_cast<int>(layer->getCompositionMode()));
1061 
1062  if(layer->getStyle())
1063  {
1064  writer.writeStartElement("te_map:Style");
1065 
1066  te::se::serialize::Style::getInstance().write(layer->getStyle(), writer);
1067 
1068  writer.writeEndElement("te_map:Style");
1069  }
1070 
1071  writer.writeEndElement("te_map:RasterLayer");
1072 }
1073 
1075 {
1076  const te::map::DataSetAdapterLayer* layer = dynamic_cast<const te::map::DataSetAdapterLayer*>(alayer);
1077 
1078  if(layer == nullptr)
1079  return;
1080 
1081  writer.writeStartElement("te_map:DataSetAdapterLayer");
1082 
1084 
1085  writer.writeElement("te_map:DataSetName", layer->getDataSetName());
1086  writer.writeElement("te_map:DataSourceId", layer->getDataSourceId());
1087  writer.writeElement("te_map:RendererType", layer->getRendererType());
1088  writer.writeElement("te_map:CompositionMode", static_cast<int>(layer->getCompositionMode()));
1089 
1090  if(layer->getStyle())
1091  {
1092  writer.writeStartElement("te_map:Style");
1093 
1094  te::se::serialize::Style::getInstance().write(layer->getStyle(), writer);
1095 
1096  writer.writeEndElement("te_map:Style");
1097  }
1098 
1099  if (layer->getSelectionStyle())
1100  {
1101  writer.writeStartElement("te_map:SelectionStyle");
1102 
1103  te::se::serialize::Style::getInstance().write(layer->getSelectionStyle(), writer);
1104 
1105  writer.writeEndElement("te_map:SelectionStyle");
1106  }
1107 
1108  te::da::DataSetTypeConverter* converter = layer->getConverter();
1109 
1110  writer.writeStartElement("te_map:Converter");
1111 
1112  writer.writeElement("te_map:InDataSetTypeName", converter->getConvertee()->getName());
1113 
1114  te::da::DataSetType* resultDt = converter->getResult();
1115 
1116  std::vector<te::dt::Property*> outProps = resultDt->getProperties();
1117 
1118  for(std::size_t i = 0; i < outProps.size(); ++i)
1119  {
1120  writer.writeStartElement("te_map:OutPropInfo");
1121 
1122  writer.writeElement("te_map:type", outProps[i]->getType());
1123  writer.writeElement("te_map:name", outProps[i]->getName());
1124 
1125  if(outProps[i]->getType() == te::dt::GEOMETRY_TYPE)
1126  {
1127  te::gm::GeometryProperty* geomProp = dynamic_cast<te::gm::GeometryProperty*>(outProps[i]);
1128 
1129  writer.writeElement("te_map:geomType", geomProp->getGeometryType());
1130  te::map::serialize::WriteSRIDValue(geomProp->getSRID(), writer);
1131  }
1132  else
1133  {
1134  writer.writeElement("te_map:geomType", -1);
1136  }
1137 
1138  writer.writeEndElement("te_map:OutPropInfo");
1139 
1140  }
1141 
1142  // PropertyIndexes
1143  std::vector<std::vector<std::size_t> > propertyIndexes = converter->getConvertedPropertyIndexes();
1144 
1145  for(std::size_t i = 0; i < propertyIndexes.size(); ++i)
1146  {
1147  writer.writeStartElement("te_map:PropertyIndex");
1148 
1149  writer.writeAttribute("OutIdx", static_cast<int>(i));
1150 
1151  std::vector<std::size_t> inputPropertiesIdx = propertyIndexes[i];
1152 
1153  for(std::size_t j = 0; j < inputPropertiesIdx.size(); ++j)
1154  writer.writeElement("te_map:InIdx", static_cast<int>(inputPropertiesIdx[j]));
1155 
1156  writer.writeEndElement("te_map:PropertyIndex");
1157  }
1158 
1159  std::vector<te::da::AttributeConverter> converters = converter->getConverters();
1160  for(std::size_t i = 0; i < converters.size(); ++i)
1161  {
1162  std::string convName = layer->getConverter()->getConverterName(i);
1163 
1164  writer.writeElement("te_map:FunctionName", convName);
1165  }
1166 
1167  writer.writeEndElement("te_map:Converter");
1168 
1169  writer.writeEndElement("te_map:DataSetAdapterLayer");
1170 }
TEDATAACCESSEXPORT DataSourcePtr GetDataSource(const std::string &datasourceId, const bool opened=true)
Search for a data source with the informed id in the DataSourceManager.
TEMAPEXPORT std::string ReadLayerVisibility(te::xml::Reader &reader)
TEMAPEXPORT void WriteAbstractLayer(const te::map::AbstractLayer *layer, te::xml::AbstractWriter &writer)
virtual const std::string & getId() const
It returns the layer id.
TEMAPEXPORT te::map::RasterContrast * ReadLayerRasterContrast(te::xml::Reader &reader)
Geometric property.
TEMAPEXPORT std::string ReadLayerEncoding(te::xml::Reader &reader)
virtual void setDataSourceId(const std::string &id)
void add(te::dt::Property *p)
It adds a property to the list of properties of the primary key.
Definition: PrimaryKey.h:123
virtual boost::int32_t getElementValueAsInt32() const
It returns the element data value in the case of VALUE node.
Definition: xml/Reader.cpp:32
const std::vector< std::vector< std::size_t > > & getConvertedPropertyIndexes() const
const TreeItemPtr & getChild(std::size_t i) const
It returns the n-th child.
void DataSetAdapterLayerWriter(const te::map::AbstractLayer *layer, te::xml::AbstractWriter &writer)
std::size_t getChildrenCount() const
It returns the number of children of this node.
An atomic property like an integer or double.
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).
boost::shared_ptr< DataSource > DataSourcePtr
TEMAPEXPORT std::string ReadDataSourceId(te::xml::Reader &reader)
virtual const std::string & getTitle() const
It returns the layer title.
void setConverter(std::unique_ptr< te::da::DataSetTypeConverter > converter)
It sets the converter that will be used by the layer.
virtual const std::string & getType() const =0
It returns the layer type.
virtual void writeStartElement(const std::string &qName)=0
virtual te::se::Style * getSelectionStyle() const
It returns the selection Style associated to the layer.
Base exception class for plugin module.
A class that models the description of a dataset.
Definition: DataSetType.h:72
virtual void writeValue(const std::string &value)=0
TEMAPEXPORT std::string ReadLayerTitle(te::xml::Reader &reader)
void setDataSetName(const std::string &name)
Auxiliary classes and functions to read layer information from a XML document.
void setCompositionMode(te::map::CompositionMode mode)
It sets the composition mode.
void QueryLayerWriter(const te::map::AbstractLayer *layer, te::xml::AbstractWriter &writer)
te::map::AbstractLayer * RasterLayerReader(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.
te::da::DataSetTypeConverter * getConverter() const
It returns the DataSetTypeConverter.
A layer resulting from a query.
Definition: QueryLayer.h:50
virtual Visibility getVisibility() const
It returns the layer visibility.
std::map< std::string, std::string > getRasterInfo() const
static te::dt::Date ds(2010, 01, 01)
A layer that can be used as a container for other kind of layers.
Definition: FolderLayer.h:45
std::unique_ptr< te::da::DataSet > getData(te::common::TraverseType travType=te::common::FORWARDONLY, const te::common::AccessPolicy accessPolicy=te::common::RAccess) const
It gets the dataset identified by the layer name.
This class models a XML writer object.
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:242
virtual void setTitle(const std::string &title)
It sets the layer title.
std::string getConverterName(std::size_t propertyPos)
This method tells which Attribute Converter was used in the porperty position.
TEMAPEXPORT std::string ReadDataSetName(te::xml::Reader &reader)
void Union(const Envelope &rhs)
It updates the envelop with coordinates of another envelope.
te::dt::SimpleProperty * GetProperty(std::string name, int dataType, int geomType, int srid)
TEMAPEXPORT te::map::Grouping * ReadLayerGrouping(te::xml::Reader &reader)
void DataSetLayerWriter(const te::map::AbstractLayer *layer, te::xml::AbstractWriter &writer)
DataSetType * getConvertee()
This method returns the pointer to the DataSetType that is handled by the converter.
const std::vector< te::dt::Property * > & getProperties() const
It returns the properties that take part of the primary key.
Definition: PrimaryKey.h:109
TEMAPEXPORT int ReadSRIDValue(te::xml::Reader &reader)
An converter for DataSetType.
te::map::CompositionMode getCompositionMode() const
It returns the composition mode.
TEMAPEXPORT void WriteSRIDValue(const int &srid, te::xml::AbstractWriter &writer)
const std::vector< AttributeConverter > & getConverters() const
const std::string & getRendererType() const
This class contains the parameters needed for grouping the values of a Property.
Definition: Grouping.h:57
The type for arbitrary precison numbers, like numeric(p, q).
A layer with reference to a DataSetTypeConverter.
std::pair< LayerReadFnctType, LayerWriteFnctType > LayerFnctSerializeType
virtual void writeElement(const std::string &qName, const std::string &value)=0
A layer with reference to a raster.
Definition: RasterLayer.h:52
static std::string getEncodingName(EncodingType et)
Retrive a string from a given character encoding type enum.
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::vector< Property * > & getProperties() const
It returns the list of properties describing the CompositeProperty.
te::map::AbstractLayer * read(te::xml::Reader &reader) const
int getSRID() const
It returns the spatial reference system identifier associated to this property.
static Style & getInstance()
It returns a reference to the singleton instance.
const Envelope * getMBR() const _NOEXCEPT_OP(true)
It returns the minimum bounding rectangle for the geometry in an internal representation.
TEGEOMEXPORT std::unique_ptr< te::gm::Envelope > ReadExtent(te::xml::Reader &reader)
An Envelope defines a 2D rectangular region.
virtual te::se::Style * getStyle() const
It returns the Style associated to the layer.
GeomType getGeometryType() const
It returns the geometry subtype allowed for the property.
TEDATAACCESSEXPORT void Save(const std::string &fileName)
virtual void setVisibility(Visibility v)
It sets the layer visibility.
te::map::AbstractLayer * DataSetLayerReader(te::xml::Reader &reader)
void RasterLayerWriter(const te::map::AbstractLayer *layer, te::xml::AbstractWriter &writer)
TEGEOMEXPORT void SaveExtent(const te::gm::Envelope &e, te::xml::AbstractWriter &writer)
void setRendererType(const std::string &t)
virtual void setExtent(const te::gm::Envelope &mbr)
It sets the Layer extent (or minimum bounding box).
te::da::Select * getQuery() const
Definition: QueryLayer.cpp:363
The type for string types: FIXED_STRING, VAR_STRING or STRING.
boost::function< te::map::AbstractLayer *(te::xml::Reader &)> LayerReadFnctType
virtual void setSelectionStyle(te::se::Style *style)
It sets the selection Style associated to the layer.
Utility functions for the data access module.
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
A Select models a query to be used when retrieving data from a DataSource.
Definition: Select.h:65
TEMAPEXPORT te::map::Visibility GetVisibility(const std::string &visible)
TEMAPEXPORT std::unique_ptr< te::map::Chart > ReadLayerChart(te::xml::Reader &reader)
virtual void writeAttribute(const std::string &attName, const std::string &value)=0
const std::string & getDataSetName() const
TEDATAACCESSEXPORT te::da::Select * ReadSelect(te::xml::Reader &reader)
static te::core::EncodingType getEncodingType(const std::string &name)
Retrive an EncodingType from a given character encoding name.
virtual void setSRID(int srid)
It sets the Spatial Reference System ID associated to the Layer.
It describes a primary key (pk) constraint.
Definition: PrimaryKey.h:52
void write(const te::map::AbstractLayer *alayer, te::xml::AbstractWriter &writer) const
The type for date and time types: date, date period, date duration, time duration, time instant, time period, time instant with time zone or time period with time zone.
virtual void setStyle(te::se::Style *style)
It sets the Style associated to the layer.
const std::string & getRendererType() const
Definition: QueryLayer.cpp:397
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.
A layer with reference to a dataset.
Definition: DataSetLayer.h:47
void reg(const std::string &layerType, const LayerFnctSerializeType &fncts)
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
te::map::AbstractLayer * DataSetAdapterLayerReader(te::xml::Reader &reader)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
virtual bool next()=0
It gets the next event to be read.
const std::string & getRendererType() const
virtual const std::string & getDataSourceId() const
boost::function< void(const te::map::AbstractLayer *, te::xml::AbstractWriter &)> LayerWriteFnctType
void FolderLayerWriter(const te::map::AbstractLayer *layer, te::xml::AbstractWriter &writer)
te::map::AbstractLayer * FolderLayerReader(te::xml::Reader &reader)
const std::string & getRendererType() const
te::map::AbstractLayer * QueryLayerReader(te::xml::Reader &reader)
const std::string & getName() const
It returns the property name.
Definition: Property.h:127