27 #include "../../../rp/CloudDetection.h" 28 #include "../../../common/Exception.h" 29 #include "../../../common/progress/ProgressManager.h" 30 #include "../../../common/StringUtils.h" 31 #include "../../../core/translator/Translator.h" 32 #include "../../../dataaccess/datasource/DataSource.h" 33 #include "../../../dataaccess/datasource/DataSourceFactory.h" 34 #include "../../../dataaccess/datasource/DataSourceInfoManager.h" 35 #include "../../../dataaccess/datasource/DataSourceTransactor.h" 36 #include "../../../dataaccess/datasource/DataSourceManager.h" 37 #include "../../../dataaccess/utils/Utils.h" 38 #include "../../../geometry/GeometryProperty.h" 39 #include "../../../geometry/Utils.h" 40 #include "../../../maptools/Utils.h" 41 #include "../../../memory/DataSet.h" 42 #include "../../../memory/DataSetItem.h" 43 #include "../../../raster/RasterSummaryManager.h" 44 #include "../../../raster/Utils.h" 45 #include "../../../maptools/CanvasConfigurer.h" 46 #include "../../../se/serialization/xml/Symbolizer.h" 47 #include "../../../se/Symbolizer.h" 48 #include "../../../se/Utils.h" 49 #include "../../../xml/AbstractWriter.h" 50 #include "../../../xml/AbstractWriterFactory.h" 51 #include "../../../xml/Reader.h" 52 #include "../../../xml/ReaderFactory.h" 53 #include "../se/PolygonSymbolizerWidget.h" 54 #include "../../widgets/utils/FileDialog.h" 55 #include "../../widgets/datasource/selector/DataSourceSelectorDialog.h" 56 #include "../../widgets/canvas/Canvas.h" 57 #include "../../widgets/canvas/MapDisplay.h" 58 #include "../../widgets/layer/utils/DataSet2Layer.h" 59 #include "../../widgets/progress/ProgressViewerDialog.h" 60 #include "../../widgets/rp/RasterHistogramWidget.h" 61 #include "../../widgets/layer/search/LayerSearchDialog.h" 62 #include "../../widgets/layer/search/LayerSearchWidget.h" 63 #include "../../widgets/tools/ExtentAcquire.h" 64 #include "ui_CloudDetectionDialogForm.h" 68 #include <QFileDialog> 69 #include <QDialogButtonBox> 70 #include <QMessageBox> 73 #include <boost/filesystem.hpp> 74 #include <boost/uuid/random_generator.hpp> 75 #include <boost/uuid/uuid_io.hpp> 79 te::qt::widgets::CloudDetectionDialog::CloudDetectionDialog(
QWidget* parent, Qt::WindowFlags f)
81 m_ui(new
Ui::CloudDetectionDialogForm),
82 m_mapDisplay(
nullptr),
89 m_lastSelectedRow = -1;
92 m_ui->m_upToolButton->setIcon(QIcon::fromTheme(
"go-up"));
93 m_ui->m_downToolButton->setIcon(QIcon::fromTheme(
"go-down"));
94 m_ui->m_targetDatasourceToolButton->setIcon(QIcon::fromTheme(
"datasource"));
95 m_ui->m_styleToolButton->setIcon(QIcon::fromTheme(
"style"));
97 QGridLayout* displayLayout =
new QGridLayout(m_ui->m_navigatorWidget);
99 displayLayout->addWidget(m_navigator.get());
100 displayLayout->setContentsMargins(0,0,0,0);
102 m_ui->m_navigatorWidget->setEnabled(
false);
104 connect(m_ui->m_cloudLayerComboBox, SIGNAL(activated(
int)),
this, SLOT(onCloudLayerComboBoxActivated(
int)));
105 connect(m_ui->m_shadowLayerComboBox, SIGNAL(activated(
int)),
this, SLOT(onShadowLayerComboBoxActivated(
int)));
106 connect(m_ui->m_cloudSearchLayerToolButton, SIGNAL(clicked()),
this, SLOT(onSearchCloudLayerToolButtonClicked()));
107 connect(m_ui->m_shadowSearchLayerToolButton, SIGNAL(clicked()),
this, SLOT(onSearchShadowLayerToolButtonClicked()));
108 connect(m_ui->m_cloudBandComboBox, SIGNAL(activated(
int)),
this, SLOT(onCloudBandComboBoxActivated(
int)));
109 connect(m_ui->m_shadowBandComboBox, SIGNAL(activated(
int)),
this, SLOT(onShadowBandComboBoxActivated(
int)));
110 connect(m_ui->m_upToolButton, SIGNAL(clicked()),
this, SLOT(onUpToolButtonClicked()));
111 connect(m_ui->m_downToolButton, SIGNAL(clicked()),
this, SLOT(onDownToolButtonClicked()));
112 connect(m_ui->m_previewCheckBox, SIGNAL(toggled(
bool)),
this, SLOT(onPreviewCheckBoxToggled(
bool)));
113 connect(m_ui->m_targetDatasourceToolButton, SIGNAL(clicked()),
this, SLOT(onTargetDatasourceToolButtonClicked()));
114 connect(m_ui->m_targetFileToolButton, SIGNAL(clicked()),
this, SLOT(onTargetFileToolButtonClicked()));
115 connect(m_ui->m_okPushButton, SIGNAL(clicked()),
this, SLOT(onOkPushButtonClicked()));
116 connect(m_ui->m_styleToolButton, SIGNAL(clicked()),
this, SLOT(onStyleToolButtonClicked()));
118 connect(m_ui->m_tableWidget, SIGNAL(cellClicked(
int,
int)),
this, SLOT(onCellClicked(
int,
int)));
119 connect(m_ui->m_tableWidget, SIGNAL(cellDoubleClicked(
int,
int)),
this, SLOT(onCellDoubleClicked(
int,
int)));
120 connect(m_ui->m_tableWidget, SIGNAL(cellChanged(
int,
int)),
this, SLOT(onCellChanged(
int,
int)));
124 m_ui->m_filterTableWidget->setRowCount(2);
126 QCheckBox* checkBox1 =
new QCheckBox();
127 checkBox1->setParent(m_ui->m_filterTableWidget);
128 checkBox1->setChecked(
true);
129 m_ui->m_filterTableWidget->setCellWidget(0, 0, checkBox1);
130 QTableWidgetItem *item =
new QTableWidgetItem(QString(
"Opening"));
131 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
132 m_ui->m_filterTableWidget->setItem(0, 1, item);
133 QTableWidgetItem *item1 =
new QTableWidgetItem(QString(
"2"));
134 m_ui->m_filterTableWidget->setItem(0, 2, item1);
136 QCheckBox* checkBox2 =
new QCheckBox();
137 checkBox2->setParent(m_ui->m_filterTableWidget);
138 checkBox2->setChecked(
true);
139 m_ui->m_filterTableWidget->setCellWidget(1, 0, checkBox2);
140 QTableWidgetItem *item2 =
new QTableWidgetItem(QString(
"Closing"));
141 item2->setFlags(item2->flags() & ~Qt::ItemIsEditable);
142 m_ui->m_filterTableWidget->setItem(1, 1, item2);
143 QTableWidgetItem *item3 =
new QTableWidgetItem(QString(
"2"));
144 m_ui->m_filterTableWidget->setItem(1, 2, item3);
147 QGridLayout* histogramLayout =
new QGridLayout(m_ui->m_histWidget);
149 m_histogramWidget->setEnableTools(
true);
150 histogramLayout->addWidget(m_histogramWidget.get());
151 histogramLayout->setContentsMargins(0, 0, 0, 0);
153 #if (QT_VERSION >= 0x050000) 154 m_ui->m_filterTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
156 m_ui->m_filterTableWidget->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
159 m_ui->m_helpPushButton->setNameSpace(
"dpi.inpe.br.plugins");
160 m_ui->m_helpPushButton->setPageReference(
"plugins/rp/rp_cloudDetection.html");
173 QApplication::setOverrideCursor(Qt::WaitCursor);
175 std::list<te::map::AbstractLayerPtr>::iterator it = layers.begin();
177 while (it != layers.end())
179 std::unique_ptr<te::da::DataSetType> dsType = it->get()->getSchema();
180 if (dsType->hasRaster())
183 m_ui->m_cloudLayerComboBox->insertItem(i, it->get()->getTitle().c_str());
184 m_ui->m_shadowLayerComboBox->insertItem(i, it->get()->getTitle().c_str());
194 QTableWidgetItem *itemCloudMin =
new QTableWidgetItem(QString(
""));
195 itemCloudMin->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);
196 m_ui->m_tableWidget->setItem(0, 0, itemCloudMin);
197 QTableWidgetItem *itemCloudMax =
new QTableWidgetItem(QString(
""));
198 itemCloudMax->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);
199 m_ui->m_tableWidget->setItem(0, 1, itemCloudMax);
200 QTableWidgetItem *itemShadowMin =
new QTableWidgetItem(QString(
""));
201 itemShadowMin->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);
202 m_ui->m_tableWidget->setItem(1, 0, itemShadowMin);
203 QTableWidgetItem *itemShadowMax =
new QTableWidgetItem(QString(
""));
204 itemShadowMax->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);
205 m_ui->m_tableWidget->setItem(1, 1, itemShadowMax);
213 m_ui->m_tableWidget->setCurrentCell(0, 0);
215 m_ui->m_tableWidget->resizeColumnsToContents();
217 m_ui->m_tableWidget->selectRow(0);
219 #if (QT_VERSION >= 0x050000) 220 m_ui->m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
222 m_ui->m_tableWidget->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
227 QApplication::restoreOverrideCursor();
249 QString style = QString::fromUtf8(
m_userPath.c_str())+
"/styleCloudDetection.xml";
261 std::advance(l_front, index);
267 int row =
m_ui->m_tableWidget->currentRow();
272 m_ui->m_tableWidget->setCurrentCell(0, 0);
289 std::advance(l_front, index);
295 int row =
m_ui->m_tableWidget->currentRow();
300 m_ui->m_tableWidget->setCurrentCell(1, 0);
315 QApplication::setOverrideCursor(Qt::WaitCursor);
323 const std::complex<double>* cmin = rsMin->at(index).m_minVal;
324 const std::complex<double>* cmax = rsMax->at(index).m_maxVal;
325 double min = cmin->real();
326 double max = cmax->real();
334 int row =
m_ui->m_tableWidget->currentRow();
339 m_ui->m_tableWidget->setCurrentCell(0, 0);
351 QApplication::restoreOverrideCursor();
356 QApplication::setOverrideCursor(Qt::WaitCursor);
363 const std::complex<double>* cmin = rsMin->at(index).m_minVal;
364 const std::complex<double>* cmax = rsMax->at(index).m_maxVal;
365 double min = cmin->real();
366 double max = cmax->real();
374 int row =
m_ui->m_tableWidget->currentRow();
379 m_ui->m_tableWidget->setCurrentCell(1, 0);
391 QApplication::restoreOverrideCursor();
403 std::list<te::map::AbstractLayerPtr>::iterator it = layerList.begin();
407 std::list<te::map::AbstractLayerPtr>::iterator itLayer = std::find(
m_layers.begin(),
m_layers.end(), *it);
408 const int pos = std::distance(
m_layers.begin(), itLayer);
409 m_ui->m_cloudLayerComboBox->setCurrentIndex(pos);
425 std::list<te::map::AbstractLayerPtr>::iterator it = layerList.begin();
429 std::list<te::map::AbstractLayerPtr>::iterator itLayer = std::find(
m_layers.begin(),
m_layers.end(), *it);
430 const int pos = std::distance(
m_layers.begin(), itLayer);
431 m_ui->m_shadowLayerComboBox->setCurrentIndex(pos);
434 std::unique_ptr<te::da::DataSetType> dsType =
m_shadowLayer->getSchema();
436 std::unique_ptr<te::da::DataSet> dsRaster =
m_shadowLayer->getData();
437 std::unique_ptr<te::rst::Raster> raster = dsRaster->getRaster(rasterProp->
getName());
439 for (
int b = 0; b < static_cast<int>(raster->getNumberOfBands());
b++)
443 const std::complex<double>* cmin = rsMin->at(
b).m_minVal;
444 const std::complex<double>* cmax = rsMax->at(
b).m_maxVal;
446 double min = cmin->real();
447 double max = cmax->real();
460 if (
m_ui->m_filterTableWidget->currentRow() == -1)
462 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Please, select a entry first to move!"));
466 int row =
m_ui->m_filterTableWidget->currentRow();
468 if (row ==
m_ui->m_filterTableWidget->rowCount() - 1)
471 QTableWidgetItem *item1Col0 =
m_ui->m_filterTableWidget->takeItem(row, 0);
472 QTableWidgetItem *item1Col1 =
m_ui->m_filterTableWidget->takeItem(row, 1);
473 QTableWidgetItem *item1Col2 =
m_ui->m_filterTableWidget->takeItem(row, 2);
474 QTableWidgetItem *item2Col0 =
m_ui->m_filterTableWidget->takeItem(row + 1, 0);
475 QTableWidgetItem *item2Col1 =
m_ui->m_filterTableWidget->takeItem(row + 1, 1);
476 QTableWidgetItem *item2Col2 =
m_ui->m_filterTableWidget->takeItem(row + 1, 2);
478 m_ui->m_filterTableWidget->setItem(row, 0, item2Col0);
479 m_ui->m_filterTableWidget->setItem(row, 1, item2Col1);
480 m_ui->m_filterTableWidget->setItem(row, 2, item2Col2);
481 m_ui->m_filterTableWidget->setItem(row + 1, 0, item1Col0);
482 m_ui->m_filterTableWidget->setItem(row + 1, 1, item1Col1);
483 m_ui->m_filterTableWidget->setItem(row + 1, 2, item1Col2);
488 if (
m_ui->m_filterTableWidget->currentRow() == -1)
490 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Please, select a entry first to move!"));
494 int row =
m_ui->m_filterTableWidget->currentRow();
499 QTableWidgetItem *item1Col0 =
m_ui->m_filterTableWidget->takeItem(row, 0);
500 QTableWidgetItem *item1Col1 =
m_ui->m_filterTableWidget->takeItem(row, 1);
501 QTableWidgetItem *item1Col2 =
m_ui->m_filterTableWidget->takeItem(row, 2);
502 QTableWidgetItem *item2Col0 =
m_ui->m_filterTableWidget->takeItem(row - 1, 0);
503 QTableWidgetItem *item2Col1 =
m_ui->m_filterTableWidget->takeItem(row - 1, 1);
504 QTableWidgetItem *item2Col2 =
m_ui->m_filterTableWidget->takeItem(row - 1, 2);
506 m_ui->m_filterTableWidget->setItem(row, 0, item2Col0);
507 m_ui->m_filterTableWidget->setItem(row, 1, item2Col1);
508 m_ui->m_filterTableWidget->setItem(row, 2, item2Col2);
509 m_ui->m_filterTableWidget->setItem(row - 1, 0, item1Col0);
510 m_ui->m_filterTableWidget->setItem(row - 1, 1, item1Col1);
511 m_ui->m_filterTableWidget->setItem(row - 1, 2, item1Col2);
518 m_ui->m_navigatorWidget->setEnabled(
true);
523 m_ui->m_navigatorWidget->setEnabled(
false);
546 m_lastText =
m_ui->m_tableWidget->item(row, column)->text().toUtf8().data();
551 if (!isdigit(*
m_ui->m_tableWidget->item(row, column)->text().toUtf8().data()))
553 m_ui->m_tableWidget->item(row, column)->setText(
m_lastText.c_str());
570 m_lastText =
m_ui->m_filterTableWidget->item(row, column)->text().toUtf8().data();
578 if (!isdigit(*
m_ui->m_filterTableWidget->item(row, column)->text().toUtf8().data()))
580 m_ui->m_filterTableWidget->item(row, column)->setText(
m_lastText.c_str());
587 m_ui->m_newLayerNameLineEdit->clear();
588 m_ui->m_newLayerNameLineEdit->setEnabled(
true);
592 std::list<te::da::DataSourceInfoPtr> dsPtrList = dlg.
getSelecteds();
594 if (dsPtrList.empty())
597 std::list<te::da::DataSourceInfoPtr>::iterator it = dsPtrList.begin();
599 m_ui->m_repositoryLineEdit->setText(QString(it->get()->getTitle().c_str()));
604 m_ui->m_newLayerNameLineEdit->clear();
605 m_ui->m_repositoryLineEdit->clear();
615 QMessageBox::warning(
this, tr(
"File information"), ex.
what());
620 QMessageBox::warning(
this, tr(
"File information"), tr(
"Output layer is invalid."));
624 m_ui->m_newLayerNameLineEdit->setText(fileDialog.
getFileName().c_str());
625 m_ui->m_repositoryLineEdit->setText(fileDialog.
getPath().c_str());
627 m_ui->m_newLayerNameLineEdit->setEnabled(
false);
632 if (!
m_ui->m_previewCheckBox->isChecked() || !env.
isValid())
639 bool needRemap =
false;
640 if (
m_ui->m_tableWidget->currentRow() == 0)
645 else if (
m_ui->m_tableWidget->currentRow() == 1)
660 if (
m_ui->m_tableWidget->currentRow() == 0)
662 else if (
m_ui->m_tableWidget->currentRow() == 1)
671 QMessageBox::warning(
this, tr(
"Warning"), tr(
"ROI is invalid."));
676 QMessageBox::warning(
this, tr(
"Warning"), tr(
"ROI is invalid."));
691 if(
m_ui->m_previewCheckBox->isChecked())
698 if (
m_ui->m_newLayerNameLineEdit->text().isEmpty())
700 QMessageBox::information(
this, tr(
"Cloud Detection"), tr(
"Output image is not defined."));
715 QBoxLayout* layout =
new QBoxLayout(QBoxLayout::TopToBottom, dialog);
717 QDialogButtonBox* bbox =
new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, dialog);
727 layout->addWidget(symbWidget);
728 layout->addWidget(bbox);
730 connect(bbox, SIGNAL(accepted()), dialog, SLOT(accept()));
731 connect(bbox, SIGNAL(rejected()), dialog, SLOT(reject()));
733 if(dialog->exec() == QDialog::Rejected)
744 QString path = QString::fromStdString(
m_userPath)+
"/styleCloudDetection.xml";
746 writer->setURI(path.toUtf8().data());
748 writer->writeStartDocument(
"UTF-8",
"no");
750 writer->writeStartElement(
"PolygonSymbolizer");
752 writer->writeAttribute(
"xmlns",
"http://www.opengis.net/sld");
753 writer->writeAttribute(
"xmlns:ogc",
"http://www.opengis.net/ogc");
754 writer->writeAttribute(
"xmlns:se",
"http://www.opengis.net/se");
755 writer->writeAttribute(
"xmlns:xlink",
"http://www.w3.org/1999/xlink");
756 writer->writeAttribute(
"xmlns:xsi",
"http://www.w3.org/2001/XMLSchema-instance");
757 writer->writeAttribute(
"xsi:schemaLocation",
"http://www.opengis.net/sld PolygonSymbolizer.xsd");
763 writer->writeEndElement(
"PolygonSymbolizer");
765 writer->writeToFile();
771 reader->setValidationScheme(
false);
773 QString path = QString::fromStdString(
m_userPath)+
"/styleCloudDetection.xml";
775 reader->read(path.toUtf8().data());
779 (reader->getElementLocalName() ==
"PolygonSymbolizer"))
793 if (!cloudRst->getExtent()->intersects(*shadowRst->getExtent()))
795 QMessageBox::warning(
this, tr(
"Cloud Detection"), tr(
"Input layers don't intersect!"));
799 if ((cloudRst->getNumberOfColumns() != shadowRst->getNumberOfColumns()) ||
800 (cloudRst->getNumberOfRows() != shadowRst->getNumberOfRows()))
802 QMessageBox::warning(
this, tr(
"Cloud Detection"), tr(
"Input layers has diferents sizes!"));
806 int cloudBand =
m_ui->m_cloudBandComboBox->currentText().toUtf8().toInt();
807 int shadowBand =
m_ui->m_shadowBandComboBox->currentText().toUtf8().toInt();
809 double minCloud = atof(
m_ui->m_tableWidget->item(0, 0)->text().toUtf8().data());
810 double maxCloud = atof(
m_ui->m_tableWidget->item(0, 1)->text().toUtf8().data());
811 double minShadow = atof(
m_ui->m_tableWidget->item(1, 0)->text().toUtf8().data());
812 double maxShadow = atof(
m_ui->m_tableWidget->item(1, 1)->text().toUtf8().data());
814 std::vector<te::rp::Filter::InputParameters::FilterType> vecFilter;
815 std::vector<int> vecIt;
817 int nrows =
m_ui->m_filterTableWidget->rowCount();
819 for (
int i = 0; i < nrows; i++)
821 if (!dynamic_cast<QCheckBox*>(
m_ui->m_filterTableWidget->cellWidget(i, 0))->isChecked())
824 std::string filter =
m_ui->m_filterTableWidget->item(i, 1)->text().toUtf8().data();
825 int nIt =
m_ui->m_filterTableWidget->item(i, 2)->text().toUtf8().toInt();
829 vecFilter.push_back(te::rp::Filter::InputParameters::FilterType::ErosionFilterT);
830 vecIt.push_back(nIt);
832 vecFilter.push_back(te::rp::Filter::InputParameters::FilterType::DilationFilterT);
833 vecIt.push_back(nIt);
837 vecFilter.push_back(te::rp::Filter::InputParameters::FilterType::DilationFilterT);
838 vecIt.push_back(nIt);
840 vecFilter.push_back(te::rp::Filter::InputParameters::FilterType::ErosionFilterT);
841 vecIt.push_back(nIt);
849 QApplication::setOverrideCursor(Qt::WaitCursor);
852 te::rst::Raster* raster = cloudDetection->executeCloudDetection(cloudRst.get(), shadowRst.get(), cloudBand, shadowBand,
853 minCloud, maxCloud, minShadow, maxShadow, vecFilter, vecIt);
856 std::string outputdataset =
m_ui->m_newLayerNameLineEdit->text().toUtf8().data();
858 if (outputdataset.empty())
860 QApplication::restoreOverrideCursor();
861 QMessageBox::warning(
this, tr(
"Vectorizer"), tr(
"Output dataset name not defined."));
865 std::string uriStr =
m_ui->m_repositoryLineEdit->text().toUtf8().data();
869 QApplication::restoreOverrideCursor();
870 QMessageBox::warning(
this, tr(
"Vectorizer"), tr(
"Output repository name not defined."));
877 boost::filesystem::path uri(uriStr);
879 std::size_t idx = outputdataset.find(
".");
880 if (idx != std::string::npos)
881 outputdataset = outputdataset.substr(0, idx);
883 std::string dsinfo(
"file://" + uri.string());
886 boost::uuids::basic_random_generator<boost::mt19937> gen;
887 boost::uuids::uuid u = gen();
888 std::string
id = boost::uuids::to_string(u);
891 ds->setConnInfo(dsinfo);
892 ds->setTitle(uri.stem().string());
893 ds->setAccessDriver(
"OGR");
895 ds->setDescription(uri.string());
902 std::vector<te::gm::Geometry*> geomVec;
903 std::vector< double > geomsValues;
906 if (!
vectorize(raster, geomVec, geomsValues))
908 QApplication::restoreOverrideCursor();
915 std::unique_ptr<te::mem::DataSet> dsMem =
createDataSet(dsType.get(), geomVec, geomsValues);
919 saveDataSet(dsMem.get(), dsType.get(), dataSource, outputdataset);
934 QApplication::restoreOverrideCursor();
935 QMessageBox::warning(
this, tr(
"Cloud Detection"), e.
what());
939 QApplication::restoreOverrideCursor();
949 unsigned int band = 0;
950 unsigned int maxGeom = 0;
955 QApplication::setOverrideCursor(Qt::WaitCursor);
960 raster->
vectorize(geomVec, band, maxGeom, &geomsValues);
962 catch (
const std::exception& e)
964 QMessageBox::warning(
this, tr(
"Vectorizer"), e.what());
966 QApplication::restoreOverrideCursor();
972 QMessageBox::warning(
this, tr(
"Vectorizer"), tr(
"An exception has occurred!"));
974 QApplication::restoreOverrideCursor();
979 QApplication::restoreOverrideCursor();
986 m_ui->m_cloudBandComboBox->clear();
992 for (
int b = 0; b < static_cast<int>(
m_cloudRaster->getNumberOfBands());
b++)
1003 const std::complex<double>* cmin = rsMin->at(0).m_minVal;
1004 const std::complex<double>* cmax = rsMax->at(0).m_maxVal;
1005 double min = cmin->real();
1006 double max = cmax->real();
1014 m_ui->m_shadowBandComboBox->clear();
1020 for (
int b = 0; b < static_cast<int>(
m_shadowRaster->getNumberOfBands());
b++)
1031 const std::complex<double>* cmin = rsMin->at(0).m_minVal;
1032 const std::complex<double>* cmax = rsMax->at(0).m_maxVal;
1033 double min = cmin->real();
1034 double max = cmax->real();
1043 m_ui->m_tableWidget->item(0, 0)->setText(QString(vmin.c_str()));
1046 m_ui->m_tableWidget->item(0, 1)->setText(QString(vmax.c_str()));
1052 m_ui->m_tableWidget->item(1, 0)->setText(QString(vmin.c_str()));
1055 m_ui->m_tableWidget->item(1, 1)->setText(QString(vmax.c_str()));
1060 int i =
m_ui->m_tableWidget->currentRow();
1065 QApplication::setOverrideCursor(Qt::WaitCursor);
1072 bandIdx =
m_ui->m_cloudBandComboBox->currentIndex();
1074 bandIdx =
m_ui->m_shadowBandComboBox->currentIndex();
1076 double min =
m_ui->m_tableWidget->item(i, 0)->text().toDouble();
1077 double max =
m_ui->m_tableWidget->item(i, 1)->text().toDouble();
1084 QApplication::restoreOverrideCursor();
1092 QApplication::setOverrideCursor(Qt::WaitCursor);
1096 QApplication::restoreOverrideCursor();
1097 QMessageBox::warning(
this, tr(
"Cloud Detection"), tr(
"Input layers don't intersect!"));
1104 QApplication::restoreOverrideCursor();
1105 QMessageBox::warning(
this, tr(
"Cloud Detection"), tr(
"Input layers has diferents sizes!"));
1109 int cloudBand =
m_ui->m_cloudBandComboBox->currentText().toUtf8().toInt();
1110 int shadowBand =
m_ui->m_shadowBandComboBox->currentText().toUtf8().toInt();
1112 double minCloud = atof(
m_ui->m_tableWidget->item(0, 0)->text().toUtf8().data());
1113 double maxCloud = atof(
m_ui->m_tableWidget->item(0, 1)->text().toUtf8().data());
1114 double minShadow = atof(
m_ui->m_tableWidget->item(1, 0)->text().toUtf8().data());
1115 double maxShadow = atof(
m_ui->m_tableWidget->item(1, 1)->text().toUtf8().data());
1117 std::vector<te::rp::Filter::InputParameters::FilterType> vecFilter;
1118 std::vector<int> vecIt;
1120 int nrows =
m_ui->m_filterTableWidget->rowCount();
1122 for (
int i = 0; i < nrows; i++)
1124 if (!dynamic_cast<QCheckBox*>(
m_ui->m_filterTableWidget->cellWidget(i, 0))->isChecked())
1129 std::string filter =
m_ui->m_filterTableWidget->item(i, 1)->text().toUtf8().data();
1130 int nIt =
m_ui->m_filterTableWidget->item(i, 2)->text().toUtf8().toInt();
1134 vecFilter.push_back(te::rp::Filter::InputParameters::FilterType::ErosionFilterT);
1135 vecIt.push_back(nIt);
1137 vecFilter.push_back(te::rp::Filter::InputParameters::FilterType::DilationFilterT);
1138 vecIt.push_back(nIt);
1142 vecFilter.push_back(te::rp::Filter::InputParameters::FilterType::DilationFilterT);
1143 vecIt.push_back(nIt);
1145 vecFilter.push_back(te::rp::Filter::InputParameters::FilterType::ErosionFilterT);
1146 vecIt.push_back(nIt);
1156 minCloud, maxCloud, minShadow, maxShadow, vecFilter, vecIt);
1159 std::vector<te::gm::Geometry*> geomVec;
1160 std::vector< double > geomsValues;
1163 if (!
vectorize(raster, geomVec, geomsValues))
1165 QApplication::restoreOverrideCursor();
1171 if (
m_ui->m_previewCheckBox->isChecked())
1197 for(std::size_t i = 0; i < geomVec.size(); ++i)
1202 canvasInstance->
draw(geomVec[i]);
1207 delete canvasInstance;
1215 QApplication::restoreOverrideCursor();
1216 QMessageBox::warning(
this, tr(
"Cloud Detection"), e.
what());
1220 QApplication::restoreOverrideCursor();
1241 delete canvasInstance;
1248 QApplication::setOverrideCursor(Qt::WaitCursor);
1254 bool needRemap =
false;
1270 std::unique_ptr<te::da::DataSetType> dsType =
m_cloudLayer->getSchema();
1273 std::unique_ptr<te::da::DataSet> dsRaster =
m_cloudLayer->getData();
1275 std::unique_ptr<te::rst::Raster> raster = dsRaster->getRaster(rasterProp->
getName());
1277 std::map<std::string, std::string> infoCloud;
1278 infoCloud[
"FORCE_MEM_DRIVER"] =
"TRUE";
1301 raster = dsRaster->getRaster(rasterProp->
getName());
1303 std::map<std::string, std::string> infoShadow;
1304 infoShadow[
"FORCE_MEM_DRIVER"] =
"TRUE";
1308 if (
m_ui->m_previewCheckBox->isChecked())
1313 QApplication::restoreOverrideCursor();
1323 dsType->add(idProperty);
1327 dsType->add(geomProperty);
1330 std::string pkName =
"pk_id";
1331 pkName +=
"_" + dataSetName;
1333 pk->
add(idProperty);
1338 std::unique_ptr<te::mem::DataSet>
1341 std::vector<double>& )
1345 for (std::size_t t = 0; t < geoms.size(); ++t)
1367 std::map<std::string, std::string> options;
1369 ds->createDataSet(dsType, options);
1371 ds->add(dataSetName, dataSet, options);
1378 canvasInstance.
clear();
TEDATAACCESSEXPORT DataSourcePtr GetDataSource(const std::string &datasourceId, const bool opened=true)
Search for a data source with the informed id in the DataSourceManager.
TEDATAACCESSEXPORT te::rst::RasterProperty * GetFirstRasterProperty(const DataSetType *dt)
virtual void vectorize(std::vector< te::gm::Geometry * > &g, std::size_t b, unsigned int mp=0, std::vector< double > *const polygonsValues=0)
Vectorizes a given raster band, using GDALPolygonize function.
void add(te::dt::Property *p)
It adds a property to the list of properties of the primary key.
void setGeometry(std::size_t i, te::gm::Geometry *value)
It sets the value of the i-th property.
bool intersects(const Envelope &rhs) const
It returns true if the envelopes "spatially intersects".
boost::shared_ptr< DataSetType > DataSetTypePtr
An atomic property like an integer or double.
A PolygonSymbolizer is used to draw a polygon (or other area-type geometries), including filling its ...
boost::shared_ptr< DataSource > DataSourcePtr
std::string Convert2LCase(const std::string &value)
It converts a string to lower case.
#define TE_UNKNOWN_SRS
A numeric value to represent a unknown SRS identification in TerraLib.
A class that models the description of a dataset.
virtual const char * what() const
It outputs the exception message.
const double & getUpperRightX() const
It returns a constant refernce to the x coordinate of the upper right corner.
const std::string & getVersion() const
static te::xml::AbstractWriter * make()
It creates a new XML writer using the dafault implementation.
double m_urx
Upper right corner x-coordinate.
#define TE_OPAQUE
For an RGBA color this is the value of the alpha-channel for totally opaque.
const double & getLowerLeftY() const
It returns a constant refernce to the y coordinate of the lower left corner.
static te::dt::Date ds(2010, 01, 01)
static te::xml::Reader * make()
It creates a new XML reader using the dafault implementation.
const double & getUpperRightY() const
It returns a constant refernce to the x coordinate of the upper right corner.
Q_DECLARE_METATYPE(te::map::AbstractLayerPtr) te
void setInt32(std::size_t i, boost::int32_t value)
It sets the value of the i-th property.
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
double m_llx
Lower left corner x-coordinate.
static RasterSummaryManager & getInstance()
It returns a reference to the singleton instance.
An Envelope defines a 2D rectangular region.
An abstract class for raster data strucutures.
virtual int getSRID() const
It return the Spatial Reference System used by the Map Display.
This class provide cloud detection.
static te::dt::TimeDuration dt(20, 30, 50, 11)
virtual const te::gm::Envelope & getExtent() const
It returns the world extent showned by the MapDisplay.
boost::ptr_vector< BandSummary > RasterSummary
RasterSummary is just a typedef of a boost::ptr_vector.
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
double m_lly
Lower left corner y-coordinate.
bool moveBeforeFirst()
It moves the internal pointer to a position before the first item in the collection.
A Converter is responsible for the conversion of coordinates between different Coordinate Systems (CS...
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
TEMAPEXPORT te::rst::Raster * GetRaster(AbstractLayer *layer)
It gets the raster referenced by the given data set layer.
int getSRID() const
Returns the raster spatial reference system identifier.
double m_ury
Upper right corner y-coordinate.
It describes a primary key (pk) constraint.
const double & getLowerLeftX() const
It returns a constant reference to the x coordinate of the lower left corner.
A helper class for 32-bit RGBA (Red-Green-Blue-Alpha channel) color.
A class that represents a data source component.
std::string Convert2String(boost::int16_t value)
It converts a short integer value to a string.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
bool isValid() const
It tells if the rectangle is valid or not.
file(WRITE ${CMAKE_BINARY_DIR}/config_qhelp.cmake"configure_file (${TERRALIB_ABSOLUTE_ROOT_DIR}/doc/qhelp/help.qhcp.in ${CMAKE_BINARY_DIR}/share/terraview/help/help.qhcp @ONLY)") add_custom_command(OUTPUT del_dir COMMAND $
TEGEOMEXPORT Geometry * GetGeomFromEnvelope(const Envelope *const e, int srid)
It creates a Geometry (a polygon) from the given envelope.
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
const std::string & getName() const
It returns the property name.