All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DataSetDisplay.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/myqt/widgets/mapdisplay/DataSetDisplay.cpp
22 
23  \brief A map display for a dataset.
24 */
25 
26 // TerraLib
27 #include "../../../dataaccess/dataset/DataSet.h"
28 #include "../../../dataaccess/dataset/DataSetType.h"
29 #include "../../../dataaccess/datasource/DataSource.h"
30 #include "../../../dataaccess/datasource/DataSourceManager.h"
31 #include "../../../dataaccess/datasource/DataSourceTransactor.h"
32 #include "../../../dataaccess/utils/Utils.h"
33 #include "../../../geometry/Envelope.h"
34 #include "../../../geometry/Geometry.h"
35 #include "../../../geometry/GeometryProperty.h"
36 #include "../../../maptools/Utils.h"
37 #include "../../../se/CoverageStyle.h"
38 #include "../../../se/Utils.h"
39 #include "../canvas/Canvas.h"
40 #include "../Utils.h"
41 #include "DataSetDisplay.h"
42 
43 // STL
44 #include <cassert>
45 
46 // Qt
47 #include <QMessageBox>
48 #include <QResizeEvent>
49 
50 te::qt::widgets::DataSetDisplay::DataSetDisplay(QWidget * parent, Qt::WindowFlags f)
51  : QFrame(parent, f)
52 {
53 }
54 
56 {
57 }
58 
60 {
61  if(ds.get() == 0)
62  return;
63 
64  try
65  {
66  te::da::DataSourcePtr auxDs = te::da::DataSourceManager::getInstance().get(ds->getId(), ds->getType(), ds->getConnInfo());
67 
68  if(dataset->hasRaster())
69  {
70  std::auto_ptr<te::da::DataSourceTransactor> t = auxDs->getTransactor();
71 
72  draw(dataset, auxDs, t->getDataSet(dataset->getName()).get());
73  }
74  else
75  draw(dataset, auxDs);
76 
77  }
78  catch(const std::exception& e)
79  {
80  QMessageBox::warning(this,
81  tr("TerraLib Qt Components"),
82  tr(e.what()));
83  }
84  catch(...)
85  {
86  QMessageBox::warning(this,
87  tr("TerraLib Qt Components"),
88  tr("Unknown error when displaying dataset!"));
89  }
90 }
91 
93 {
94  if((dataset.get() == 0) || (ds.get() == 0))
95  return;
96 
97  if(m_canvas.get() == 0)
98  m_canvas.reset(new Canvas(width(), height()));
99 
100  if(dataset->size() == 0)
101  te::da::LoadProperties(dataset.get(), ds->getId());
102 
103  if(dataset->hasRaster())
104  {
105  std::size_t rpos = te::da::GetFirstPropertyPos(datasetData, te::dt::RASTER_TYPE);
106 
107  std::auto_ptr<te::rst::Raster> rst = datasetData->getRaster(rpos);
108 
109  te::se::Style* style = te::se::CreateCoverageStyle(rst->getNumberOfBands());
110  te::se::CoverageStyle* cs = dynamic_cast<te::se::CoverageStyle*>(style);
111 
112  te::gm::Envelope* rstEnv = rst->getExtent();
113  int rstSrid = rst->getSRID();
114 
115  te::map::DrawRaster(rst.get(), m_canvas.get(), *rstEnv, rstSrid, *rstEnv, rstSrid, cs);
116  }
117  else if(dataset->hasGeom())
118  {
119 
121 
122  std::auto_ptr<te::gm::Envelope> mbr(te::da::GetExtent(dataset->getName(), gp->getName(), ds->getId()));
123 
124  if(mbr.get() == 0)
125  return;
126 
127  m_canvas->calcAspectRatio(mbr.get());
128 
129  m_canvas->setWindow(mbr->getLowerLeftX(), mbr->getLowerLeftY(), mbr->getUpperRightX(), mbr->getUpperRightY());
130 
131  switch(gp->getGeometryType())
132  {
133  case te::gm::PolygonType:
141  {
142  Config2DrawPolygons(m_canvas.get(), Qt::red, Qt::black);
143  }
144  break;
145 
154  {
155  Config2DrawLines(m_canvas.get(), Qt::black);
156  }
157  break;
158 
159  case te::gm::PointType:
160  case te::gm::PointZType:
161  case te::gm::PointMType:
162  case te::gm::PointZMType:
167  {
168  Config2DrawPoints(m_canvas.get(), "circle", 1, Qt::black, Qt::transparent, 1);
169  }
170  break;
171 
172  default:
173  break;
174  }
175 
176  if(datasetData)
177  {
178  std::size_t gpos = te::da::GetFirstPropertyPos(datasetData, te::dt::GEOMETRY_TYPE);
179 
180  while(datasetData->moveNext())
181  {
182  std::auto_ptr<te::gm::Geometry> g(datasetData->getGeometry(gpos));
183  m_canvas->draw(g.get());
184  }
185  }
186  else
187  {
188  std::auto_ptr<te::da::DataSet> feature(ds->getDataSet(dataset->getName()));
189 
190  std::size_t gpos = te::da::GetFirstPropertyPos(feature.get(), te::dt::GEOMETRY_TYPE);
191 
192  while(feature->moveNext())
193  {
194  std::auto_ptr<te::gm::Geometry> g(feature->getGeometry(gpos));
195  m_canvas->draw(g.get());
196  }
197  }
198  }
199  else
200  {
201  m_canvas->setBackgroundColor(te::color::RGBAColor(0, 0, 0, 255)); // fill black
202  }
203 
204  repaint();
205 }
206 
208 {
209  if(m_canvas.get() == 0)
210  m_canvas.reset(new Canvas(width(), height()));
211 
212  m_canvas->setBackgroundColor(te::color::RGBAColor(255, 255, 255, 0));
213  m_canvas->clear();
214 
215  repaint();
216 }
217 
219 {
220  if(m_canvas.get() == 0)
221  return;
222 
223  QPainter painter(this);
224 
225  painter.drawPixmap(0, 0, *(m_canvas->getPixmap()));
226 
227  painter.end();
228 
229 }
230 
232 {
233  assert(e);
234 
235  if(m_canvas.get() == 0)
236  return;
237 
238  m_canvas->resize(e->size().width(), e->size().height());
239 
240  QFrame::resizeEvent(e);
241 }
242 
Geometric property.
TEDATAACCESSEXPORT te::gm::Envelope * GetExtent(const std::string &datasetName, const std::string &propertyName, const std::string &datasourceId)
Definition: Utils.cpp:136
TEDATAACCESSEXPORT void LoadProperties(te::da::DataSetType *dataset, const std::string &datasourceId)
Definition: Utils.cpp:120
boost::shared_ptr< DataSetType > DataSetTypePtr
Definition: DataSetType.h:653
The Style defines the styling that is to be applied to a geographic dataset (vector geometries or cov...
Definition: Style.h:65
boost::shared_ptr< DataSource > DataSourcePtr
Definition: DataSource.h:1435
The CoverageStyle defines the styling that is to be applied to a subset of Coverage data...
Definition: CoverageStyle.h:45
TESEEXPORT Style * CreateCoverageStyle(const std::vector< te::rst::BandProperty * > &properties)
Try creates an appropriate coverage style based on given band properties.
Definition: Utils.cpp:299
TEQTWIDGETSEXPORT void Config2DrawLines(te::map::Canvas *canvas, const QColor &color, const std::size_t &width=1)
It configs (i.e. prepares) the given canvas to draw lines.
Definition: Utils.cpp:246
void draw(const te::da::DataSetTypePtr &dataset, const te::da::DataSourcePtr &ds, te::da::DataSet *datasetData=0)
virtual std::auto_ptr< te::rst::Raster > getRaster(std::size_t i) const =0
Method for retrieving a raster attribute value.
DataSetDisplay(QWidget *parent=0, Qt::WindowFlags f=0)
TEQTWIDGETSEXPORT void Config2DrawPolygons(te::map::Canvas *canvas, const QColor &fillColor, const QColor &contourColor, const std::size_t &contourWidth=1)
It configs (i.e. prepares) the given canvas to draw polygons.
Definition: Utils.cpp:239
virtual bool moveNext()=0
It moves the internal pointer to the next item of the collection.
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
An Envelope defines a 2D rectangular region.
Definition: Envelope.h:51
GeomType getGeometryType() const
It returns the geometry subtype allowed for the property.
TEQTWIDGETSEXPORT void Config2DrawPoints(te::map::Canvas *canvas, const QColor &color, const std::size_t &width=1)
It configs (i.e. prepares) the given canvas to draw points.
Definition: Utils.cpp:252
virtual std::auto_ptr< te::gm::Geometry > getGeometry(std::size_t i) const =0
Method for retrieving a geometric attribute value.
A canvas built on top of Qt.
Definition: Canvas.h:54
A dataset is the unit of information manipulated by the data access module of TerraLib.
Definition: DataSet.h:112
A helper class for 32-bit RGBA (Red-Green-Blue-Alpha channel) color.
Definition: RGBAColor.h:57
void resizeEvent(QResizeEvent *e)
TEDATAACCESSEXPORT std::size_t GetFirstPropertyPos(const te::da::DataSet *dataset, int datatype)
Definition: Utils.cpp:481
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
Definition: Utils.cpp:557
TEMAPEXPORT void DrawRaster(te::da::DataSetType *type, te::da::DataSourcePtr ds, Canvas *canvas, const te::gm::Envelope &bbox, int bboxSRID, const te::gm::Envelope &visibleArea, int srid, te::se::CoverageStyle *style)
Definition: Utils.cpp:460
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
const std::string & getName() const
It returns the property name.
Definition: Property.h:127