src/terralib/vp/qt/Utils.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 terralib/vp/qt/Utils.cpp
22 
23  \brief Utility functions for Vector Processing.
24 */
25 
26 // TerraLib
27 #include "../../common/UnitOfMeasure.h"
28 #include "../../dataaccess/dataset/DataSetAdapter.h"
29 #include "../../dataaccess/dataset/DataSetTypeConverter.h"
30 #include "../../dataaccess/dataset/ObjectIdSet.h"
31 
32 #include "../../dataaccess/datasource/DataSourceInfo.h"
33 #include "../../dataaccess/datasource/DataSourceManager.h"
34 
35 #include "../../dataaccess/query/And.h"
36 #include "../../dataaccess/query/DataSetName.h"
37 #include "../../dataaccess/query/Expression.h"
38 #include "../../dataaccess/query/Field.h"
39 #include "../../dataaccess/query/Fields.h"
40 #include "../../dataaccess/query/From.h"
41 #include "../../dataaccess/query/FromItem.h"
42 #include "../../dataaccess/query/LiteralInt32.h"
43 #include "../../dataaccess/query/PropertyName.h"
44 #include "../../dataaccess/query/ST_SetSRID.h"
45 #include "../../dataaccess/query/ST_Transform.h"
46 #include "../../dataaccess/query/Where.h"
47 
48 #include "../../dataaccess/utils/Utils.h"
49 
50 #include "../../maptools/DataSetLayer.h"
51 #include "../../maptools/QueryLayer.h"
52 
53 #include "../../geometry/Geometry.h"
54 #include "../../geometry/GeometryCollection.h"
55 #include "../../geometry/GeometryProperty.h"
56 
57 #include "../../memory/DataSet.h"
58 
59 #include "../../srs/SpatialReferenceSystemManager.h"
60 
61 #include "Utils.h"
62 
63 // Qt
64 #include <QMessageBox>
65 #include <QTreeView>
66 
67 //STL
68 #include <memory>
69 #include <vector>
70 
71 // Boost
72 #include <boost/algorithm/string.hpp>
73 
74 std::list<te::map::AbstractLayerPtr> te::vp::GetFilteredLayers(std::string text, std::list<te::map::AbstractLayerPtr> layers)
75 {
76  std::list<te::map::AbstractLayerPtr> filteredList;
77 
78  for(std::list<te::map::AbstractLayerPtr>::iterator it = layers.begin(); it != layers.end(); ++it)
79  {
80  std::string layName = (*it)->getTitle().substr(0, text.size());
81 
82  if(boost::to_upper_copy(layName) == boost::to_upper_copy(text))
83  filteredList.push_back(*it);
84  }
85 
86  return filteredList;
87 }
88 
90 {
91  // Do a Cast from AbstractLayerPtr to DataSetLayer or QueryLayer.
92  te::map::DataSetLayer* dataSetLayer = nullptr;
93  te::map::QueryLayer* queryLayer = nullptr;
94 
95  if (layer->getType() == "DATASETLAYER")
96  {
97  dataSetLayer = dynamic_cast<te::map::DataSetLayer*>(layer.get());
98  if (!dataSetLayer)
99  {
100  QMessageBox::information(nullptr, "Error", "Can not execute this operation on this type of layer.");
101  return nullptr;
102  }
103  }
104  else if (layer->getType() == "QUERYLAYER")
105  {
106  queryLayer = dynamic_cast<te::map::QueryLayer*>(layer.get());
107  if (!queryLayer)
108  {
109  QMessageBox::information(nullptr, "Error", "Can not execute this operation on this type of layer.");
110  return nullptr;
111  }
112  }
113  else
114  {
115  QMessageBox::information(nullptr, "Error", "Can not execute this operation on this type of layer.");
116  return nullptr;
117  }
118 
119  // Select query
120  te::da::Select* select = new te::da::Select();
121 
122  // From dataSetLayer
123  if (dataSetLayer)
124  {
125  te::da::Fields* fields = new te::da::Fields;
126 
127  if (srid == 0)
128  {
129  te::da::Field* f_all = new te::da::Field("*");
130  fields->push_back(f_all);
131  }
132  else
133  {
134  std::unique_ptr<te::da::DataSetType> dsType = dataSetLayer->getSchema();
135  std::vector<te::dt::Property*> properties = dsType.get()->getProperties();
136 
137  for (std::size_t i = 0; i < properties.size(); ++i)
138  {
139  if (properties[i]->getType() != te::dt::GEOMETRY_TYPE)
140  {
141  te::da::Field* currentField = new te::da::Field(properties[i]->getName());
142  fields->push_back(currentField);
143  }
144  else
145  {
146  te::gm::GeometryProperty* sourceGeomProp = te::da::GetFirstGeomProperty(dsType.get());
147  int sourceSRID = sourceGeomProp->getSRID();
148 
149  te::da::LiteralInt32* literalSRID = new te::da::LiteralInt32(srid);
150 
151  te::da::Expression* eGeom;
152 
153  if (sourceSRID != srid)
154  eGeom = new te::da::ST_SetSRID(new te::da::PropertyName(properties[i]->getName()), literalSRID);
155  else
156  eGeom = new te::da::PropertyName(properties[i]->getName());
157 
158  te::da::Field* geomField = new te::da::Field(*eGeom, properties[i]->getName());
159  fields->push_back(geomField);
160  }
161  }
162  }
163 
164  select->setFields(fields);
165 
166  te::da::From* from = new te::da::From;
167  te::da::FromItem* fromItem = new te::da::DataSetName(dataSetLayer->getDataSetName());
168  from->push_back(fromItem);
169  select->setFrom(from);
170 
171  if (onlySelectedObjects)
172  {
173  const te::da::ObjectIdSet* oidSet = layer->getSelected();
174  if (!oidSet)
175  {
176  QMessageBox::information(nullptr, "Vector Processing", "Select the layer objects to perform the operation.");
177  return nullptr;
178  }
179 
180  te::da::Where* w_oid = new te::da::Where(oidSet->getExpression());
181  select->setWhere(w_oid);
182  }
183  }
184  // From queryLayer
185  else
186  {
187  select = queryLayer->getQuery();
188 
189  if (srid != 0)
190  {
191  std::unique_ptr<te::da::DataSetType> dsType = queryLayer->getSchema();
192  std::vector<te::dt::Property*> properties = dsType.get()->getProperties();
193 
194  te::da::Fields* fields = new te::da::Fields;
195 
196  for (std::size_t i = 0; i < properties.size(); ++i)
197  {
198  if (properties[i]->getType() != te::dt::GEOMETRY_TYPE)
199  {
200  te::da::Field* currentField = new te::da::Field(properties[i]->getName());
201  fields->push_back(currentField);
202  }
203  else
204  {
205  te::gm::GeometryProperty* sourceGeomProp = te::da::GetFirstGeomProperty(dsType.get());
206  int sourceSRID = sourceGeomProp->getSRID();
207 
208  te::da::LiteralInt32* literalSRID = new te::da::LiteralInt32(srid);
209 
210  te::da::Expression* eGeom;
211 
212  if (sourceSRID != srid)
213  eGeom = new te::da::ST_SetSRID(new te::da::PropertyName(properties[i]->getName()), literalSRID);
214  else
215  eGeom = new te::da::PropertyName(properties[i]->getName());
216 
217  te::da::Field* geomField = new te::da::Field(*eGeom, properties[i]->getName());
218  fields->push_back(geomField);
219  }
220  }
221 
222  select->setFields(fields);
223 
224  }
225 
226  if (onlySelectedObjects)
227  {
228  const te::da::ObjectIdSet* oidSet = layer->getSelected();
229  if (!oidSet)
230  {
231  QMessageBox::information(nullptr, "Vector Processing", "Select the layer objects to perform the operation.");
232  return nullptr;
233  }
234 
235  te::da::Where* w = select->getWhere();
236 
237  te::da::Expression* e_where = w->getExp()->clone();
238  te::da::Expression* e_oidWhere = oidSet->getExpression();
239 
240  te::da::And* andPtr = new te::da::And(e_where, e_oidWhere);
241 
242  te::da::Where* newWhere = new te::da::Where(andPtr);
243 
244  select->setWhere(newWhere);
245  }
246  }
247 
248  return select;
249 }
250 
252 {
253  DataStruct data;
254 
255  std::string sourceId = layer->getDataSourceId();
257 
258  std::unique_ptr<te::da::DataSetType> dataSetType = layer->getSchema();
259  std::unique_ptr<te::da::DataSet> dataSet = dataSource->getDataSet(dataSetType->getName());
260 
261  if (dataSetType.get() && dataSet.get())
262  {
263  if (onlySelectedObjects)
264  {
265  const te::da::ObjectIdSet* oidSet = layer->getSelected();
266  if (!oidSet)
267  {
268  QMessageBox::information(nullptr, "Vector Processing", "Select the layer objects to perform the operation.");
269  return data;
270  }
271 
272  dataSet = dataSource->getDataSet(dataSetType->getName(), oidSet);
273 
274  if (!dataSet.get())
275  return data;
276  }
277 
278  te::gm::GeometryProperty* geomProp = te::da::GetFirstGeomProperty(dataSetType.get());
279 
280  if (srid != 0 && srid != geomProp->getSRID())
281  {
282  std::unique_ptr<te::da::DataSetTypeConverter> converter(new te::da::DataSetTypeConverter(dataSetType.get(), dataSource->getCapabilities(), dataSource->getEncoding()));
283  te::da::AssociateDataSetTypeConverterSRID(converter.get(), srid);
284 
285  dataSetType.reset(new te::da::DataSetType(*converter->getResult()));
286 
287  te::da::DataSetAdapter* dataSetAdapter = te::da::CreateAdapter(dataSet.release(), converter.get());
288 
289  if (!dataSetAdapter)
290  return data;
291 
292  dataSet.reset(dataSetAdapter);
293  }
294 
295  data.m_dataSetType = dataSetType.release();
296  data.m_dataSet = dataSet.release();
297  }
298 
299  return data;
300 }
301 
302 bool te::vp::IsProjectionLatLong(const int& srid)
303 {
304 
306 
307  if(unitPtr.get())
308  {
309  if(unitPtr->getId() == te::common::UOM_Degree)
310  {
311  return true;
312  }
313  }
314 
315  return false;
316 }
std::unique_ptr< LayerSchema > getSchema() const
It returns the layer schema.
Definition: QueryLayer.cpp:103
Geometric property.
te::da::DataSetType * m_dataSetType
An abstract class that models a source of data in a query.
Definition: FromItem.h:50
The Field class can be used to model an expression that takes part of the output items of a SELECT...
te::da::Select * GetSelectQueryFromLayer(te::map::AbstractLayerPtr layer, bool onlySelectedObjects, int srid=0)
DataStruct GetDataStructFromLayer(te::map::AbstractLayerPtr layer, bool onlySelectedObjects, int srid=0)
A class that models the name of a dataset used in a From clause.
Definition: DataSetName.h:43
boost::shared_ptr< DataSource > DataSourcePtr
TEDATAACCESSEXPORT void AssociateDataSetTypeConverterSRID(DataSetTypeConverter *converter, const int &inputSRID, const int &outputSRID=TE_UNKNOWN_SRS)
A class that models the name of any property of an object.
A class that models the description of a dataset.
Definition: DataSetType.h:72
virtual Expression * clone() const =0
It creates a new copy of this expression.
std::unique_ptr< LayerSchema > getSchema() const
It returns the layer schema.
A layer resulting from a query.
Definition: QueryLayer.h:50
Boolean logic operator: AND.
Get a list of AbstractLayer filtered by the name;.
This is an abstract class that models a query expression.
An converter for DataSetType.
std::list< te::map::AbstractLayerPtr > GetFilteredLayers(std::string text, std::list< te::map::AbstractLayerPtr > layers)
Get a list of AbstractLayer filtered by the name;.
void setWhere(Where *w)
It sets the filter codition.
Definition: Select.cpp:799
int getSRID() const
It returns the spatial reference system identifier associated to this property.
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
This class represents a set of unique ids created in the same context. i.e. from the same data set...
Definition: ObjectIdSet.h:55
boost::ptr_vector< Field > Fields
Fields is just a boost::ptr_vector of Field pointers.
Definition: Fields.h:37
A class that can be used to model a filter expression that can be applied to a query.
Definition: Where.h:47
bool IsProjectionLatLong(const int &srid)
Expression * getExp() const
Definition: Where.cpp:58
te::da::Select * getQuery() const
Definition: QueryLayer.cpp:363
Utility functions for the data access module.
A Select models a query to be used when retrieving data from a DataSource.
Definition: Select.h:65
boost::ptr_vector< FromItem > From
It models the FROM clause for a query.
Definition: From.h:37
Spatial Set SRID operator.
Definition: ST_SetSRID.h:46
Where * getWhere() const
It returns the filter condition.
Definition: Select.cpp:804
boost::shared_ptr< UnitOfMeasure > UnitOfMeasurePtr
const std::string & getDataSetName() const
A layer with reference to a dataset.
Definition: DataSetLayer.h:47
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
TEDATAACCESSEXPORT DataSetAdapter * CreateAdapter(DataSet *ds, DataSetTypeConverter *converter, bool isOwner=false)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
An adapter for DataSet.
Expression * getExpression() const
It returns the expression that can be used to retrieve the data set that contains the all indentified...
void setFields(Fields *f)
It sets the list of output expressions used to form the result set.
Definition: Select.cpp:779
te::da::DataSet * m_dataSet
void setFrom(From *f)
It sets the list of source information.
Definition: Select.cpp:789