27 #include "../../core/filesystem/FileSystem.h" 28 #include "../../core/translator/Translator.h" 29 #include "../../common/Exception.h" 30 #include "../../common/progress/ProgressManager.h" 31 #include "../../dataaccess/datasource/DataSourceFactory.h" 32 #include "../../dataaccess/datasource/DataSourceInfoManager.h" 33 #include "../../dataaccess/datasource/DataSourceManager.h" 34 #include "../../dataaccess/utils/Utils.h" 35 #include "../../geometry/GeometryProperty.h" 36 #include "../../mnt/core/CreateIsolinesCore.h" 37 #include "../../mnt/core/TINCreateIsolines.h" 38 #include "../../mnt/core/Utils.h" 39 #include "../../qt/widgets/datasource/selector/DataSourceSelectorDialog.h" 40 #include "../../qt/widgets/layer/utils/DataSet2Layer.h" 41 #include "../../qt/widgets/progress/ProgressViewerDialog.h" 42 #include "../../qt/widgets/srs/SRSManagerDialog.h" 43 #include "../../qt/widgets/utils/FileDialog.h" 44 #include "../../raster.h" 45 #include "../../srs/SpatialReferenceSystemManager.h" 46 #include "../../statistics/core/Utils.h" 47 #include "../../mnt/core/Utils.h" 51 #include "ui_CreateIsolinesDialogForm.h" 54 #include <QFileDialog> 55 #include <QMessageBox> 58 #include <boost/algorithm/string.hpp> 59 #include <boost/filesystem.hpp> 60 #include <boost/lexical_cast.hpp> 61 #include <boost/uuid/random_generator.hpp> 62 #include <boost/uuid/uuid_io.hpp> 66 m_ui(new
Ui::CreateIsolinesDialogForm),
76 m_ui->m_insertpushButton->setIcon(QIcon::fromTheme(
"mnt-isolines-right"));
77 m_ui->m_deletepushButton->setIcon(QIcon::fromTheme(
"mnt-isolines-left"));
78 m_ui->m_deleteallpushButton->setIcon(QIcon::fromTheme(
"mnt-isolines-left_all"));
84 connect(
m_ui->m_dummycheckBox, SIGNAL(toggled(
bool)),
m_ui->m_dummylineEdit, SLOT(setEnabled(
bool)));
94 m_ui->m_targetDatasourceToolButton->setIcon(QIcon::fromTheme(
"datasource"));
101 m_ui->m_helpPushButton->setNameSpace(
"dpi.inpe.br.plugins");
102 m_ui->m_helpPushButton->setPageReference(
"plugins/mnt/DTM_MainIsolines.html");
104 m_ui->m_srsToolButton->setIcon(QIcon::fromTheme(
"srs"));
107 m_ui->m_stepFixedradioButton->click();
119 std::list<te::map::AbstractLayerPtr>::iterator it =
m_layers.begin();
125 if (it->get()->isValid())
127 std::unique_ptr<te::da::DataSetType> dsType(it->get()->getSchema());
133 m_ui->m_layersComboBox->addItem(QString(it->get()->getTitle().c_str()), QVariant(it->get()->getId().c_str()));
138 m_ui->m_layersComboBox->addItem(QString(it->get()->getTitle().c_str()), QVariant(it->get()->getId().c_str()));
149 std::vector<double> result;
153 std::vector<size_t> index_selected;
154 std::vector<std::size_t> type;
156 for (
size_t p = 0;
p < propName.size(); ++
p)
159 index_selected.push_back(index);
166 for (
size_t i = 0; i < index_selected.size(); ++i)
168 index = index_selected[i];
169 if (!dataSet->
isNull(propName[i]))
176 numval = (double)dataSet->
getInt64(index);
182 numval = boost::lexical_cast<
double>(dataSet->
getNumeric(index));
183 result.push_back(numval);
193 std::unique_ptr<te::da::DataSet> dataquery;
194 std::vector<te::gm::Polygon *> vp;
196 vmin = std::numeric_limits<double>::max();
199 std::unique_ptr<te::da::DataSetType> dsType =
m_inputLayer->getSchema();
200 std::vector<te::dt::Property*> props = dsType->getProperties();
202 std::unique_ptr<te::da::DataSet> inDset = ds->getDataSet(
m_inputLayer->getDataSetName());
206 inDset->moveBeforeFirst();
207 while (inDset->moveNext())
209 std::unique_ptr<te::gm::Geometry> gin = inDset->getGeometry(geo_pos);
213 switch (gin->getGeomTypeId())
220 vp.push_back(dynamic_cast<te::gm::Polygon*>(gin->clone()));
233 for (std::size_t i = 0; i < np; i++)
234 vp.push_back(dynamic_cast<te::gm::Polygon*>(dynamic_cast<te::gm::GeometryCollection*>(mg)->getGeometryN(i)->clone()));
263 for (std::size_t i = 0; i < vp.size(); ++i)
268 if (lr->
getZ(0) < std::numeric_limits<double>::max())
270 if (vmin > lr->
getZ(0))
272 if (vmax < lr->getZ(0))
275 if (lr->
getZ(1) < std::numeric_limits<double>::max())
277 if (vmin > lr->
getZ(1))
279 if (vmax < lr->getZ(1))
282 if (lr->
getZ(2) < std::numeric_limits<double>::max())
284 if (vmin > lr->
getZ(2))
286 if (vmax < lr->getZ(2))
293 std::cerr <<
"CreateIsolinesDialog::getMinMax: " << e.
what() <<
'\n';
294 QMessageBox::information(
this,
"CreateIsolines", e.
what());
298 for (
size_t i = 0; i < vp.size(); ++i)
307 QList<mntType> types;
311 if (search.exec() != QDialog::Accepted)
316 int index =
m_ui->m_layersComboBox->findText(search.
getLayer().get()->getTitle().c_str());
317 m_ui->m_layersComboBox->setCurrentIndex(index);
323 QApplication::setOverrideCursor(Qt::WaitCursor);
325 std::list<te::map::AbstractLayerPtr>::iterator it =
m_layers.begin();
326 std::string layerID =
m_ui->m_layersComboBox->itemData(index, Qt::UserRole).toString().toUtf8().data();
329 if(layerID == it->get()->getId())
335 std::unique_ptr<te::da::DataSetType> dsType =
m_inputLayer->getSchema();
336 std::unique_ptr<te::da::DataSet> inds =
m_inputLayer->getData();
337 if (dsType->hasGeom())
341 m_ui->m_dummycheckBox->setVisible(
false);
342 m_ui->m_dummylineEdit->setVisible(
false);
344 if (dsType->hasRaster())
348 std::unique_ptr<te::rst::Raster> inputRst(inds->getRaster(rpos).release());
351 m_ui->m_dummycheckBox->setVisible(
true);
352 m_ui->m_dummylineEdit->setVisible(
true);
353 m_ui->m_dummylineEdit->setText(QString::number(inputRst->getBand(0)->getProperty()->m_noDataValue));
354 m_dummy = inputRst->getBand(0)->getProperty()->m_noDataValue;
361 m_ui->m_vminrasterlineEdit->setText(QString::number(
m_min));
362 m_ui->m_vmaxrasterlineEdit->setText(QString::number(
m_max));
364 QApplication::restoreOverrideCursor();
368 QApplication::restoreOverrideCursor();
369 std::cerr <<
"CreateIsolines: " << e.
what() <<
'\n';
370 QMessageBox::information(
this,
"CreateIsolines", e.
what());
376 m_dummy =
m_ui->m_dummylineEdit->text().toDouble();
379 std::unique_ptr<te::da::DataSet> inds =
m_inputLayer->getData();
381 std::unique_ptr<te::rst::Raster> inputRst(inds->getRaster(rpos).release());
382 inputRst->getBand(0)->getProperty()->m_noDataValue =
m_dummy;
383 m_min = inputRst.get()->getBand(0)->getMinValue(
true, 0, 0, inputRst->getNumberOfRows() - 1, inputRst->getNumberOfColumns() - 1).real();
384 m_max = inputRst.get()->getBand(0)->getMaxValue(
true, 0, 0, inputRst->getNumberOfRows() - 1, inputRst->getNumberOfColumns() - 1).real();
385 m_ui->m_vminrasterlineEdit->setText(QString::number(
m_min));
386 m_ui->m_vmaxrasterlineEdit->setText(QString::number(
m_max));
393 m_ui->m_vmaxlineEdit->setEnabled(
true);
394 m_ui->m_vminlineEdit->setEnabled(
true);
395 m_ui->m_steplineEdit->setEnabled(
true);
396 m_ui->m_valuelineEdit->setEnabled(
false);
397 m_ui->m_vmaxlabel->setEnabled(
true);
398 m_ui->m_vminlabel->setEnabled(
true);
399 m_ui->m_steplabel->setEnabled(
true);
400 m_ui->m_valuelabel->setEnabled(
false);
401 m_ui->m_guidelinescheckBox->setEnabled(
true);
406 m_ui->m_vmaxlineEdit->setEnabled(
false);
407 m_ui->m_vminlineEdit->setEnabled(
false);
408 m_ui->m_steplineEdit->setEnabled(
false);
409 m_ui->m_valuelineEdit->setEnabled(
true);
410 m_ui->m_vmaxlabel->setEnabled(
false);
411 m_ui->m_vminlabel->setEnabled(
false);
412 m_ui->m_steplabel->setEnabled(
false);
413 m_ui->m_valuelabel->setEnabled(
true);
414 m_ui->m_guidelinescheckBox->setChecked(
false);
415 m_ui->m_guidelinescheckBox->setEnabled(
false);
420 if (
m_ui->m_stepFixedradioButton->isChecked())
422 double min =
m_ui->m_vminlineEdit->text().toDouble();
423 double max =
m_ui->m_vmaxlineEdit->text().toDouble();
424 double step =
m_ui->m_steplineEdit->text().toDouble();
427 QMessageBox::information(
this, tr(
"Create Isolines"), tr(
"Step value is invalid!"));
431 for (
double val = min; val <= max; val += step)
433 QListWidgetItem *item =
new QListWidgetItem();
434 item->setData(Qt::DisplayRole, val);
435 m_ui->m_isolineslistWidget->addItem(item);
440 double val =
m_ui->m_valuelineEdit->text().toDouble();
441 if (val < m_min || val >
m_max)
443 QMessageBox::information(
this, tr(
"Create Isolines"), tr(
"Value is invalid!"));
446 QListWidgetItem *item =
new QListWidgetItem();
447 item->setData(Qt::DisplayRole, val);
448 m_ui->m_isolineslistWidget->addItem(item);
454 QListWidgetItem *rem =
m_ui->m_isolineslistWidget->takeItem(
m_ui->m_isolineslistWidget->currentRow());
461 m_ui->m_isolineslistWidget->clear();
477 m_ui->m_newLayerNameLineEdit->clear();
478 m_ui->m_newLayerNameLineEdit->setEnabled(
true);
482 std::list<te::da::DataSourceInfoPtr> dsPtrList = dlg.
getSelecteds();
484 if (dsPtrList.empty())
487 std::list<te::da::DataSourceInfoPtr>::iterator it = dsPtrList.begin();
489 m_ui->m_repositoryLineEdit->setText(QString(it->get()->getTitle().c_str()));
498 m_ui->m_newLayerNameLineEdit->clear();
499 m_ui->m_repositoryLineEdit->clear();
506 catch (
const std::exception& e)
508 QMessageBox::information(
this, tr(
"Create Isolines"), e.what());
512 m_ui->m_repositoryLineEdit->setText(fileDialog.
getPath().c_str());
513 m_ui->m_newLayerNameLineEdit->setText(fileDialog.
getFileName().c_str());
516 m_ui->m_newLayerNameLineEdit->setEnabled(
false);
526 QApplication::setOverrideCursor(Qt::WaitCursor);
536 if (!inDataSource.get())
540 std::unique_ptr<te::da::DataSetType> inDsetType(inDataSource->getDataSetType(inDsetName));
543 if (
m_ui->m_repositoryLineEdit->text().isEmpty())
546 if (
m_ui->m_newLayerNameLineEdit->text().isEmpty())
549 std::string outputdataset =
m_ui->m_newLayerNameLineEdit->text().toUtf8().data();
550 std::string outdsinfo(
"file://");
551 boost::filesystem::path uri(
m_ui->m_repositoryLineEdit->text().toUtf8().data());
560 std::size_t idx = outputdataset.find(
".");
561 if (idx != std::string::npos)
562 outputdataset = outputdataset.substr(0, idx);
564 outdsinfo += uri.string();
567 std::vector<double> val;
568 std::vector<double> guideval;
570 double step =
m_ui->m_steplineEdit->text().toDouble(&ok);
574 double gLineValue =
m_ui->m_isolineslistWidget->item(0)->text().toDouble() + step * 5;
576 for (
int i = 0; i <
m_ui->m_isolineslistWidget->count(); i++)
578 val.push_back(
m_ui->m_isolineslistWidget->item(i)->text().toDouble());
579 if (
m_ui->m_guidelinescheckBox->isChecked())
581 if (val[(
unsigned)i] == gLineValue)
583 guideval.push_back(gLineValue);
584 gLineValue += (step * 5);
592 ci->
setInput(inDataSource, inDsetName, std::move(inDsetType));
598 if (dsOGR->dataSetExists(outputdataset))
599 throw te::common::Exception(
TE_TR(
"There is already a dataset with the requested name in the output data source. Remove it or select a new name and try again."));
609 if (aux->dataSetExists(outputdataset))
614 if (
m_ui->m_dummycheckBox->isChecked() ==
true)
621 result = ci->
run(std::move(raster));
627 double tol =
m_inputLayer->getExtent().getHeight() / 1.e9;
631 Tin->
setInput(inDataSource, inDsetName, std::move(inDsetType));
638 if (dsOGR->dataSetExists(outputdataset))
639 throw te::common::Exception(
TE_TR(
"There is already a dataset with the requested name in the output data source. Remove it or select a new name and try again."));
648 if (aux->dataSetExists(outputdataset))
666 boost::uuids::basic_random_generator<boost::mt19937> gen;
667 boost::uuids::uuid u = gen();
668 std::string
id = boost::uuids::to_string(u);
671 ds->setConnInfo(outdsinfo);
672 ds->setTitle(uri.stem().string());
673 ds->setAccessDriver(
"OGR");
675 ds->setDescription(uri.string());
693 catch (
const std::exception& e)
695 QApplication::restoreOverrideCursor();
696 QMessageBox::information(
this, tr(
"Create Isolines "), e.what());
700 QApplication::restoreOverrideCursor();
707 srsDialog.setWindowTitle(tr(
"Choose the SRS"));
709 if (srsDialog.exec() == QDialog::Rejected)
722 m_ui->m_resSRIDLabel->setText(
"No SRS defined");
728 m_ui->m_resSRIDLabel->setText(name.c_str());
730 m_ui->m_resSRIDLabel->setText(QString(
"%1").arg(newSRID));
void setInput(te::da::DataSourcePtr inDsrc, std::string inDsetName, std::unique_ptr< te::da::DataSetType > inDsetType)
TEDATAACCESSEXPORT DataSourcePtr GetDataSource(const std::string &datasourceId, const bool opened=true)
Search for a data source with the informed id in the DataSourceManager.
std::vector< double > GetNumericData(te::da::DataSet *dataSet, std::vector< std::string > &propName)
void setParams(std::vector< double > &val, std::vector< double > &gval, double tol)
TEDATAACCESSEXPORT te::rst::RasterProperty * GetFirstRasterProperty(const DataSetType *dt)
void onCancelPushButtonClicked()
Class to generate isolines from TIN.
MultiPolygon is a MultiSurface whose elements are Polygons.
static std::unique_ptr< DataSource > make(const std::string &driver, const te::core::URI &connInfo)
virtual double getDouble(std::size_t i) const =0
Method for retrieving a double attribute value.
mntType m_inputType
Input type (TIN, GRID)
static bool exists(const std::string &path)
Checks if a given path in UTF-8 exists.
boost::shared_ptr< DataSetType > DataSetTypePtr
A dialog ISolines generation.
boost::shared_ptr< DataSource > DataSourcePtr
CreateIsolinesDialog(QWidget *parent=0, Qt::WindowFlags f=0)
Curve is an abstract class that represents 1-dimensional geometric objects stored as a sequence of co...
virtual std::string getNumeric(std::size_t i) const =0
Method for retrieving a numeric attribute value.
virtual const char * what() const
It outputs the exception message.
virtual float getFloat(std::size_t i) const =0
Method for retrieving a float attribute value.
static te::dt::Date ds(2010, 01, 01)
#define TE_TR(message)
It marks a string in order to get translated.
void setLayers(std::list< te::map::AbstractLayerPtr > layers)
void on_stepVariableraEnabled(bool)
void getMinMax(te::map::AbstractLayerPtr inputLayer, double &min, double &max)
virtual bool moveNext()=0
It moves the internal pointer to the next item of the collection.
A LinearRing is a LineString that is both closed and simple.
void onStepFixeEnabled(bool)
void setParams(std::vector< double > &nval, std::vector< double > &gval, double vmax, double vmin, double dummy, bool hasDummy)
te::map::AbstractLayerPtr m_outputLayer
Generated Layer.
virtual boost::int16_t getInt16(std::size_t i) const =0
Method for retrieving a 16-bit integer attribute value (2 bytes long).
void onTargetDatasourceToolButtonPressed()
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
void oninsertpushButtonClicked()
virtual int getPropertyDataType(std::size_t i) const =0
It returns the underlying data type of the property at position pos.
void setLayers(std::list< te::map::AbstractLayerPtr > layers)
te::map::AbstractLayerPtr getLayer()
void onInputComboBoxChanged(int index)
virtual boost::int32_t getInt32(std::size_t i) const =0
Method for retrieving a 32-bit integer attribute value (4 bytes long).
void ondeleteallpushButtonClicked()
static te::dt::TimeDuration dt(20, 30, 50, 11)
void setOutput(te::da::DataSourcePtr outDsrc, std::string dsname)
void ondeletepushButtonClicked()
CurvePolygon is a planar surface defined by 1 exterior boundary and 0 or more interior boundaries...
te::da::DataSourceInfoPtr m_outputDatasource
DataSource information.
void onSrsToolButtonClicked()
void onOkPushButtonClicked()
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
void setSRID(int newSRID)
void onInputLayerToolButtonClicked()
A dataset is the unit of information manipulated by the data access module of TerraLib.
Polygon is a subclass of CurvePolygon whose rings are defined by linear rings.
const std::string & getDataSetName() const
Class to define TIN strutures.
bool run(std::unique_ptr< te::rst::Raster > raster)
void onDummyLineEditEditingFinished()
void setActive(const QList< mntType > &types)
A class that represents a data source component.
std::unique_ptr< te::rst::Raster > getPrepareRaster()
const double & getZ(std::size_t i) const
It returns the n-th z coordinate value.
virtual bool isNull(std::size_t i) const =0
It checks if the attribute value is NULL.
A layer with reference to a dataset.
virtual boost::int64_t getInt64(std::size_t i) const =0
Method for retrieving a 64-bit integer attribute value (8 bytes long).
std::list< te::map::AbstractLayerPtr > m_layers
List of layers.
std::vector< te::rst::BandProperty * > & getBandProperties()
Returns a reference to the list of bands definitions.
TEDATAACCESSEXPORT std::size_t GetFirstPropertyPos(const te::da::DataSet *dataset, int datatype)
TEMNTEXPORT te::mnt::mntType getMNTType(const te::da::DataSetType *dt)
void setInput(te::da::DataSourcePtr inRasterDsrc, std::string inRasterName, std::unique_ptr< te::da::DataSetType > inDsetType)
virtual std::size_t getNumProperties() const =0
It returns the number of properties that composes an item of the dataset.
virtual std::string getPropertyName(std::size_t i) const =0
It returns the property name at position pos.
TEMNTEXPORT void getMinMax(te::rst::Raster *inputRst, double &vmin, double &vmax)
It is a collection of other geometric objects.
void setOutput(te::da::DataSourcePtr outDsrc, std::string dsname)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
std::unique_ptr< Ui::CreateIsolinesDialogForm > m_ui
virtual bool moveFirst()=0
It moves the internal pointer to the first item in the collection.
te::map::AbstractLayerPtr getLayer()
virtual const std::string & getDataSourceId() const
void onTargetFileToolButtonPressed()
te::map::AbstractLayerPtr m_inputLayer
Input layer.
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr