All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Utils.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008-2011 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/vp/qt/Utils.cpp
22 
23  \brief Utility functions for Vector Processing.
24 */
25 
26 // TerraLib
27 #include "../dataaccess/datasource/DataSourceInfo.h"
28 #include "../dataaccess/datasource/DataSourceManager.h"
29 #include "../dataaccess/utils/Utils.h"
30 #include "../geometry/Geometry.h"
31 #include "../geometry/GeometryCollection.h"
32 #include "../geometry/GeometryProperty.h"
33 #include "../geometry/MultiPoint.h"
34 #include "../geometry/MultiLineString.h"
35 #include "../geometry/MultiPolygon.h"
36 #include "../geometry/Point.h"
37 #include "../memory/DataSet.h"
38 #include "Utils.h"
39 
40 //STL
41 #include <vector>
42 #include <memory>
43 
44 // Boost
45 #include <boost/algorithm/string.hpp>
46 
47 te::gm::Geometry* te::vp::GetGeometryUnion(const std::vector<te::mem::DataSetItem*>& items, size_t geomIdx, te::gm::GeomType outGeoType)
48 {
49  te::gm::Geometry* resultGeometry(0);
50 
51  std::auto_ptr<te::gm::Geometry> seedGeometry = items[0]->getGeometry(geomIdx);
52 
53  if(items.size() < 2)
54  resultGeometry = seedGeometry.release();
55 
56  if(items.size() == 2)
57  {
58  std::auto_ptr<te::gm::Geometry> teGeom = items[1]->getGeometry(geomIdx);
59 
60  if(teGeom->isValid())
61  resultGeometry = seedGeometry->Union(teGeom.release());
62  else
63  resultGeometry = seedGeometry.release();
64  }
65  if(items.size() > 2)
66  {
67  te::gm::GeometryCollection* teGeomColl = new te::gm::GeometryCollection(0, te::gm::GeometryCollectionType, seedGeometry->getSRID());
68 
69  for(std::size_t i = 1; i < items.size(); ++i)
70  {
71  std::auto_ptr<te::gm::Geometry> currentGeom = items[i]->getGeometry(geomIdx);
72 
73  if(currentGeom->isValid())
74  teGeomColl->add(currentGeom.release());
75  }
76 
77  resultGeometry = seedGeometry->Union(teGeomColl);
78 
79  }
80 
81  if (resultGeometry->getGeomTypeId() != outGeoType)
82  {
83  if(resultGeometry->getGeomTypeId() == te::gm::GeometryCollectionType)
84  {
85  te::gm::GeometryCollection* gc = new te::gm::GeometryCollection(0, outGeoType, resultGeometry->getSRID());
86  std::vector<te::gm::Geometry*> geomVec = ((te::gm::GeometryCollection*)resultGeometry)->getGeometries();
87  for(std::size_t i = 0; i < geomVec.size(); ++i)
88  {
89  te::gm::GeometryCollection* gcIn = dynamic_cast<te::gm::GeometryCollection*>(geomVec[i]);
90  if(gcIn == 0)
91  gc->add(geomVec[i]);
92  else
93  SplitGeometryCollection(gcIn, gc);
94  }
95  return gc;
96  }
97  else
98  {
99  te::gm::GeometryCollection* gc = new te::gm::GeometryCollection(1, outGeoType, resultGeometry->getSRID());
100  gc->setGeometryN(0,resultGeometry);
101  return gc;
102  }
103  }
104  else
105  return resultGeometry;
106 }
107 
108 te::gm::Geometry* te::vp::GetGeometryUnion(const std::vector<te::mem::DataSetItem*>& items, size_t geomIdx)
109 {
110  te::gm::Geometry* resultGeometry(0);
111 
112  std::auto_ptr<te::gm::Geometry> seedGeometry = items[0]->getGeometry(geomIdx);
113 
114  if(items.size() < 2)
115  resultGeometry = seedGeometry.release();
116 
117  if(items.size() == 2)
118  {
119  std::auto_ptr<te::gm::Geometry> teGeom = items[1]->getGeometry(geomIdx);
120 
121  if(teGeom->isValid())
122  resultGeometry = seedGeometry->Union(teGeom.release());
123  else
124  resultGeometry = seedGeometry.release();
125  }
126  if(items.size() > 2)
127  {
128  te::gm::GeometryCollection* teGeomColl = new te::gm::GeometryCollection(0, te::gm::GeometryCollectionType, seedGeometry->getSRID());
129 
130  for(std::size_t i = 1; i < items.size(); ++i)
131  {
132  std::auto_ptr<te::gm::Geometry> currentGeom = items[i]->getGeometry(geomIdx);
133 
134  if(currentGeom->isValid())
135  teGeomColl->add(currentGeom.release());
136  }
137 
138  resultGeometry = seedGeometry->Union(teGeomColl);
139 
140  }
141  return resultGeometry;
142 }
143 
145 {
146  std::vector<te::gm::Geometry*> geomVec = ((te::gm::GeometryCollection*)gcIn)->getGeometries();
147  for(std::size_t i = 0; i < geomVec.size(); ++i)
148  {
149  te::gm::GeometryCollection* gc = dynamic_cast<te::gm::GeometryCollection*>(geomVec[i]);
150  if(gc == 0)
151  gcOut->add(geomVec[i]);
152  else
153  SplitGeometryCollection(gc, gcOut);
154  }
155 }
156 
157 std::string te::vp::GetSimpleTableName(std::string fullName)
158 {
159  std::size_t found = fullName.rfind(".");
160 
161  if(found >= std::string::npos)
162  return fullName;
163 
164  return fullName.substr(found + 1);
165 }
166 
168 {
169  if( (firstGeom == te::gm::PolygonType && secondGeom == te::gm::PolygonType) ||
170  (firstGeom == te::gm::MultiPolygonType && secondGeom == te::gm::MultiPolygonType) ||
171  (firstGeom == te::gm::PolygonType && secondGeom == te::gm::MultiPolygonType) ||
172  (firstGeom == te::gm::MultiPolygonType && secondGeom == te::gm::PolygonType))
174 
175  if((firstGeom == te::gm::PolygonType && secondGeom == te::gm::LineStringType)||
176  (firstGeom == te::gm::PolygonType && secondGeom == te::gm::MultiLineStringType)||
177  (firstGeom == te::gm::MultiPolygonType && secondGeom == te::gm::LineStringType)||
178  (firstGeom == te::gm::MultiPolygonType && secondGeom == te::gm::MultiLineStringType)||
179 
180  (firstGeom == te::gm::LineStringType && secondGeom == te::gm::PolygonType)||
181  (firstGeom == te::gm::LineStringType && secondGeom == te::gm::MultiPolygonType)||
182  (firstGeom == te::gm::MultiLineStringType && secondGeom == te::gm::PolygonType)||
183  (firstGeom == te::gm::MultiLineStringType && secondGeom == te::gm::MultiPolygonType)||
184 
185  (firstGeom == te::gm::LineStringType && secondGeom == te::gm::LineStringType) ||
186  (firstGeom == te::gm::MultiLineStringType && secondGeom == te::gm::MultiLineStringType) ||
187  (firstGeom == te::gm::LineStringType && secondGeom == te::gm::MultiLineStringType) ||
188  (firstGeom == te::gm::MultiLineStringType && secondGeom == te::gm::LineStringType))
190 
191  return te::gm::MultiPointType;
192 }
193 
195 {
196  if (firstGeom == te::gm::PolygonType)
198 
199  if (firstGeom == te::gm::LineStringType)
201 
202  if (firstGeom == te::gm::PointType)
203  return te::gm::MultiPointType;
204 
205  return firstGeom;
206 }
int getSRID() const
It returns the Spatial Reference System ID associated to this geometric object.
Definition: Geometry.h:189
GeomType
Each enumerated type is compatible with a Well-known Binary (WKB) type code.
Definition: Enums.h:41
Utility functions for the data access module.
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:47
void SplitGeometryCollection(te::gm::GeometryCollection *geomIn, te::gm::GeometryCollection *gcOut)
Definition: Utils.cpp:144
GeomType getGeomTypeId() const
It returns the geometry subclass type identifier.
Definition: Geometry.h:178
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
Definition: Geometry.h:73
te::gm::GeomType GeomOpResultType(te::gm::GeomType firstGeom, te::gm::GeomType secondGeom)
Definition: Utils.cpp:167
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.
void setGeometryN(std::size_t i, Geometry *g)
It sets the n-th geometry in this geometry collection.
virtual Geometry * Union(const Geometry *const rhs) const
It returns a geometric object that represents the point set union with another geometry.
Definition: Geometry.cpp:473
It is a collection of other geometric objects.
std::string GetSimpleTableName(std::string fullName)
Definition: Utils.cpp:157