27 #include "../core/logger/Logger.h" 28 #include "../core/translator/Translator.h" 30 #include "../dataaccess/dataset/DataSetAdapter.h" 31 #include "../dataaccess/datasource/DataSourceFactory.h" 32 #include "../dataaccess/utils/Utils.h" 34 #include "../geometry/GeometryProperty.h" 35 #include "../geometry/GeometryCollection.h" 36 #include "../geometry/LineString.h" 37 #include "../geometry/MultiLineString.h" 38 #include "../geometry/MultiPolygon.h" 39 #include "../geometry/Point.h" 40 #include "../geometry/Polygon.h" 41 #include "../geometry/Utils.h" 43 #include "../memory/DataSet.h" 44 #include "../memory/DataSetItem.h" 53 #include <boost/lexical_cast.hpp> 54 #include <boost/algorithm/string.hpp> 63 std::vector<int> opGeom;
64 std::vector<int> opTab;
65 std::vector<te::da::DataSetType*> dsTypeVec;
91 TE_LOG_INFO(
"Vector Processing - Geometric Operation - The operation is not valid.");
96 bool hasMultiGeomColumns =
false;
103 if(hasMultiGeomColumns)
111 if(opGeom.size() > 0)
113 for(std::size_t i = 0; i < opGeom.size(); ++i)
124 for(std::size_t dsTypePos = 0; dsTypePos < dsTypeVec.size();
129 std::unique_ptr<te::da::DataSetType> outDataSetType(
130 dsTypeVec[dsTypePos]);
131 std::unique_ptr<te::mem::DataSet> outDataSet(
136 std::string dsinfo(
"file://");
144 te::vp::Save(dsOGR.get(), outDataSet.get(), outDataSetType.get());
164 if(hasMultiGeomColumns)
172 if(opGeom.size() > 0)
174 for(std::size_t i = 0; i < opGeom.size(); ++i)
185 for(std::size_t dsTypePos = 0; dsTypePos < dsTypeVec.size();
190 std::unique_ptr<te::da::DataSetType> outDataSetType(
191 dsTypeVec[dsTypePos]);
192 std::unique_ptr<te::mem::DataSet> outDataSet(
195 if(outDataSet->size() == 0)
198 TE_LOG_INFO(
"Vector Processing - Geometric Operation - Result layer is empty! Verify input layer consistency.");
204 std::string dsinfo(
"file://");
211 te::vp::Save(dsOGR.get(), outDataSet.get(), outDataSetType.get());
232 if(hasMultiGeomColumns)
240 if(opGeom.size() > 0)
242 for(std::size_t i = 0; i < opGeom.size(); ++i)
253 for(std::size_t dsTypePos = 0; dsTypePos < dsTypeVec.size();
258 std::unique_ptr<te::da::DataSetType> outDataSetType(
259 dsTypeVec[dsTypePos]);
260 std::unique_ptr<te::mem::DataSet> outDataSet(
263 if(outDataSet->size() == 0)
266 TE_LOG_INFO(
"Vector Processing - Geometric Operation - Result layer is empty! Verify input layer consistency.");
272 std::string dsinfo(
"file://");
279 te::vp::Save(dsOGR.get(), outDataSet.get(), outDataSetType.get());
301 TE_LOG_INFO(
"Vector Processing - Geometric Operation - Strategy Not found!");
313 std::vector<int> geoVec)
320 std::unique_ptr<te::da::DataSetType> inDsType =
324 std::unique_ptr<te::da::DataSetAdapter> inDset(
327 inDset->moveBeforeFirst();
331 while(inDset->moveNext())
345 std::size_t inputPropertyPos =
348 if(!inDset->isNull(inputPropertyPos))
356 std::unique_ptr<te::gm::Geometry> in_geom = inDset->getGeometry(geom_pos);
358 if(tabVec.size() > 0)
360 for(std::size_t tabPos = 0; tabPos < tabVec.size(); ++tabPos)
362 switch(tabVec[tabPos])
380 double perimeter = 0;
388 "Vector Processing - Geometric Operation - Could not " 389 "insert the tabular value.");
395 if(geoVec.size() > 0)
397 for(std::size_t geoPos = 0; geoPos < geoVec.size(); ++geoPos)
399 switch(geoVec[geoPos])
404 if(pos < dsType->size())
406 std::unique_ptr<te::gm::Geometry> convexHull(
407 in_geom->convexHull());
408 convexHull->setSRID(geomProp->
getSRID());
415 item->
setGeometry(
"convex_hull", convexHull.release());
428 if(pos < dsType->size())
441 if(pos < dsType->size())
443 std::unique_ptr<te::gm::Geometry> mbr(in_geom->getEnvelope());
444 mbr->setSRID(geomProp->
getSRID());
463 "Vector Processing - Geometric Operation - Could not " 464 "insert the geometric value.");
471 std::unique_ptr<te::gm::Geometry> g(in_geom.release());
472 g->setSRID(geomProp->
getSRID());
476 switch(g->getGeomTypeId())
492 teGeomColl->
add(g.release());
498 "Vector Processing - Geometric Operation - Could not insert " 499 "the geometry in collection.");
521 return outDSet.release();
526 std::vector<int> geoVec)
534 std::unique_ptr<te::da::DataSetAdapter> inDset(
539 inDset->moveBeforeFirst();
544 std::vector<te::gm::Geometry*> geometriesToUnion;
545 std::unique_ptr<te::gm::Geometry> dissolvedGeometry;
547 if(inDset->size() > 1)
549 while(inDset->moveNext())
553 if (inDset->isNull(geom_pos))
556 std::unique_ptr<te::gm::Geometry> c_geom = inDset->getGeometry(geom_pos);
558 if(c_geom->isValid())
559 geometriesToUnion.push_back(c_geom.release());
570 if(geometriesToUnion.empty())
571 return outDSet.release();
575 if(!dissolvedGeometry->isValid())
576 return outDSet.release();
578 if(tabVec.size() > 0)
580 for(std::size_t tabPos = 0; tabPos < tabVec.size(); ++tabPos)
582 switch(tabVec[tabPos])
600 double perimeter = 0;
608 "Vector Processing - Geometric Operation - Could not insert " 609 "the tabular value.");
615 if(geoVec.size() > 0)
617 for(std::size_t geoPos = 0; geoPos < geoVec.size(); ++geoPos)
619 switch(geoVec[geoPos])
624 if(pos < dsType->size())
626 std::unique_ptr<te::gm::Geometry> convexHull(
627 dissolvedGeometry->convexHull());
628 convexHull->setSRID(geomProp->
getSRID());
630 item->
setGeometry(
"convex_hull", convexHull.release());
637 if(pos < dsType->size())
650 if(pos < dsType->size())
652 std::unique_ptr<te::gm::Geometry> mbr(dissolvedGeometry->getEnvelope());
653 mbr->setSRID(geomProp->
getSRID());
661 "Vector Processing - Geometric Operation - Could not insert " 662 "the geometry in collection.");
669 std::unique_ptr<te::gm::Geometry> g(dissolvedGeometry.release());
670 g->setSRID(geomProp->
getSRID());
674 switch(g->getGeomTypeId())
690 teGeomColl->
add(g.release());
696 "Vector Processing - Geometric Operation - Could not insert the " 697 "geometry in collection.");
708 return outDSet.release();
713 std::vector<int> geoVec)
715 std::map<std::string, te::gm::Geometry*> geometries;
718 std::unique_ptr<te::da::DataSetAdapter> inDset(
725 inDset->moveBeforeFirst();
727 if(inDset->size() > 0)
729 std::map<std::string, std::vector<te::gm::Geometry*> > groups;
730 std::map<std::string, std::vector<te::gm::Geometry*> >::iterator itg;
732 inDset->moveBeforeFirst();
733 while(inDset->moveNext())
737 std::string key = inDset->getAsString(
m_attribute);
738 std::unique_ptr<te::gm::Geometry> geom = inDset->getGeometry(geom_pos);
743 itg = groups.find(key);
745 if (itg==groups.end())
747 std::vector<te::gm::Geometry*> geometriesToDissolve;
749 geometriesToDissolve.push_back(geom.release());
751 groups.insert(std::pair<std::string, std::vector<te::gm::Geometry*> >(
752 key, geometriesToDissolve));
756 itg->second.push_back(geom.release());
766 itg = groups.begin();
767 while(itg != groups.end())
774 if(geometry->isValid())
775 geometries.insert(std::pair<std::string, te::gm::Geometry*>(itg->first, geometry.release()));
790 return outDSet.release();
794 std::map<std::string, te::gm::Geometry*>::iterator itGeom;
797 itGeom = geometries.begin();
798 while(itGeom != geometries.end())
812 outItem->
setInt16(1, boost::lexical_cast<int16_t>(itGeom->first));
815 outItem->
setInt32(1, boost::lexical_cast<int>(itGeom->first));
818 outItem->
setInt64(1, boost::lexical_cast<int>(itGeom->first));
821 outItem->
setDouble(1, boost::lexical_cast<double>(itGeom->first));
825 "Vector Processing - Geometric Operation - Could not insert the " 826 "aggregated value.");
831 if(tabVec.size() > 0)
833 for(std::size_t tabPos = 0; tabPos < tabVec.size(); ++tabPos)
835 switch(tabVec[tabPos])
853 double perimeter = 0;
855 outItem->
setDouble(
"perimeter", perimeter);
861 "Vector Processing - Geometric Operation - Could not insert " 862 "the tabular value.");
868 if(geoVec.size() > 0)
870 for(std::size_t geoPos = 0; geoPos < geoVec.size(); ++geoPos)
872 switch(geoVec[geoPos])
877 if(pos < dsType->size())
879 std::unique_ptr<te::gm::Geometry> convexHull(
880 itGeom->second->convexHull());
881 convexHull->setSRID(itGeom->second->getSRID());
883 outItem->
setGeometry(
"convex_hull", convexHull.release());
890 if(pos < dsType->size())
903 if(pos < dsType->size())
905 std::unique_ptr<te::gm::Geometry> mbr(
906 itGeom->second->getEnvelope());
907 mbr->setSRID(itGeom->second->getSRID());
915 "Vector Processing - Geometric Operation - Could not insert " 916 "the geometric value.");
926 switch(itGeom->second->getGeomTypeId())
941 if(itGeom->second->isValid())
942 teGeomColl->
add(itGeom->second);
948 "Vector Processing - Geometric Operation - Could not insert the " 949 "geometry in collection.");
958 outDSet->add(outItem);
963 return outDSet.release();
979 std::unique_ptr<te::gm::Polygon> pol(dynamic_cast<te::gm::Polygon*>(geom.
clone()));
986 value = pol->getArea();
993 if(type ==
"GeometryCollection")
995 std::unique_ptr<te::gm::GeometryCollection> m_geoColl(dynamic_cast<te::gm::GeometryCollection*>(geom.
clone()));
1002 std::vector<te::gm::Geometry*> geomVec =
1003 m_geoColl->getGeometries();
1005 for(std::size_t i = 0; i < geomVec.size(); ++i)
1027 std::unique_ptr<te::gm::MultiPolygon> m_pol(dynamic_cast<te::gm::MultiPolygon*>(geom.
clone()));
1034 value = m_pol->getArea();
1046 std::unique_ptr<te::gm::LineString> lineString(dynamic_cast<te::gm::LineString*>(geom.
clone()));
1048 if(lineString.get())
1053 value = lineString->getLength();
1058 std::unique_ptr<te::gm::MultiLineString> m_lineString(dynamic_cast<te::gm::MultiLineString*>(geom.
clone()));
1060 if(m_lineString.get())
1062 if(m_lineString->getSRID() !=
m_newSRID)
1065 value = m_lineString->getLength();
1075 std::unique_ptr<te::gm::Polygon> pol(dynamic_cast<te::gm::Polygon*>(geom.
clone()));
1081 value = pol->getPerimeter();
1088 if(type ==
"GeometryCollection")
1090 std::unique_ptr<te::gm::GeometryCollection> m_geoColl(dynamic_cast<te::gm::GeometryCollection*>(geom.
clone()));
1097 std::vector<te::gm::Geometry*> geomVec =
1098 m_geoColl->getGeometries();
1100 for(std::size_t i = 0; i < geomVec.size(); ++i)
1122 std::unique_ptr<te::gm::MultiPolygon> m_pol(dynamic_cast<te::gm::MultiPolygon*>(geom.
clone()));
1129 value = m_pol->getPerimeter();
1139 "Vector Processing - Geometric Operation - Could not calculate the "
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)
MultiPolygon is a MultiSurface whose elements are Polygons.
static std::unique_ptr< DataSource > make(const std::string &driver, const te::core::URI &connInfo)
GeomType
Each enumerated type is compatible with a Well-known Binary (WKB) type code.
void setGeometry(std::size_t i, te::gm::Geometry *value)
It sets the value of the i-th property.
std::vector< std::string > m_outDsetNameVec
void setDouble(std::size_t i, double value)
It sets the value of the i-th property.
The geographic operation Line.
The geographic operation Minimum Bounding Rectangle.
Base exception class for plugin module.
A class that models the description of a dataset.
virtual const char * what() const
It outputs the exception message.
GeomType getGeomTypeId() const _NOEXCEPT_OP(true)
It returns the geometry subclass type identifier.
double getPerimeter() const
It returns the length of the boundary for the surface.
TEVPEXPORT 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.
TEDATAACCESSEXPORT std::size_t GetPropertyPos(const DataSet *dataset, const std::string &name)
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)
TEGEOMEXPORT std::unique_ptr< te::gm::Geometry > GetGeometryUnion(const std::vector< te::gm::Geometry * > &geomVec)
It returns the union of a geometry vector.
double CalculateTabularOp(const int &tabOperation, gm::Geometry &geom)
An utility struct for representing 2D coordinates.
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.
#define TE_LOG_INFO(message)
Use this tag in order to log a message to the TerraLib default logger with the INFO level...
It models a property definition.
void setInt32(std::size_t i, boost::int32_t value)
It sets the value of the i-th property.
TEVPEXPORT void Save(te::da::DataSource *source, te::da::DataSet *result, te::da::DataSetType *outDsType, const bool &enableProgress=true)
Coord2D getCenter() const
It returns the rectangle's center coordinate.
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.
The geographic operation Area.
int getSRID() const
It returns the spatial reference system identifier associated to this property.
A point with x and y coordinate values.
An Envelope defines a 2D rectangular region.
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)
std::unique_ptr< te::da::DataSource > m_outDsrc
Aggregate objects by attribute.
virtual AbstractData * clone() const =0
It returns a clone of this object.
The geographic operation Perimeter.
Utility functions for the data access module.
The geographic operation Centroid.
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
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.
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
te::da::DataSourcePtr m_inDsrc
std::vector< std::string > m_selectedProps
Polygon is a subclass of CurvePolygon whose rings are defined by linear rings.
std::vector< te::vp::GeometricOperation > m_operations
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.
#define TE_LOG_ERROR(message)
Use this tag in order to log a message to the TerraLib default logger with the ERROR level...
The geographic operation Convex Hull.
te::vp::GeometricOpObjStrategy m_objStrategy
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 te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
TEDATAACCESSEXPORT DataSetAdapter * CreateAdapter(DataSet *ds, DataSetTypeConverter *converter, bool isOwner=false)
All objects individually.
std::unique_ptr< te::da::DataSetTypeConverter > m_converter
virtual const std::string & getGeometryType() const _NOEXCEPT_OP(true)=0
It returns the name of the geometry subclass.