PostGISDataSetSelectorDialog.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/qt/plugins/datasource/pgis/PostGISDataSetSelectorDialog.cpp
22 
23 \brief A dialog window for showing the PostGIS data set selector widget.
24 */
25 
26 // TerraLib
27 #include "../../../../dataaccess/datasource/DataSourceFactory.h"
28 #include "../../../../dataaccess/datasource/DataSourceManager.h"
29 #include "../../../../dataaccess/utils/Utils.h"
30 #include "../../../../qt/widgets/datasource/core/DataSourceType.h"
31 #include "../../../../qt/widgets/datasource/core/DataSourceTypeManager.h"
32 #include "../../../../qt/widgets/mapdisplay/DataSetDisplay.h"
34 #include "ui_PostGISDataSetSelectorDialogForm.h"
35 
36 // Qt
37 #include <QMessageBox>
38 #include <QTreeWidget>
39 #include <QTreeWidgetItem>
40 
42  : QDialog(parent, f),
43  m_ui(new Ui::PostGISDataSetSelectorDialogForm),
44  m_rootItem(nullptr),
45  m_propertyBrowser(nullptr),
46  m_rasterPropertyInfo(nullptr),
47  m_timer(new QTimer(this))
48 {
49 // add controls
50  m_ui->setupUi(this);
51 
52 // init components
53 
54  m_mapPreview.reset(new te::qt::widgets::DataSetDisplay(m_ui->m_mapPreviewGroupBox));
55  QVBoxLayout* mapPreviewGroupBoxLayout = new QVBoxLayout(m_ui->m_mapPreviewGroupBox);
56  mapPreviewGroupBoxLayout->addWidget(m_mapPreview.get(), 1);
57  m_mapPreview->show();
58 
59  m_ui->m_mapPreviewGroupBox->setChecked(true);
60 
61  m_propertyLayout = new QGridLayout(m_ui->m_dataPreviewGroupBox);
62 
63  // connect signals and slots
64  connect(m_ui->m_mapPreviewGroupBox, SIGNAL(toggled(bool)), this, SLOT(onMapPreviewToggled(bool)));
65  connect(m_ui->m_treeWidget, SIGNAL(itemPressed(QTreeWidgetItem*, int)), this, SLOT(onItemPressed(QTreeWidgetItem*, int)));
66 
67  m_timer->setSingleShot(true);
68  connect(m_timer, SIGNAL(timeout()), this, SLOT(onResizeTimeout()));
69 
70  m_ui->m_helpPushButton->setPageReference("widgets/dataset_selector/dataset_selector.html");
71 }
72 
74 {
75  delete m_propertyBrowser;
76  delete m_rasterPropertyInfo;
77 }
78 
80 {
81  m_datasource = ds;
82 
83  if (ds.get() == nullptr)
84  return;
85 
86  //set interface labels
87  QString title(tr("Dataset Selection - %1"));
88  title = title.arg(QString::fromUtf8(ds->getTitle().c_str()));
89 
91 
92  if(dsType == nullptr)
93  return;
94 
95  title = tr("%1 - %2");
96  title = title.arg(QString::fromUtf8(dsType->getTitle().c_str())).arg(QString::fromUtf8(ds->getTitle().c_str()));
97 
98  m_ui->m_titleLabel->setText(title);
99 
100  //list raster datasets
101  listDataSets();
102 }
103 
105 {
106  if (!m_rootItem)
107  return;
108 
109  for (int i = 0; i < m_rootItem->childCount(); ++i)
110  {
111  QTreeWidgetItem* item = m_rootItem->child(i);
112 
113  if (item->checkState(0) == Qt::Checked)
114  {
115  PostGISRasterInfo info;
116  info.m_tableName = item->text(0).toUtf8().data();
117  info.m_schemaName = item->text(1).toUtf8().data();
118  info.m_uri = getGDALURI(info.m_tableName, info.m_schemaName);
119 
120  vec.push_back(info);
121  }
122  }
123 }
124 
126 {
127  //clear and set root item
128  m_ui->m_treeWidget->clear();
129 
130  m_rootItem = new QTreeWidgetItem(m_ui->m_treeWidget, ROOT_ITEM);
131  m_rootItem->setText(0, tr("Rasters"));
132  m_rootItem->setExpanded(true);
133 
134  m_ui->m_treeWidget->addTopLevelItem(m_rootItem);
135 
136  //get data source
137  te::da::DataSourcePtr ds = te::da::DataSourceManager::getInstance().get(m_datasource->getId(), m_datasource->getAccessDriver(), m_datasource->getConnInfo());
138 
139  if (!ds.get())
140  {
141  QMessageBox::warning(this, tr("PostGIS Raster"), tr("Error openning data source."));
142  return;
143  }
144 
145  if (!ds->isOpened())
146  ds->open();
147 
148 
149  //get list
150  std::unique_ptr<te::da::DataSet> dataSet;
151 
152  try
153  {
154  dataSet = ds->query("SELECT r_table_name, r_table_schema FROM raster_columns");
155  }
156  catch (...)
157  {
158  QMessageBox::warning(this, tr("PostGIS Raster"), tr("Error getting data sets."));
159  return;
160  }
161 
162  if (!dataSet.get())
163  {
164  QMessageBox::warning(this, tr("PostGIS Raster"), tr("Error getting data sets."));
165  return;
166  }
167 
168  dataSet->moveBeforeFirst();
169 
170  //set items
171  while (dataSet->moveNext())
172  {
173  std::string name = dataSet->getString(0);
174  std::string schema = dataSet->getString(1);
175 
177 
178  item->setFlags(Qt::ItemIsEnabled |Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
179  item->setText(0, name.c_str());
180  item->setText(1, schema.c_str());
181  item->setCheckState(0, Qt::Unchecked);
182 
183  m_rootItem->addChild(item);
184  }
185 }
186 
187 void te::qt::plugins::pgisRaster::PostGISDataSetSelectorDialog::drawDataSet(std::string dataSetName, std::string schema)
188 {
189  if (!m_ui->m_mapPreviewGroupBox->isChecked())
190  return;
191 
192  //build GDAL URI
193  std::map<std::string, std::string> rinfo;
194 
195  std::string uri = getGDALURI(dataSetName, schema);
196 
197  rinfo["URI"] = uri;
198 
199  //get raster
201  ds->open();
202  ds->isValid();
203 
204  std::vector<std::string> dsNames = ds->getDataSetNames();
205 
206  std::unique_ptr<te::da::DataSet> dataSet = ds->getDataSet(dsNames[0]);
207 
208  te::da::DataSetTypePtr dataSetType = ds->getDataSetType(dsNames[0]);
209 
210  //draw raster
211  m_mapPreview->draw(dataSetType, ds, dataSet.get());
212 }
213 
214 void te::qt::plugins::pgisRaster::PostGISDataSetSelectorDialog::getDataSetInfo(std::string dataSetName, std::string schema)
215 {
216  std::map<std::string, std::string> rinfo;
217 
218  std::string uri = getGDALURI(dataSetName, schema);
219 
220  rinfo["URI"] = uri;
221 
222  std::unique_ptr<te::da::DataSource> ds = te::da::DataSourceFactory::make("GDAL", uri);
223  ds->open();
224  ds->isValid();
225 
226  std::vector<std::string> dsNames = ds->getDataSetNames();
227 
228  std::unique_ptr<te::da::DataSet> dataSet = ds->getDataSet(dsNames[0]);
229 
230  std::size_t rpos = te::da::GetFirstPropertyPos(dataSet.get(), te::dt::RASTER_TYPE);
231 
232  std::unique_ptr<te::rst::Raster> inraster = dataSet->getRaster(rpos);
233 
234  buildDataSetInfoProperties(inraster.get());
235 }
236 
238 {
239  if (m_propertyBrowser)
240  delete m_propertyBrowser;
241 
243  delete m_rasterPropertyInfo;
244 
245  m_propertyBrowser = new QtTreePropertyBrowser(this);
246  m_propertyBrowser->setPropertiesWithoutValueMarked(true);
247  m_propertyBrowser->setResizeMode(QtTreePropertyBrowser::ResizeToContents);
248 
250 
252 }
253 
255 {
256  QWidget::resizeEvent(e);
257 
258  m_timer->start(200);
259 }
260 
261 std::string te::qt::plugins::pgisRaster::PostGISDataSetSelectorDialog::getGDALURI(std::string dataSetName, std::string schema)
262 {
263  //"PG://postgres:tdk696@localhost:5432/raster_db?schema=public&table=cbers&mode=2";
264 
265  std::string uri = "PG://";
266  uri += m_datasource->getConnInfo().user();
267  uri += ":";
268  uri += m_datasource->getConnInfo().password();
269  uri += "@";
270  uri += m_datasource->getConnInfo().host();
271  uri += ":";
272  uri += m_datasource->getConnInfo().port();
273  uri += m_datasource->getConnInfo().path();
274  uri += "?";
275  uri += "schema=";
276  uri += schema;
277  uri += "&table=";
278  uri += dataSetName;
279  uri += "&mode=2";
280 
281  return uri;
282 }
283 
285 {
286  if (on)
287  {
288  QList<QTreeWidgetItem*> list = m_ui->m_treeWidget->selectedItems();
289 
290  if (!list.isEmpty())
291  {
292  QTreeWidgetItem* item = list.first();
293 
294  onItemPressed(item, 0);
295  }
296  }
297  else
298  {
299  m_mapPreview->clear();
300  }
301 }
302 
304  QTreeWidgetItem* item, int /*column*/)
305 {
306  if (!item || item->type() == ROOT_ITEM)
307  return;
308 
309  std::string dataSetName = item->text(0).toUtf8().data();
310  std::string schemaName = item->text(1).toUtf8().data();
311 
312  getDataSetInfo(dataSetName, schemaName);
313 
314  drawDataSet(dataSetName, schemaName);
315 }
316 
318 {
319  onMapPreviewToggled(m_ui->m_mapPreviewGroupBox->isChecked());
320 }
321 
void drawDataSet(std::string dataSetName, std::string schema)
virtual std::string getTitle() const =0
static std::unique_ptr< DataSource > make(const std::string &driver, const te::core::URI &connInfo)
boost::shared_ptr< DataSetType > DataSetTypePtr
Definition: DataSetType.h:653
boost::shared_ptr< DataSource > DataSourcePtr
std::unique_ptr< Ui::PostGISDataSetSelectorDialogForm > m_ui
static te::dt::Date ds(2010, 01, 01)
QTimer * m_timer
Timer to execute redraw on resize action.
static DataSourceTypeManager & getInstance()
It returns a reference to the singleton instance.
An abstract class for raster data strucutures.
A map display for a dataset.
std::string getGDALURI(std::string dataSetName, std::string schema)
void getDataSetInfo(std::string dataSetName, std::string schema)
std::unique_ptr< te::qt::widgets::DataSetDisplay > m_mapPreview
TEDATAACCESSEXPORT std::size_t GetFirstPropertyPos(const te::da::DataSet *dataset, int datatype)
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
A base class for the suppported types of data source.