All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
KernelRatioDialog.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/sa/qt/KernelRatioDialog.cpp
22 
23  \brief A dialog to calculate the kernel ratio of a datasets.
24 */
25 
26 // TerraLib
27 #include "../../common/Logger.h"
28 #include "../../common/progress/ProgressManager.h"
29 #include "../../common/Translator.h"
30 #include "../../common/STLUtils.h"
31 #include "../../dataaccess/datasource/DataSource.h"
32 #include "../../dataaccess/utils/Utils.h"
33 #include "../../maptools/DataSetLayer.h"
34 #include "../../qt/widgets/progress/ProgressViewerDialog.h"
35 #include "../core/KernelRatioOperation.h"
36 #include "../Exception.h"
37 #include "KernelRatioDialog.h"
38 #include "Utils.h"
39 #include "ui_KernelRatioDialogForm.h"
40 
41 // Qt
42 #include <QFileDialog>
43 #include <QFileInfo>
44 #include <QMessageBox>
45 #include <QValidator>
46 
47 // STL
48 #include <memory>
49 
50 // Boost
51 #include <boost/algorithm/string.hpp>
52 #include <boost/filesystem.hpp>
53 #include <boost/uuid/random_generator.hpp>
54 #include <boost/uuid/uuid_io.hpp>
55 
57 
58 te::sa::KernelRatioDialog::KernelRatioDialog(QWidget* parent, Qt::WindowFlags f)
59  : QDialog(parent, f),
60  m_ui(new Ui::KernelRatioDialogForm)
61 {
62 // add controls
63  m_ui->setupUi(this);
64 
65  m_ui->m_nColsLineEdit->setValidator(new QIntValidator(this));
66 
68 
69 // add icons
70  m_ui->m_imgLabel->setPixmap(QIcon::fromTheme("sa-kernelratio-hint").pixmap(112,48));
71 
72 // connectors
73  connect(m_ui->m_inputLayerComboBox, SIGNAL(activated(int)), this, SLOT(onInputLayerComboBoxActivated(int)));
74  connect(m_ui->m_okPushButton, SIGNAL(clicked()), this, SLOT(onOkPushButtonClicked()));
75  connect(m_ui->m_targetFileToolButton, SIGNAL(pressed()), this, SLOT(onTargetFileToolButtonPressed()));
76 
77 // help info
78  m_ui->m_helpPushButton->setNameSpace("dpi.inpe.br.plugins");
79  m_ui->m_helpPushButton->setPageReference("plugins/sa/sa_kernelratio.html");
80 }
81 
83 {
84 }
85 
86 void te::sa::KernelRatioDialog::setLayers(std::list<te::map::AbstractLayerPtr> layers)
87 {
88  std::list<te::map::AbstractLayerPtr>::iterator it = layers.begin();
89 
90  while(it != layers.end())
91  {
93 
94  if(l->isValid())
95  {
96  std::auto_ptr<te::da::DataSetType> dsType = l->getSchema();
97 
98  te::map::DataSetLayer* dsLayer = dynamic_cast<te::map::DataSetLayer*>(l.get());
99 
100  if(dsLayer && dsType->hasGeom())
101  {
102  m_ui->m_inputLayerComboBox->addItem(it->get()->getTitle().c_str(), QVariant::fromValue(l));
103  }
104  }
105 
106  ++it;
107  }
108 
109 // fill attributes combo A and B
110  if(m_ui->m_inputLayerComboBox->count() > 0)
111  onInputLayerComboBoxActivated(0);
112 }
113 
115 {
116  return m_outputLayer;
117 }
118 
120 {
121  //function
122  m_ui->m_functionComboBoxA->clear();
123 
124  m_ui->m_functionComboBoxA->addItem("Quartic", QVariant(te::sa::Quartic));
125  m_ui->m_functionComboBoxA->addItem("Normal", QVariant(te::sa::Normal));
126  m_ui->m_functionComboBoxA->addItem("Triangular", QVariant(te::sa::Triangular));
127  m_ui->m_functionComboBoxA->addItem("Uniform", QVariant(te::sa::Uniform));
128  m_ui->m_functionComboBoxA->addItem("Negative Exponential", QVariant(te::sa::Negative_Exp));
129 
130  m_ui->m_functionComboBoxB->clear();
131 
132  m_ui->m_functionComboBoxB->addItem("Quartic", QVariant(te::sa::Quartic));
133  m_ui->m_functionComboBoxB->addItem("Normal", QVariant(te::sa::Normal));
134  m_ui->m_functionComboBoxB->addItem("Triangular", QVariant(te::sa::Triangular));
135  m_ui->m_functionComboBoxB->addItem("Uniform", QVariant(te::sa::Uniform));
136  m_ui->m_functionComboBoxB->addItem("Negative Exponential", QVariant(te::sa::Negative_Exp));
137 
138  //estimation
139  m_ui->m_estimationComboBoxA->clear();
140 
141  m_ui->m_estimationComboBoxA->addItem("Density", QVariant(te::sa::Density));
142  m_ui->m_estimationComboBoxA->addItem("Spatial Moving Average", QVariant(te::sa::Spatial_Moving_Average));
143  m_ui->m_estimationComboBoxA->addItem("Probability", QVariant(te::sa::Probability));
144 
145  m_ui->m_estimationComboBoxB->clear();
146 
147  m_ui->m_estimationComboBoxB->addItem("Density", QVariant(te::sa::Density));
148  m_ui->m_estimationComboBoxB->addItem("Spatial Moving Average", QVariant(te::sa::Spatial_Moving_Average));
149  m_ui->m_estimationComboBoxB->addItem("Probability", QVariant(te::sa::Probability));
150 
151  //combination
152  m_ui->m_combinationComboBox->clear();
153 
154  m_ui->m_combinationComboBox->addItem("Ratio", QVariant(te::sa::Ratio));
155  m_ui->m_combinationComboBox->addItem("Log Ratio", QVariant(te::sa::Log_Ratio));
156  m_ui->m_combinationComboBox->addItem("Absolute Difference", QVariant(te::sa::Abs_Difference));
157  m_ui->m_combinationComboBox->addItem("Relative Difference", QVariant(te::sa::Relative_Difference));
158  m_ui->m_combinationComboBox->addItem("Absolute Sum", QVariant(te::sa::Abs_Sum));
159  m_ui->m_combinationComboBox->addItem("Relative Sum", QVariant(te::sa::Relative_Sum));
160 }
161 
163 {
164  QVariant varLayer = m_ui->m_inputLayerComboBox->itemData(index, Qt::UserRole);
165 
167 
168  std::auto_ptr<te::da::DataSetType> dsType = l->getSchema();
169 
170  std::vector<te::dt::Property*> propVec = dsType->getProperties();
171 
172  m_ui->m_attrLayerComboBoxA->clear();
173  m_ui->m_attrLayerComboBoxB->clear();
174 
175  for(std::size_t t = 0; t < propVec.size(); ++t)
176  {
177  int dataType = propVec[t]->getType();
178 
179  if (dataType == te::dt::INT16_TYPE || dataType == te::dt::UINT16_TYPE ||
180  dataType == te::dt::INT32_TYPE || dataType == te::dt::UINT32_TYPE ||
181  dataType == te::dt::INT64_TYPE || dataType == te::dt::UINT64_TYPE ||
182  dataType == te::dt::FLOAT_TYPE || dataType == te::dt::DOUBLE_TYPE)
183  {
184  m_ui->m_attrLayerComboBoxA->addItem(propVec[t]->getName().c_str(), dataType);
185  m_ui->m_attrLayerComboBoxB->addItem(propVec[t]->getName().c_str(), dataType);
186  }
187  }
188 }
189 
191 {
192  // check input parameters
193  if(m_ui->m_repositoryLineEdit->text().isEmpty())
194  {
195  QMessageBox::information(this, tr("Warning"), tr("Define a repository for the result."));
196  return;
197  }
198 
199  if(m_ui->m_newLayerNameLineEdit->text().isEmpty())
200  {
201  QMessageBox::information(this, tr("Warning"), tr("Define a name for the resulting layer."));
202  return;
203  }
204 
205  //get selected layer
206  QVariant varLayer = m_ui->m_inputLayerComboBox->itemData(m_ui->m_inputLayerComboBox->currentIndex(), Qt::UserRole);
208 
209  //set input kernel parameters A
211 
212  kInParamsA->m_functionType = (te::sa::KernelFunctionType) m_ui->m_functionComboBoxA->itemData(m_ui->m_functionComboBoxA->currentIndex()).toInt();
213  kInParamsA->m_estimationType = (te::sa::KernelEstimationType) m_ui->m_estimationComboBoxA->itemData(m_ui->m_estimationComboBoxA->currentIndex()).toInt();
214  kInParamsA->m_useAdaptativeRadius = m_ui->m_useAdaptRadiusCheckBoxA->isChecked();
215 
216  if(!m_ui->m_useAdaptRadiusCheckBoxA->isChecked())
217  {
218  kInParamsA->m_radiusPercentValue = m_ui->m_radiusSpinBoxA->value();
219  }
220 
221  if(m_ui->m_useAttrLayerCheckBoxA->isChecked())
222  {
223  kInParamsA->m_intensityAttrName = m_ui->m_attrLayerComboBoxA->currentText().toStdString();
224  }
225 
226  kInParamsA->m_ds = l->getData();
227  kInParamsA->m_dsType = l->getSchema();
228 
229  //set input kernel parameters B
231 
232  kInParamsB->m_functionType = (te::sa::KernelFunctionType) m_ui->m_functionComboBoxB->itemData(m_ui->m_functionComboBoxB->currentIndex()).toInt();
233  kInParamsB->m_estimationType = (te::sa::KernelEstimationType) m_ui->m_estimationComboBoxB->itemData(m_ui->m_estimationComboBoxB->currentIndex()).toInt();
234  kInParamsB->m_useAdaptativeRadius = m_ui->m_useAdaptRadiusCheckBoxB->isChecked();
235 
236  if(!m_ui->m_useAdaptRadiusCheckBoxB->isChecked())
237  {
238  kInParamsB->m_radiusPercentValue = m_ui->m_radiusSpinBoxB->value();
239  }
240 
241  if(m_ui->m_useAttrLayerCheckBoxB->isChecked())
242  {
243  kInParamsB->m_intensityAttrName = m_ui->m_attrLayerComboBoxB->currentText().toStdString();
244  }
245 
246  kInParamsB->m_ds = l->getData();
247  kInParamsB->m_dsType = l->getSchema();
248 
249  //set output kernel parameters
251 
252  kOutParams->m_outputPath = m_ui->m_repositoryLineEdit->text().toStdString();
253  kOutParams->m_outputDataSetName = m_ui->m_newLayerNameLineEdit->text().toStdString();
254  kOutParams->m_combinationType = (te::sa::KernelCombinationType) m_ui->m_combinationComboBox->itemData(m_ui->m_combinationComboBox->currentIndex()).toInt();
255 
256  if(m_ui->m_gridRadioButton->isChecked())
257  {
258  if(m_ui->m_nColsLineEdit->text().isEmpty())
259  {
260  QMessageBox::information(this, tr("Warning"), tr("Define the number of columns to the output grid."));
261  return;
262  }
263 
264  kOutParams->m_storageType = te::sa::Grid;
265  kOutParams->m_nCols = m_ui->m_nColsLineEdit->text().toInt();
266  }
267  else if(m_ui->m_attrRadioButton->isChecked())
268  {
269  if(m_ui->m_attrNameLineEdit->text().isEmpty())
270  {
271  QMessageBox::information(this, tr("Warning"), tr("Define the attribute name to the output data."));
272  return;
273  }
274 
275  kOutParams->m_storageType = te::sa::Attribute;
276  kOutParams->m_outputAttrName = m_ui->m_attrNameLineEdit->text().toStdString();
277  }
278 
279  //progress
282 
283  QApplication::setOverrideCursor(Qt::WaitCursor);
284 
285  //execute kernel
286  try
287  {
289 
290  op.setInputParameters(kInParamsA, kInParamsB);
291  op.setOutputParameters(kOutParams);
292 
293  op.execute();
294  }
295  catch(const std::exception& e)
296  {
297  QMessageBox::warning(this, tr("Warning"), e.what());
298 
299  QApplication::restoreOverrideCursor();
300 
302 
303  return;
304  }
305  catch(...)
306  {
307  QMessageBox::warning(this, tr("Warning"), tr("Kernel Map internal error."));
308 
309  QApplication::restoreOverrideCursor();
310 
312 
313  return;
314  }
315 
316  QApplication::restoreOverrideCursor();
317 
319 
320  //save generated information
321  te::da::DataSourcePtr outputDataSource;
322 
323  std::string dataSetName = "";
324 
325  if(m_ui->m_gridRadioButton->isChecked())
326  {
327  outputDataSource = te::sa::CreateGDALDataSource(m_ui->m_repositoryLineEdit->text().toStdString(), m_ui->m_newLayerNameLineEdit->text().toStdString());
328 
329  dataSetName = m_ui->m_newLayerNameLineEdit->text().toStdString() + ".tif";
330  }
331  else if(m_ui->m_attrRadioButton->isChecked())
332  {
333  outputDataSource = te::sa::CreateOGRDataSource(m_ui->m_repositoryLineEdit->text().toStdString(), m_ui->m_newLayerNameLineEdit->text().toStdString());
334 
335  dataSetName = m_ui->m_newLayerNameLineEdit->text().toStdString();
336  }
337 
338  //create layer
339  m_outputLayer = te::sa::CreateLayer(outputDataSource, dataSetName);
340 
341  //create legend
342  if(m_ui->m_gridRadioButton->isChecked())
343  {
344  te::sa::CreateKernelColorMaping(m_outputLayer);
345  }
346  else if(m_ui->m_attrRadioButton->isChecked())
347  {
348  te::sa::CreateKernelGrouping(m_outputLayer, m_ui->m_attrNameLineEdit->text().toStdString());
349  }
350 
351  accept();
352 }
353 
355 {
356  m_ui->m_newLayerNameLineEdit->clear();
357  m_ui->m_repositoryLineEdit->clear();
358 
359  QString fileName = QFileDialog::getExistingDirectory(this, tr("Set output location..."));
360 
361  if (fileName.isEmpty())
362  return;
363 
364  m_ui->m_repositoryLineEdit->setText(fileName);
365 }
virtual void execute()
Function to execute the kernel operation.
Utility functions for the data access module.
TESAEXPORT void CreateKernelColorMaping(te::map::AbstractLayerPtr layer)
Definition: Utils.cpp:288
Class that represents the kernel input parameters.
Definition: KernelParams.h:54
boost::shared_ptr< DataSource > DataSourcePtr
Definition: DataSource.h:1435
TESAEXPORT te::da::DataSourcePtr CreateOGRDataSource(std::string repository)
Definition: Utils.cpp:63
KernelEstimationType
Definition: Enums.h:77
te::sa::KernelOutputType m_storageType
Kernel storage type.
Definition: KernelParams.h:117
void setInputParameters(te::sa::KernelInputParams *inParamsA, te::sa::KernelInputParams *inParamsB)
KernelCombinationType
Types of kernel combination.
Definition: Enums.h:89
TESAEXPORT te::da::DataSourcePtr CreateGDALDataSource(std::string path, std::string dataSetName)
Definition: Utils.cpp:95
Class that represents the kernel output parameters.
Definition: KernelParams.h:95
void setOutputParameters(te::sa::KernelOutputParams *outParams)
int m_radiusPercentValue
Attribute with radius percent value (m_useAdaptativeRadius must be false)
Definition: KernelParams.h:84
void setLayers(std::list< te::map::AbstractLayerPtr > layers)
Set the layer that can be used.
void onInputLayerComboBoxActivated(int index)
void removeViewer(int viewerId)
Dettach a progress viewer.
static ProgressManager & getInstance()
It returns a reference to the singleton instance.
te::sa::KernelFunctionType m_functionType
Kernel function type.
Definition: KernelParams.h:80
std::auto_ptr< te::da::DataSet > m_ds
Attribute with data set.
Definition: KernelParams.h:76
std::string m_outputAttrName
Attribute with the new attr name (if KernelOutputType is Attribute)
Definition: KernelParams.h:121
Q_DECLARE_METATYPE(te::map::AbstractLayerPtr)
te::sa::KernelCombinationType m_combinationType
Kernel combination type (used by ratio kernel)
Definition: KernelParams.h:118
int addViewer(AbstractProgressViewer *apv)
Attach a progress viewer.
std::string m_outputPath
Attribute with URI of the output file.
Definition: KernelParams.h:122
te::sa::KernelEstimationType m_estimationType
Kernel estimation type.
Definition: KernelParams.h:81
bool m_useAdaptativeRadius
Attribute to indicate if a an adaptative radius has to be used.
Definition: KernelParams.h:83
TESAEXPORT te::map::AbstractLayerPtr CreateLayer(te::da::DataSourcePtr ds, std::string dataSetName)
Definition: Utils.cpp:122
std::auto_ptr< Ui::KernelRatioDialogForm > m_ui
std::string m_outputDataSetName
Attribute that defines the output dataset name.
Definition: KernelParams.h:123
KernelFunctionType
Definition: Enums.h:63
std::auto_ptr< te::da::DataSetType > m_dsType
Attribute used to access the data set metadata.
Definition: KernelParams.h:75
A layer with reference to a dataset.
Definition: DataSetLayer.h:47
TESAEXPORT void CreateKernelGrouping(te::map::AbstractLayerPtr layer, std::string kernelAttr)
Definition: Utils.cpp:210
Class used to calculate the kernel ratio of a datasets.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
KernelRatioDialog(QWidget *parent=0, Qt::WindowFlags f=0)
std::string m_intensityAttrName
Attribute from dataset used as intensity attr (not obrigatory)
Definition: KernelParams.h:78
A dialog to calculate the kernel ratio of a datasets.
int m_nCols
Attribute with number of columns to create the grid (if KernelOutputType is Grid) ...
Definition: KernelParams.h:120
te::map::AbstractLayerPtr getOutputLayer()