GeometricOpMemory.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 GeographicOpMemory.h
22 
23  \brief Geographic Vector Processing functions.
24 */
25 
26 //Terralib
27 #include "../BuildConfig.h"
28 
29 #include "../common/progress/TaskProgress.h"
30 #include "../common/Logger.h"
31 #include "../common/Translator.h"
32 
33 #include "../dataaccess/dataset/DataSet.h"
34 #include "../dataaccess/dataset/DataSetAdapter.h"
35 #include "../dataaccess/utils/Utils.h"
36 #include "../datatype/Property.h"
37 #include "../datatype/SimpleProperty.h"
38 #include "../datatype/StringProperty.h"
39 
40 #include "../geometry/Geometry.h"
41 #include "../geometry/GeometryProperty.h"
42 #include "../geometry/GeometryCollection.h"
43 #include "../geometry/LineString.h"
44 #include "../geometry/MultiLineString.h"
45 #include "../geometry/MultiPolygon.h"
46 #include "../geometry/Point.h"
47 #include "../geometry/Polygon.h"
48 #include "../geometry/Utils.h"
49 
50 #include "../memory/DataSet.h"
51 #include "../memory/DataSetItem.h"
52 
53 #include "GeometricOpMemory.h"
54 #include "Config.h"
55 #include "Exception.h"
56 #include "Utils.h"
57 
58 // STL
59 #include <map>
60 #include <math.h>
61 #include <string>
62 #include <vector>
63 
64 // BOOST
65 #include <boost/lexical_cast.hpp>
66 #include <boost/algorithm/string.hpp>
67 
69 {}
70 
72 {}
73 
74 
75 bool te::vp::GeometricOpMemory::run() throw(te::common::Exception)
76 {
77 // get the geometric operation and/or tabular operation.
78  std::vector<int> opGeom;
79  std::vector<int> opTab;
80  std::vector<te::da::DataSetType*> dsTypeVec;
81 
82  for(std::size_t i = 0; i < m_operations.size(); ++i)
83  {
84  switch (m_operations[i])
85  {
86  case te::vp::CENTROID:
87  opGeom.push_back(te::vp::CENTROID);
88  break;
90  opGeom.push_back(te::vp::CONVEX_HULL);
91  break;
92  case te::vp::MBR:
93  opGeom.push_back(te::vp::MBR);
94  break;
95  case te::vp::AREA:
96  opTab.push_back(te::vp::AREA);
97  break;
98  case te::vp::LINE:
99  opTab.push_back(te::vp::LINE);
100  break;
101  case te::vp::PERIMETER:
102  opTab.push_back(te::vp::PERIMETER);
103  break;
104  default:
105  {
106 #ifdef TERRALIB_LOGGER_ENABLED
107  te::common::Logger::logDebug("vp", "Geometric Operation - The operation is not valid.");
108 #endif //TERRALIB_LOGGER_ENABLED
109  }
110  }
111  }
112 
113  if(m_outputLayer)
114  {
115  bool hasMultiGeomColumns = false;
116  bool result = false;
117 
118  switch(m_objStrategy)
119  {
120  case te::vp::ALL_OBJ:
121  {
122  if(hasMultiGeomColumns) //Condição se o DataSource suporta mais de uma coluna geometrica...
123  {
124  dsTypeVec.push_back(te::vp::GeometricOp::GetDataSetType(te::vp::ALL_OBJ, true));
125  }
126  else
127  {
128  if(opGeom.size() > 0)
129  {
130  for(std::size_t i = 0; i < opGeom.size(); ++i)
131  dsTypeVec.push_back(te::vp::GeometricOp::GetDataSetType(te::vp::ALL_OBJ, false, opGeom[i]));
132  }
133  else
134  {
135  dsTypeVec.push_back(te::vp::GeometricOp::GetDataSetType(te::vp::ALL_OBJ, false));
136  }
137  }
138 
139  for(std::size_t dsTypePos = 0; dsTypePos < dsTypeVec.size(); ++dsTypePos)
140  {
141  m_outDsetNameVec.push_back(dsTypeVec[dsTypePos]->getName());
142 
143  std::auto_ptr<te::da::DataSetType> outDataSetType(dsTypeVec[dsTypePos]);
144  std::auto_ptr<te::mem::DataSet> outDataSet(SetAllObjects(dsTypeVec[dsTypePos], opTab, opGeom));
145 
146  try
147  {
148  te::vp::Save(m_outDsrc.get(), outDataSet.get(), outDataSetType.get());
149  result = true;
150  }
151  catch(...)
152  {
153  result = false;
154  }
155 
156  if(!result)
157  return result;
158  }
159 
160  }
161  break;
162  case te::vp::AGGREG_OBJ:
163  {
164  if(hasMultiGeomColumns) //Condição se o DataSource suporta mais de uma coluna geometrica...
165  {
166  dsTypeVec.push_back(te::vp::GeometricOp::GetDataSetType(te::vp::AGGREG_OBJ, true));
167  }
168  else
169  {
170  if(opGeom.size() > 0)
171  {
172  for(std::size_t i = 0; i < opGeom.size(); ++i)
173  dsTypeVec.push_back(te::vp::GeometricOp::GetDataSetType(te::vp::AGGREG_OBJ, false, opGeom[i]));
174  }
175  else
176  {
177  dsTypeVec.push_back(te::vp::GeometricOp::GetDataSetType(te::vp::AGGREG_OBJ, false));
178  }
179  }
180 
181  for(std::size_t dsTypePos = 0; dsTypePos < dsTypeVec.size(); ++dsTypePos)
182  {
183  m_outDsetNameVec.push_back(dsTypeVec[dsTypePos]->getName());
184 
185  std::auto_ptr<te::da::DataSetType> outDataSetType(dsTypeVec[dsTypePos]);
186  std::auto_ptr<te::mem::DataSet> outDataSet(SetAggregObj(dsTypeVec[dsTypePos], opTab, opGeom));
187 
188  te::vp::Save(m_outDsrc.get(), outDataSet.get(), outDataSetType.get());
189  result = true;
190 
191  if(!result)
192  return result;
193  }
194 
195  }
196  break;
198  {
199  if(hasMultiGeomColumns) //Condição se o DataSource suporta mais de uma coluna geometrica...
200  {
202  }
203  else
204  {
205  if(opGeom.size() > 0)
206  {
207  for(std::size_t i = 0; i < opGeom.size(); ++i)
208  dsTypeVec.push_back(te::vp::GeometricOp::GetDataSetType(te::vp::AGGREG_BY_ATTRIBUTE, false, opGeom[i]));
209  }
210  else
211  {
213  }
214  }
215 
216  for(std::size_t dsTypePos = 0; dsTypePos < dsTypeVec.size(); ++dsTypePos)
217  {
218  m_outDsetNameVec.push_back(dsTypeVec[dsTypePos]->getName());
219 
220  std::auto_ptr<te::da::DataSetType> outDataSetType(dsTypeVec[dsTypePos]);
221  std::auto_ptr<te::mem::DataSet> outDataSet(SetAggregByAttribute(dsTypeVec[dsTypePos], opTab, opGeom));
222  try
223  {
224  te::vp::Save(m_outDsrc.get(), outDataSet.get(), outDataSetType.get());
225  result = true;
226  }
227  catch(...)
228  {
229  result = false;
230  }
231 
232  if(!result)
233  return result;
234  }
235  }
236  break;
237  default:
238  {
239 #ifdef TERRALIB_LOGGER_ENABLED
240  te::common::Logger::logDebug("vp", "Geometric Operation - Strategy Not found!");
241 #endif //TERRALIB_LOGGER_ENABLED
242  }
243  return false;
244  }
245 
246  return result;
247  }
248  else
249  {
250  //Descobrir se o DataSource suporta adição de mais de uma coluna geometrica.
251  return false;
252  }
253 }
254 
255 
257  std::vector<int> tabVec,
258  std::vector<int> geoVec)
259 {
260  std::auto_ptr<te::mem::DataSet> outDSet(new te::mem::DataSet(dsType));
261 
262  int pk = 0;
263 
264  std::auto_ptr<te::da::DataSet> inDsetSrc = m_inDsrc->getDataSet(m_inDsetName);
265  std::auto_ptr<te::da::DataSetAdapter> inDset(te::da::CreateAdapter(inDsetSrc.get(), m_converter.get()));
266 
267  inDset->moveBeforeFirst();
268 
269  std::size_t geom_pos = te::da::GetFirstSpatialPropertyPos(inDset.get());
270 
271  while(inDset->moveNext())
272  {
273  te::mem::DataSetItem* item = new te::mem::DataSetItem(outDSet.get());
274 
275  item->setInt32(0, pk);
276  bool geom = true;
277 
278  if(m_selectedProps.size() > 0)
279  {
280  for(std::size_t prop_pos = 0; prop_pos < m_selectedProps.size(); ++prop_pos)
281  {
282  item->setValue(m_selectedProps[prop_pos], inDset->getValue(m_selectedProps[prop_pos]).release());
283  }
284  }
285 
286  std::auto_ptr<te::gm::Geometry> in_geom = inDset->getGeometry(geom_pos);
287 
288  if(tabVec.size() > 0)
289  {
290  for(std::size_t tabPos = 0; tabPos < tabVec.size(); ++tabPos)
291  {
292  switch(tabVec[tabPos])
293  {
294  case te::vp::AREA:
295  {
296  double area = 0;
297  area = CalculateTabularOp(tabVec[tabPos], in_geom.get());
298  item->setDouble("area", area);
299  }
300  break;
301  case te::vp::LINE:
302  {
303  double line = 0;
304  line = CalculateTabularOp(tabVec[tabPos], in_geom.get());
305  item->setDouble("line_length", line);
306  }
307  break;
308  case te::vp::PERIMETER:
309  {
310  double perimeter = 0;
311  perimeter = CalculateTabularOp(tabVec[tabPos], in_geom.get());
312  item->setDouble("perimeter", perimeter);
313  }
314  break;
315  default:
316  {
317 #ifdef TERRALIB_LOGGER_ENABLED
318  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the tabular value.");
319 #endif //TERRALIB_LOGGER_ENABLED
320  }
321  }
322  }
323  }
324 
325  if(geoVec.size() > 0)
326  {
327  for(std::size_t geoPos = 0; geoPos < geoVec.size(); ++geoPos)
328  {
329  switch(geoVec[geoPos])
330  {
331  case te::vp::CONVEX_HULL:
332  {
333  std::size_t pos = te::da::GetPropertyPos(dsType, "convex_hull");
334  if(pos < dsType->size())
335  {
336  std::auto_ptr<te::gm::Geometry> convexHull(in_geom->convexHull());
337  convexHull->setSRID(in_geom->getSRID());
338 
339  if(convexHull->getGeomTypeId() == te::gm::PolygonType)
340  {
341  item->setGeometry("convex_hull", convexHull.release());
342  geom = true;
343  }
344  else
345  geom = false;
346  }
347  }
348  break;
349  case te::vp::CENTROID:
350  {
351  std::size_t pos = te::da::GetPropertyPos(dsType, "centroid");
352  if(pos < dsType->size())
353  {
354  const te::gm::Envelope* env = in_geom->getMBR();
355  te::gm::Coord2D center = env->getCenter();
356  te::gm::Point* point = new te::gm::Point(center.x, center.y, in_geom->getSRID());
357  item->setGeometry("centroid", point);
358  }
359  }
360  break;
361  case te::vp::MBR:
362  {
363  std::size_t pos = te::da::GetPropertyPos(dsType, "mbr");
364  if(pos < dsType->size())
365  {
366  std::auto_ptr<te::gm::Geometry> mbr(in_geom->getEnvelope());
367  mbr->setSRID(in_geom->getSRID());
368  if(mbr->getGeomTypeId() == te::gm::PolygonType)
369  item->setGeometry("mbr", mbr.release());
370  else
371  geom = false;
372  }
373  }
374  break;
375  default:
376  {
377  #ifdef TERRALIB_LOGGER_ENABLED
378  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the geometric value.");
379  #endif //TERRALIB_LOGGER_ENABLED
380  }
381  }
382  }
383  }
384  else
385  {
386  std::auto_ptr<te::gm::Geometry> g(in_geom.release());
388 
389  switch(g->getGeomTypeId())
390  {
391  case te::gm::PointType:
392  {
393  if(g->isValid())
394  teGeomColl->add(g.release());
395  }
396  break;
398  {
399  if(g->isValid())
400  teGeomColl->add(g.release());
401  }
402  break;
403  case te::gm::PolygonType:
404  {
405  if(g->isValid())
406  teGeomColl->add(g.release());
407  }
408  break;
409  default:
410  {
411 #ifdef TERRALIB_LOGGER_ENABLED
412  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the geometry in collection.");
413 #endif //TERRALIB_LOGGER_ENABLED
414  }
415  }
416  if(teGeomColl->getNumGeometries() != 0)
417  item->setGeometry("geom", teGeomColl);
418  else
419  item->setGeometry("geom", g.release());
420  }
421 
422  if(geom)
423  {
424  outDSet->add(item);
425  ++pk;
426  }
427  }
428 
429  return outDSet.release();
430 }
431 
432 
434  std::vector<int> tabVec,
435  std::vector<int> geoVec)
436 {
437  std::auto_ptr<te::mem::DataSet> outDSet(new te::mem::DataSet(dsType));
438 
439  int pk = 0;
440 
441  std::auto_ptr<te::da::DataSet> inDsetSrc = m_inDsrc->getDataSet(m_inDsetName);
442  std::auto_ptr<te::da::DataSetAdapter> inDset(te::da::CreateAdapter(inDsetSrc.get(), m_converter.get()));
443 
444  std::size_t geom_pos = te::da::GetFirstSpatialPropertyPos(inDset.get());
445  // move first to take a seed geom.
446  inDset->moveFirst();
447  te::mem::DataSetItem* item = new te::mem::DataSetItem(outDSet.get());
448 
449  item->setInt32(0, pk);
450 
451  std::auto_ptr<te::gm::Geometry> seedGeom = inDset->getGeometry(geom_pos);
452  int srid = seedGeom->getSRID();
454 
455  if(inDset->size() > 1)
456  {
457  while(inDset->moveNext())
458  {
459  std::auto_ptr<te::gm::Geometry> c_geom = inDset->getGeometry(geom_pos);
460  if(c_geom->isValid())
461  teGeomColl->add(c_geom.release());
462  }
463  }
464 
465  if(teGeomColl->getNumGeometries() > 1)
466  {
467  seedGeom.reset(seedGeom->Union(teGeomColl));
468  seedGeom->setSRID(srid);
469  }
470 
471  if(tabVec.size() > 0)
472  {
473  for(std::size_t tabPos = 0; tabPos < tabVec.size(); ++tabPos)
474  {
475  switch(tabVec[tabPos])
476  {
477  case te::vp::AREA:
478  {
479  double area = 0;
480  area = CalculateTabularOp(tabVec[tabPos], seedGeom.get());
481  item->setDouble("area", area);
482  }
483  break;
484  case te::vp::LINE:
485  {
486  double line = 0;
487  line = CalculateTabularOp(tabVec[tabPos], seedGeom.get());
488  item->setDouble("line_length", line);
489  }
490  break;
491  case te::vp::PERIMETER:
492  {
493  double perimeter = 0;
494  perimeter = CalculateTabularOp(tabVec[tabPos], seedGeom.get());
495  item->setDouble("perimeter", perimeter);
496  }
497  break;
498  default:
499  {
500 #ifdef TERRALIB_LOGGER_ENABLED
501  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the tabular value.");
502 #endif //TERRALIB_LOGGER_ENABLED
503  }
504  }
505  }
506  }
507 
508  if(geoVec.size() > 0)
509  {
510  for(std::size_t geoPos = 0; geoPos < geoVec.size(); ++geoPos)
511  {
512  switch(geoVec[geoPos])
513  {
514  case te::vp::CONVEX_HULL:
515  {
516  std::size_t pos = te::da::GetPropertyPos(dsType, "convex_hull");
517  if(pos < dsType->size())
518  {
519  std::auto_ptr<te::gm::Geometry> convexHull(seedGeom->convexHull());
520  convexHull->setSRID(seedGeom->getSRID());
521  item->setGeometry("convex_hull", convexHull.release());
522  }
523  }
524  break;
525  case te::vp::CENTROID:
526  {
527  std::size_t pos = te::da::GetPropertyPos(dsType, "centroid");
528  if(pos < dsType->size())
529  {
530  const te::gm::Envelope* env = seedGeom->getMBR();
531  te::gm::Coord2D center = env->getCenter();
532  te::gm::Point* point = new te::gm::Point(center.x, center.y, seedGeom->getSRID());
533  item->setGeometry("centroid", point);
534  }
535  }
536  break;
537  case te::vp::MBR:
538  {
539  std::size_t pos = te::da::GetPropertyPos(dsType, "mbr");
540  if(pos < dsType->size())
541  {
542  std::auto_ptr<te::gm::Geometry> mbr(seedGeom->getEnvelope());
543  mbr->setSRID(seedGeom->getSRID());
544  item->setGeometry("mbr", mbr.release());
545  }
546  }
547  break;
548  default:
549  {
550 #ifdef TERRALIB_LOGGER_ENABLED
551  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the geometry in collection.");
552 #endif //TERRALIB_LOGGER_ENABLED
553  }
554  }
555  }
556  }
557  else
558  {
559  std::auto_ptr<te::gm::Geometry> g(seedGeom.release());
561 
562  switch(g->getGeomTypeId())
563  {
564  case te::gm::PointType:
565  {
566  if(g->isValid())
567  teGeomColl->add(g.release());
568  }
569  break;
571  {
572  if(g->isValid())
573  teGeomColl->add(g.release());
574  }
575  break;
576  case te::gm::PolygonType:
577  {
578  if(g->isValid())
579  teGeomColl->add(g.release());
580  }
581  break;
582  default:
583  {
584 #ifdef TERRALIB_LOGGER_ENABLED
585  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the geometry in collection.");
586 #endif //TERRALIB_LOGGER_ENABLED
587  }
588  }
589  if(teGeomColl->getNumGeometries() != 0)
590  item->setGeometry("geom", teGeomColl);
591  else
592  item->setGeometry("geom", g.release());
593  }
594 
595  outDSet->add(item);
596 
597  return outDSet.release();
598 }
599 
601  std::vector<int> tabVec,
602  std::vector<int> geoVec)
603 {
604  std::map<std::string, te::gm::Geometry*> geometries;
605 
606  std::auto_ptr<te::da::DataSet> inDsetSrc = m_inDsrc->getDataSet(m_inDsetName);
607  std::auto_ptr<te::da::DataSetAdapter> inDset(te::da::CreateAdapter(inDsetSrc.get(), m_converter.get()));
608 
609  te::gm::GeometryProperty* propGeom = static_cast<te::gm::GeometryProperty*>(m_converter->getResult()->findFirstPropertyOfType(te::dt::GEOMETRY_TYPE));
610  std::size_t geom_pos = te::da::GetFirstSpatialPropertyPos(inDset.get());
611 
612  // move first to take a seed geom.
613  inDset->moveFirst();
614  std::auto_ptr<te::gm::Geometry> seedGeom = inDset->getGeometry(geom_pos);
615 
616  if(inDset->size() > 1)
617  {
618  std::map<std::string, std::vector<te::mem::DataSetItem*> > groups;
619  std::map<std::string, std::vector<te::mem::DataSetItem*> >::iterator itg;
620  size_t nprops = inDset->getNumProperties();
621 
622  // move first to take a seed geom.
623  inDset->moveBeforeFirst();
624  while(inDset->moveNext())
625  {
626  std::string key = inDset->getAsString(m_attribute);
627  te::mem::DataSetItem* item = new te::mem::DataSetItem(inDset.get());
628  for(std::size_t j=0; j<nprops; ++j)
629  {
630  if (!inDset->isNull(j))
631  {
632  std::auto_ptr<te::dt::AbstractData> val = inDset->getValue(j);
633  item->setValue(j,val.release());
634  }
635  }
636 
637  itg = groups.find(key);
638  if (itg==groups.end())
639  {
640  std::vector<te::mem::DataSetItem*> dataSetItemVector;
641  dataSetItemVector.push_back(item);
642  groups.insert(std::pair<std::string, std::vector<te::mem::DataSetItem*> >(key,dataSetItemVector));
643  }
644  else
645  itg->second.push_back(item);
646  }
647 
648  itg = groups.begin();
649  while(itg != groups.end())
650  {
651  // calculate the spatial aggregation
652  te::gm::Geometry* geometry = te::vp::GetGeometryUnion(itg->second, geom_pos, propGeom->getGeometryType());
653 
654  if(geometry->isValid())
655  geometries.insert(std::pair<std::string, te::gm::Geometry*>(itg->first,geometry));
656 
657  ++itg;
658  }
659 
660  }
661  else
662  {
663  geometries.insert(std::pair<std::string, te::gm::Geometry*>(inDset->getAsString(m_attribute), seedGeom.release()));
664  }
665 
666 // insert result in dataset.
667  std::auto_ptr<te::mem::DataSet> outDSet(new te::mem::DataSet(dsType));
668  std::map<std::string, te::gm::Geometry*>::iterator itGeom;
669  int i = 0;
670 
671  itGeom = geometries.begin();
672  while(itGeom != geometries.end())
673  {
674  te::mem::DataSetItem* outItem = new te::mem::DataSetItem(outDSet.get());
675 
676  // inserting the id in dataSet.
677  outItem->setInt32(0, i);
678  // inserting aggregated attribute.
679  te::dt::Property* prop = m_converter->getResult()->getProperty(m_attribute);
680  switch(prop->getType())
681  {
682  case te::dt::STRING_TYPE:
683  outItem->setString(1, itGeom->first);
684  break;
685  case te::dt::INT16_TYPE:
686  outItem->setInt16(1, boost::lexical_cast<int16_t>(itGeom->first));
687  break;
688  case te::dt::INT32_TYPE:
689  outItem->setInt32(1, boost::lexical_cast<int>(itGeom->first));
690  break;
691  case te::dt::INT64_TYPE:
692  outItem->setInt64(1, boost::lexical_cast<int>(itGeom->first));
693  break;
694  case te::dt::DOUBLE_TYPE:
695  outItem->setDouble(1, boost::lexical_cast<double>(itGeom->first));
696  break;
697  default:
698 #ifdef TERRALIB_LOGGER_ENABLED
699  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the aggregated value.");
700 #endif //TERRALIB_LOGGER_ENABLED
701  break;
702  }
703 
704  // inserting geometries.
705  if(tabVec.size() > 0)
706  {
707  for(std::size_t tabPos = 0; tabPos < tabVec.size(); ++tabPos)
708  {
709  switch(tabVec[tabPos])
710  {
711  case te::vp::AREA:
712  {
713  double area = 0;
714  area = CalculateTabularOp(tabVec[tabPos], itGeom->second);
715  outItem->setDouble("area", area);
716  }
717  break;
718  case te::vp::LINE:
719  {
720  double line = 0;
721  line = CalculateTabularOp(tabVec[tabPos], itGeom->second);
722  outItem->setDouble("line_length", line);
723  }
724  break;
725  case te::vp::PERIMETER:
726  {
727  double perimeter = 0;
728  perimeter = CalculateTabularOp(tabVec[tabPos], itGeom->second);
729  outItem->setDouble("perimeter", perimeter);
730  }
731  break;
732  default:
733  {
734 #ifdef TERRALIB_LOGGER_ENABLED
735  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the tabular value.");
736 #endif //TERRALIB_LOGGER_ENABLED
737  }
738  }
739  }
740  }
741 
742  if(geoVec.size() > 0)
743  {
744  for(std::size_t geoPos = 0; geoPos < geoVec.size(); ++geoPos)
745  {
746  switch(geoVec[geoPos])
747  {
748  case te::vp::CONVEX_HULL:
749  {
750  std::size_t pos = te::da::GetPropertyPos(dsType, "convex_hull");
751  if(pos < dsType->size())
752  {
753  std::auto_ptr<te::gm::Geometry> convexHull(itGeom->second->convexHull());
754  convexHull->setSRID(seedGeom->getSRID());
755  outItem->setGeometry("convex_hull", convexHull.release());
756  }
757  }
758  break;
759  case te::vp::CENTROID:
760  {
761  std::size_t pos = te::da::GetPropertyPos(dsType, "centroid");
762  if(pos < dsType->size())
763  {
764  const te::gm::Envelope* env = itGeom->second->getMBR();
765  te::gm::Coord2D center = env->getCenter();
766  te::gm::Point* point = new te::gm::Point(center.x, center.y, itGeom->second->getSRID());
767  outItem->setGeometry("centroid", point);
768  }
769  }
770  break;
771  case te::vp::MBR:
772  {
773  std::size_t pos = te::da::GetPropertyPos(dsType, "mbr");
774  if(pos < dsType->size())
775  {
776  std::auto_ptr<te::gm::Geometry> mbr(itGeom->second->getEnvelope());
777  mbr->setSRID(seedGeom->getSRID());
778  outItem->setGeometry("mbr", mbr.release());
779  }
780  }
781  break;
782  default:
783  {
784 #ifdef TERRALIB_LOGGER_ENABLED
785  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the geometric value.");
786 #endif //TERRALIB_LOGGER_ENABLED
787  }
788  }
789  }
790  }
791  else
792  {
793  te::gm::GeometryCollection* teGeomColl = new te::gm::GeometryCollection(0, te::gm::GeometryCollectionType, itGeom->second->getSRID());
794 
795  switch(itGeom->second->getGeomTypeId())
796  {
797  case te::gm::PointType:
798  {
799  if(itGeom->second->isValid())
800  teGeomColl->add(itGeom->second);
801  }
802  break;
804  {
805  if(itGeom->second->isValid())
806  teGeomColl->add(itGeom->second);
807  }
808  break;
809  case te::gm::PolygonType:
810  {
811  if(itGeom->second->isValid())
812  teGeomColl->add(itGeom->second);
813  }
814  break;
815  default:
816  {
817 #ifdef TERRALIB_LOGGER_ENABLED
818  te::common::Logger::logDebug("vp", "Geometric Operation - Could not insert the geometry in collection.");
819 #endif //TERRALIB_LOGGER_ENABLED
820  }
821  }
822  if(teGeomColl->getNumGeometries() != 0)
823  outItem->setGeometry("geom", teGeomColl);
824  else
825  outItem->setGeometry("geom", itGeom->second);
826  }
827 
828  outDSet->add(outItem);
829  ++itGeom;
830  ++i;
831  }
832 
833  return outDSet.release();
834 }
835 
836 
838  te::gm::Geometry* geom)
839 {
840  double value = 0;
841  te::gm::GeomType geomType = geom->getGeomTypeId();
842 
843  switch(tabOperation)
844  {
845  case te::vp::AREA:
846  {
847  if(geomType == te::gm::PolygonType)
848  {
849  te::gm::Polygon* pol = dynamic_cast<te::gm::Polygon*>(geom);
850  if(pol)
851  value = pol->getArea();
852  }
853  if(geomType == te::gm::MultiPolygonType)
854  {
855  std::string type = geom->getGeometryType();
856 
857  if(type == "GeometryCollection")
858  {
859  te::gm::GeometryCollection* m_geoColl = dynamic_cast<te::gm::GeometryCollection*>(geom);
860 
861  if(m_geoColl)
862  {
863  std::vector<te::gm::Geometry*> geomVec = m_geoColl->getGeometries();
864  for(std::size_t i = 0; i < geomVec.size(); ++i)
865  {
866  te::gm::GeomType inType = geomVec[i]->getGeomTypeId();
867  if(inType == te::gm::PolygonType)
868  {
869  te::gm::Polygon* m_pol = dynamic_cast<te::gm::Polygon*>(geomVec[i]);
870  if(m_pol)
871  value += m_pol->getArea();
872  }
873  if(inType == te::gm::MultiPolygonType)
874  {
875  te::gm::MultiPolygon* m_pol = dynamic_cast<te::gm::MultiPolygon*>(geomVec[i]);
876  if(m_pol)
877  value += m_pol->getArea();
878  }
879  }
880  }
881  }
882  else
883  {
884  te::gm::MultiPolygon* m_pol = dynamic_cast<te::gm::MultiPolygon*>(geom);
885  if(m_pol)
886  value = m_pol->getArea();
887  }
888  }
889  return value;
890  }
891  break;
892  case te::vp::LINE:
893  {
894  if(geomType == te::gm::LineStringType)
895  {
896  te::gm::LineString* lineString = dynamic_cast<te::gm::LineString*>(geom);
897  if(lineString)
898  value = lineString->getLength();
899  }
900  if(geomType == te::gm::MultiLineStringType)
901  {
902  te::gm::MultiLineString* m_lineString = dynamic_cast<te::gm::MultiLineString*>(geom);
903  if(m_lineString)
904  value = m_lineString->getLength();
905  }
906  return value;
907  }
908  break;
909  case te::vp::PERIMETER:
910  {
911  if(geomType == te::gm::PolygonType)
912  {
913  te::gm::Polygon* pol = dynamic_cast<te::gm::Polygon*>(geom);
914  if(pol)
915  value = pol->getPerimeter();
916  }
917  if(geomType == te::gm::MultiPolygonType)
918  {
919  std::string type = geom->getGeometryType();
920 
921  if(type == "GeometryCollection")
922  {
923  te::gm::GeometryCollection* m_geoColl = dynamic_cast<te::gm::GeometryCollection*>(geom);
924 
925  if(m_geoColl)
926  {
927  std::vector<te::gm::Geometry*> geomVec = m_geoColl->getGeometries();
928  for(std::size_t i = 0; i < geomVec.size(); ++i)
929  {
930  te::gm::GeomType inType = geomVec[i]->getGeomTypeId();
931  if(inType == te::gm::PolygonType)
932  {
933  te::gm::Polygon* m_pol = dynamic_cast<te::gm::Polygon*>(geomVec[i]);
934  if(m_pol)
935  value += m_pol->getPerimeter();
936  }
937  if(inType == te::gm::MultiPolygonType)
938  {
939  te::gm::MultiPolygon* m_pol = dynamic_cast<te::gm::MultiPolygon*>(geomVec[i]);
940  if(m_pol)
941  value += m_pol->getPerimeter();
942  }
943  }
944  }
945  }
946  else
947  {
948  te::gm::MultiPolygon* m_pol = dynamic_cast<te::gm::MultiPolygon*>(geom);
949  if(m_pol)
950  value = m_pol->getPerimeter();
951  }
952  }
953  return value;
954  }
955  break;
956  default:
957  {
958 #ifdef TERRALIB_LOGGER_ENABLED
959  te::common::Logger::logDebug("vp", "Geometric Operation - Could not calculate the operation.");
960 #endif //TERRALIB_LOGGER_ENABLED
961  }
962  }
963 
964  return value;
965 }
std::size_t getNumGeometries() const
It returns the number of geometries in this GeometryCollection.
te::da::DataSetType * GetDataSetType(te::vp::GeometricOpObjStrategy, bool MultiGeomColumns, int geomOp=-1)
Definition: GeometricOp.cpp:96
MultiPolygon is a MultiSurface whose elements are Polygons.
Definition: MultiPolygon.h:50
Geometric property.
An exception class for the Vector processing module.
GeomType
Each enumerated type is compatible with a Well-known Binary (WKB) type code.
Definition: Enums.h:41
void setGeometry(std::size_t i, te::gm::Geometry *value)
It sets the value of the i-th property.
Utility functions for the data access module.
double y
y-coordinate.
Definition: Coord2D.h:114
void setDouble(std::size_t i, double value)
It sets the value of the i-th property.
The geographic operation Line.
Definition: Enums.h:106
double CalculateTabularOp(int tabOperation, te::gm::Geometry *geom)
The geographic operation Minimum Bounding Rectangle.
Definition: Enums.h:104
double x
x-coordinate.
Definition: Coord2D.h:113
A class that models the description of a dataset.
Definition: DataSetType.h:72
virtual double getLength() const
The length of this curve in the unit associated to its spatial reference system.
Definition: Curve.cpp:50
std::auto_ptr< te::dt::AbstractData > getValue(std::size_t i) const
It returns the value of the i-th property.
double getPerimeter() const
It returns the length of the boundary for the surface.
te::gm::Geometry * GetGeometryUnion(const std::vector< te::mem::DataSetItem * > &items, size_t geomIdx, te::gm::GeomType outGeoType)
It returns the union of a geometry vector.
Definition: Utils.cpp:52
void Save(te::da::DataSource *source, te::da::DataSet *result, te::da::DataSetType *outDsType)
Definition: Utils.cpp:172
TEDATAACCESSEXPORT std::size_t GetPropertyPos(const DataSet *dataset, const std::string &name)
Definition: Utils.cpp:500
void setValue(std::size_t i, te::dt::AbstractData *value)
It sets the value of the i-th property.
te::mem::DataSet * SetAggregObj(te::da::DataSetType *dsType, std::vector< int > tabVec, std::vector< int > geoVec)
An utility struct for representing 2D coordinates.
Definition: Coord2D.h:40
void setInt16(std::size_t i, boost::int16_t value)
It sets the value of the i-th property.
double getPerimeter() const
It returns the length of the boundary for the surface.
It models a property definition.
Definition: Property.h:59
void setInt32(std::size_t i, boost::int32_t value)
It sets the value of the i-th property.
Coord2D getCenter() const
It returns the rectangle's center coordinate.
Definition: Envelope.cpp:51
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
Definition: DataSet.h:65
TEDATAACCESSEXPORT std::size_t GetFirstSpatialPropertyPos(const te::da::DataSet *dataset)
It returns the first dataset spatial property or NULL if none is found.
Definition: Utils.cpp:462
The geographic operation Area.
Definition: Enums.h:105
LineString is a curve with linear interpolation between points.
Definition: LineString.h:62
Aggregate all objects.
Definition: Enums.h:118
A point with x and y coordinate values.
Definition: Point.h:50
An Envelope defines a 2D rectangular region.
Definition: Envelope.h:51
te::mem::DataSet * SetAggregByAttribute(te::da::DataSetType *dsType, std::vector< int > tabVec, std::vector< int > geoVec)
te::mem::DataSet * SetAllObjects(te::da::DataSetType *dsType, std::vector< int > tabVec, std::vector< int > geoVec)
URI C++ Library.
GeomType getGeometryType() const
It returns the geometry subtype allowed for the property.
virtual const std::string & getGeometryType() const =0
It returns the name of the geometry subclass.
Aggregate objects by attribute.
Definition: Enums.h:119
The geographic operation Perimeter.
Definition: Enums.h:107
virtual bool isValid() const
It tells if the geometry is well formed.
Definition: Geometry.cpp:168
GeomType getGeomTypeId() const
It returns the geometry subclass type identifier.
Definition: Geometry.h:178
The geographic operation Centroid.
Definition: Enums.h:103
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
Definition: Geometry.h:73
double getArea() const
It returns the area of this surface, as measured in the spatial reference system of this surface...
int getType() const
It returns the property data type.
Definition: Property.h:161
MultiLineString is a MultiCurve whose elements are LineStrings.
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
Definition: DataSetItem.h:56
Polygon is a subclass of CurvePolygon whose rings are defined by linear rings.
Definition: Polygon.h:50
double getArea() const
It returns the area of this MultiSurface, as measured in the spatial reference system of this multisu...
void add(Geometry *g)
It adds the geometry into the collection.
const std::vector< Geometry * > & getGeometries() const
It returns a reference to the internal list of geometries.
The geographic operation Convex Hull.
Definition: Enums.h:102
double getLength() const
It returns the Length of this MultiCurve which is equal to the sum of the lengths of the element Curv...
Definition: MultiCurve.cpp:71
Configuration flags for the Terrralib Vector Processing module.
void setString(std::size_t i, const std::string &value)
It sets the value of the i-th property.
void setInt64(std::size_t i, boost::int64_t value)
It sets the value of the i-th property.
It is a collection of other geometric objects.
TEDATAACCESSEXPORT DataSetAdapter * CreateAdapter(DataSet *ds, DataSetTypeConverter *converter, bool isOwner=false)
Definition: Utils.cpp:644
All objects individually.
Definition: Enums.h:117