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