28 #include "../common/progress/TaskProgress.h"
29 #include "../common/Logger.h"
30 #include "../common/Translator.h"
32 #include "../dataaccess/dataset/DataSet.h"
34 #include "../datatype/Property.h"
35 #include "../datatype/SimpleProperty.h"
36 #include "../datatype/StringProperty.h"
38 #include "../dataaccess/dataset/ObjectIdSet.h"
39 #include "../dataaccess/query/DataSetName.h"
40 #include "../dataaccess/query/Expression.h"
41 #include "../dataaccess/query/Field.h"
42 #include "../dataaccess/query/Fields.h"
43 #include "../dataaccess/query/From.h"
44 #include "../dataaccess/query/FromItem.h"
45 #include "../dataaccess/query/PropertyName.h"
46 #include "../dataaccess/query/Select.h"
47 #include "../dataaccess/query/ST_Buffer.h"
48 #include "../dataaccess/query/ST_Difference.h"
49 #include "../dataaccess/query/Where.h"
50 #include "../dataaccess/utils/Utils.h"
52 #include "../geometry/Geometry.h"
53 #include "../geometry/GeometryCollection.h"
54 #include "../geometry/GeometryProperty.h"
55 #include "../geometry/Utils.h"
57 #include "../memory/DataSet.h"
58 #include "../memory/DataSetItem.h"
60 #include "../sam/rtree.h"
74 #include <boost/lexical_cast.hpp>
75 #include <boost/algorithm/string.hpp>
87 if(m_copyInputColumns)
89 std::vector<te::dt::Property*> props = m_inDsetType->getProperties();
90 for(std::size_t i=0; i < props.size(); ++i)
95 fields->push_back(f_props);
107 for(
int i=1; i <= m_levels; ++i)
109 std::stringstream ss;
111 std::string index = ss.str();
138 fields->push_back(f_buffer);
145 fields->push_back(f_buffer);
152 from->push_back(fromItem);
162 std::auto_ptr<te::da::DataSet> dsQuery = m_inDsrc->query(select);
165 std::auto_ptr<te::mem::DataSet> outDSet(
new te::mem::DataSet(outDSType.get()));
169 std::vector<std::vector<te::gm::Geometry*> > vecDissolvedGeom = dissolveQuery(dsQuery.get(), m_levels);
170 prepareDataSet(outDSType.get(), vecDissolvedGeom, outDSet.get(), m_distance);
174 prepareDataSet(outDSType.get(), dsQuery.get(), outDSet.get(), m_distance);
177 return save(outDSet,outDSType);
183 std::map<int, std::vector<te::gm::Geometry*> > mapGeom;
184 std::vector<std::vector<te::gm::Geometry*> > vecGeom;
186 for(
int i = 0; i < levels; ++i)
195 std::vector<te::gm::Geometry*> vec;
201 for(std::size_t t = 0; t < vec.size(); ++t)
205 geom = geom->
Union(vec[t]);
206 rtree.
remove(*(vec[t]->getMBR()), vec[t]);
213 std::vector<te::gm::Geometry*> geomVec;
214 std::auto_ptr<te::gm::Envelope> e = dsQuery->
getExtent(i);
215 rtree.
search(*(e.get()), geomVec);
216 vecGeom.push_back(geomVec);
221 std::size_t vecSize = vecGeom.size();
225 for(std::size_t i = vecSize - 1; i > 0; --i)
227 std::vector<te::gm::Geometry*> currentVec = vecGeom[i];
228 std::size_t c_vecSize = currentVec.size();
230 for(std::size_t j = 0; j < i; ++j)
232 std::vector<te::gm::Geometry*> innerVec = vecGeom[j];
233 std::size_t i_vecSize = innerVec.size();
235 for(std::size_t k = 0; k < c_vecSize; ++k)
237 for(std::size_t l = 0; l < i_vecSize; ++l)
247 delete currentVec[k];
248 currentVec[k] = tGeom;
249 vecGeom[i] = currentVec;
264 const double& distance)
268 int numItems = numProps - firstGeomPos;
276 int numCurrentItem = 0;
278 for(
int i = 0; i < numItems; ++i)
282 for(std::size_t j = 0; j < numProps; ++j)
303 dataSetItem->
setDouble(2, distance*(i+1));
305 std::auto_ptr<te::gm::Geometry> geom = dataSetQuery->
getGeometry(j+numCurrentItem);
313 mPolygon->add(geom.release());
317 outputDataSet->
add(dataSetItem);
325 te::common::Logger::logDebug(
"vp",
"Buffer - Type not found.");
333 std::vector<std::vector<te::gm::Geometry*> > vecDissolvedGeom,
335 const double& distance)
339 for(std::size_t i = 0; i < vecDissolvedGeom.size(); ++i)
341 std::vector<te::gm::Geometry*> vecGeom = vecDissolvedGeom[i];
342 std::size_t sizeVecGeom = vecGeom.size();
344 for(std::size_t j=0; j < sizeVecGeom; ++j)
349 dataSetItem->
setDouble(2, distance*(i+1));
351 std::auto_ptr<te::gm::Geometry> geom(vecGeom[j]);
360 mPolygon->add(geom.release());
364 outputDataSet->
add(dataSetItem);
bool remove(const te::gm::Envelope &mbr, const DATATYPE &data)
It removes an item from the tree.
An exception class for the Vector processing module.
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.
An abstract class that models a source of data in a query.
The Field class can be used to model an expression that takes part of the output items of a SELECT...
virtual boost::int32_t getInt32(std::size_t i) const =0
Method for retrieving a 32-bit integer attribute value (4 bytes long).
void setDouble(std::size_t i, double value)
It sets the value of the i-th property.
A class that models the name of a dataset used in a From clause.
virtual bool intersects(const Geometry *const rhs) const
It returns true if the geometry object spatially intersects rhs geometry.
A class that represents an R-tree.
A class that models the name of any property of an object.
A class that models the description of a dataset.
void prepareDataSet(te::da::DataSetType *dataSetType, te::da::DataSet *dataSetQuery, te::mem::DataSet *outputDataSet, const double &distance)
virtual boost::int64_t getInt64(std::size_t i) const =0
Method for retrieving a 64-bit integer attribute value (8 bytes long).
std::vector< std::vector< te::gm::Geometry * > > dissolveQuery(te::da::DataSet *dsQuery, const int &levels)
virtual double getDouble(std::size_t i) const =0
Method for retrieving a double attribute value.
This is an abstract class that models a query expression.
void add(DataSetItem *item)
It adds a new item to the dataset and takes its ownership.
void setInt32(std::size_t i, boost::int32_t value)
It sets the value of the i-th property.
virtual bool moveNext()=0
It moves the internal pointer to the next item of the collection.
The buffer is generated only outside of the polygons.
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
TEDATAACCESSEXPORT std::size_t GetFirstSpatialPropertyPos(const te::da::DataSet *dataset)
It returns the first dataset spatial property or NULL if none is found.
boost::ptr_vector< Field > Fields
Fields is just a boost::ptr_vector of Field pointers.
Spatial difference operator.
A class that can be used to model a filter expression that can be applied to a query.
virtual bool isValid() const
It tells if the geometry is well formed.
int search(const te::gm::Envelope &mbr, std::vector< DATATYPE > &report) const
Range search query.
virtual std::size_t getNumProperties() const =0
It returns the number of properties that composes an item of the dataset.
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.
virtual std::auto_ptr< te::gm::Geometry > getGeometry(std::size_t i) const =0
Method for retrieving a geometric attribute value.
boost::ptr_vector< FromItem > From
It models the FROM clause for a query.
The buffer is generated Inside and outside of the polygons.
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
A dataset is the unit of information manipulated by the data access module of TerraLib.
void insert(const te::gm::Envelope &mbr, const DATATYPE &data)
It inserts an item into the tree.
virtual std::auto_ptr< te::gm::Envelope > getExtent(std::size_t i)=0
It computes the bounding rectangle for a spatial property of the dataset.
virtual bool moveBeforeFirst()=0
It moves the internal pointer to a position before the first item in the collection.
TEDATAACCESSEXPORT DataSetType * GetDataSetType(const std::string &name, const std::string &datasourceId)
Configuration flags for the Terrralib Vector Processing module.
virtual std::string getString(std::size_t i) const =0
Method for retrieving a string value attribute.
void setString(std::size_t i, const std::string &value)
It sets the value of the i-th property.
virtual Geometry * Union(const Geometry *const rhs) const
It returns a geometric object that represents the point set union with another geometry.
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 te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
virtual int getPropertyDataType(std::size_t i) const =0
It returns the underlying data type of the property at position pos.
const Envelope * getMBR() const
It returns the minimum bounding rectangle for the geometry in an internal representation.
virtual Geometry * difference(const Geometry *const rhs) const
It returns a geometric object that represents the point set difference with another geometry...
The boundaries between buffers will be dissolved.
const std::string & getName() const
It returns the property name.