27 #include "../../../cellspace/CellSpaceOperations.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 "../../../core/uri/URI.h" 33 #include "../../../core/uri/Utils.h" 34 #include "../../../common/UnitsOfMeasureManager.h" 35 #include "../../../dataaccess/datasource/DataSource.h" 36 #include "../../../dataaccess/datasource/DataSourceFactory.h" 37 #include "../../../dataaccess/datasource/DataSourceInfoManager.h" 38 #include "../../../dataaccess/datasource/DataSourceTransactor.h" 39 #include "../../../dataaccess/datasource/DataSourceManager.h" 40 #include "../../../dataaccess/utils/Utils.h" 41 #include "../../../qt/widgets/layer/utils/DataSet2Layer.h" 42 #include "../../../qt/widgets/help/HelpPushButton.h" 43 #include "../../../qt/widgets/progress/ProgressViewerDialog.h" 44 #include "../../../qt/widgets/srs/SRSManagerDialog.h" 45 #include "../../../qt/widgets/utils/ScopedCursor.h" 46 #include "../../../srs/SpatialReferenceSystemManager.h" 47 #include "../../../srs/Converter.h" 48 #include "../../widgets/datasource/selector/DataSourceSelectorDialog.h" 49 #include "ui_CreateCellularSpaceDialogForm.h" 53 #include <QFileDialog> 54 #include <QMessageBox> 55 #include <QToolButton> 58 #include <boost/filesystem.hpp> 59 #include <boost/uuid/random_generator.hpp> 60 #include <boost/uuid/uuid_io.hpp> 65 te::qt::plugins::cellspace::CreateCellularSpaceDialog::CreateCellularSpaceDialog(
QWidget* parent, Qt::WindowFlags f)
69 m_outputDataSetName(""),
70 m_ui(new
Ui::CreateCellularSpaceDialogForm)
76 QSize iconSize(32, 32);
78 m_ui->m_imgLabel->setPixmap(QIcon::fromTheme(
"cellspace-no-mask-hint").pixmap(48, 48));
79 m_ui->m_maskRadioButton->setIconSize(iconSize);
80 m_ui->m_maskRadioButton->setIcon(QIcon::fromTheme(
"cellspace-mask-hint"));
81 m_ui->m_noMaskRadioButton->setIconSize(iconSize);
82 m_ui->m_noMaskRadioButton->setIcon(QIcon::fromTheme(
"cellspace-no-mask-hint"));
83 m_ui->m_polygonsRadioButton->setIconSize(iconSize);
84 m_ui->m_polygonsRadioButton->setIcon(QIcon::fromTheme(
"cellspace-polygons-hint"));
85 m_ui->m_pointsRadioButton->setIconSize(iconSize);
86 m_ui->m_pointsRadioButton->setIcon(QIcon::fromTheme(
"cellspace-points-hint"));
87 m_ui->m_targetDatasourceToolButton->setIcon(QIcon::fromTheme(
"datasource"));
88 m_ui->m_srsToolButton->setIcon(QIcon::fromTheme(
"srs"));
91 m_ui->m_llxLineEdit->setValidator(
new QDoubleValidator(
this));
92 m_ui->m_llyLineEdit->setValidator(
new QDoubleValidator(
this));
93 m_ui->m_urxLineEdit->setValidator(
new QDoubleValidator(
this));
94 m_ui->m_uryLineEdit->setValidator(
new QDoubleValidator(
this));
95 m_ui->m_resXLineEdit->setValidator(
new QDoubleValidator(0, 99999999, 8,
this));
96 m_ui->m_resYLineEdit->setValidator(
new QDoubleValidator(0, 99999999, 8,
this));
100 connect(m_ui->m_layersComboBox, SIGNAL(currentIndexChanged(
int)),
this, SLOT(onLayersComboBoxChanged(
int)));
101 connect(m_ui->m_unitComboBox, SIGNAL(currentIndexChanged(
int)),
this, SLOT(onUnitComboBoxChanged(
int)));
103 connect(m_ui->m_resXLineEdit, SIGNAL(editingFinished()),
this, SLOT(onResXLineEditEditingFinished()));
104 connect(m_ui->m_resYLineEdit, SIGNAL(editingFinished()),
this, SLOT(onResYLineEditEditingFinished()));
105 connect(m_ui->m_llxLineEdit, SIGNAL(textChanged(
const QString &)),
this, SLOT(onEnvelopeChanged(
const QString &)));
106 connect(m_ui->m_llyLineEdit, SIGNAL(textChanged(
const QString &)),
this, SLOT(onEnvelopeChanged(
const QString &)));
107 connect(m_ui->m_urxLineEdit, SIGNAL(textChanged(
const QString &)),
this, SLOT(onEnvelopeChanged(
const QString &)));
108 connect(m_ui->m_uryLineEdit, SIGNAL(textChanged(
const QString &)),
this, SLOT(onEnvelopeChanged(
const QString &)));
110 connect(m_ui->m_targetFileToolButton, SIGNAL(clicked()),
this, SLOT(onTargetFileToolButtonClicked()));
111 connect(m_ui->m_targetDatasourceToolButton, SIGNAL(clicked()),
this, SLOT(onTargetDatasourceToolButtonClicked()));
112 connect(m_ui->m_createPushButton, SIGNAL(clicked()),
this, SLOT(onCreatePushButtonClicked()));
113 connect(m_ui->m_srsToolButton, SIGNAL(clicked()),
this, SLOT(onSrsToolButtonClicked()));
115 m_ui->m_helpPushButton->setNameSpace(
"dpi.inpe.br.plugins");
116 m_ui->m_helpPushButton->setPageReference(
"plugins/cellspace/cellspace.html");
126 m_ui->m_noMaskRadioButton->setChecked(
true);
127 m_ui->m_maskRadioButton->setEnabled(
false);
128 m_ui->m_resSRIDLabel->setText(
"No SRS defined");
129 m_ui->m_layerSRIDLabel->setText(
"No SRS defined");
130 m_ui->m_unitComboBox->setCurrentIndex(0);
135 std::list<te::map::AbstractLayerPtr>::iterator it = layers.begin();
137 while(it != layers.end())
139 m_ui->m_layersComboBox->addItem(QString(it->get()->getTitle().c_str()), QVariant::fromValue(*it));
142 m_ui->m_layersComboBox->setCurrentIndex(0);
150 boost::uuids::basic_random_generator<boost::mt19937> gen;
151 boost::uuids::uuid u = gen();
152 std::string id_ds = boost::uuids::to_string(u);
158 ds->setTitle(uri.stem().string());
159 ds->setAccessDriver(
"OGR");
161 ds->setDescription(uri.string());
173 outDataSource->open();
207 m_ui->m_resSRIDLabel->setText(
"No SRS defined");
208 m_ui->m_layerSRIDLabel->setText(
"No SRS defined");
209 m_ui->m_unitComboBox->setCurrentIndex(0);
214 if(layer->getSchema()->hasRaster())
216 m_ui->m_maskRadioButton->setEnabled(
false);
217 m_ui->m_noMaskRadioButton->setChecked(
true);
221 m_ui->m_maskRadioButton->setEnabled(
true);
222 m_ui->m_maskRadioButton->setChecked(
true);
236 srsDialog.setWindowTitle(tr(
"Choose the SRS"));
238 if(srsDialog.exec() == QDialog::Rejected)
243 if (
m_ui->m_maskRadioButton->isChecked())
247 ((newSRID <= 0 && refLayer->getSRID() > 0) ||
248 (newSRID > 0 && refLayer->getSRID() <= 0) ))
249 m_ui->m_noMaskRadioButton->setChecked(
true);
254 m_ui->m_unitComboBox->setCurrentIndex(0);
255 m_ui->m_resSRIDLabel->setText(
"No SRS defined");
260 m_ui->m_resSRIDLabel->setText(name.c_str());
289 QMessageBox::warning(
this, tr(
"Cellular Spaces"), tr(
"There is no no spatial reference defined for the new cellular space. It is not possible to select a unit for the resolution."));
290 m_ui->m_unitComboBox->setCurrentIndex(0);
302 if (!resUnit || !bbUnit)
305 if (resUnit == bbUnit)
320 QMessageBox::warning(
this, tr(
"Cellular Spaces"), tr(
"Unable to convert between the selected unit for the resolution and the unit of new cell layer SRS"));
321 m_ui->m_unitComboBox->setItemText(
m_ui->m_unitComboBox->currentIndex(), QString(bbUnit->getName().c_str()));
329 QMessageBox::warning(
this, tr(
"Cellular Spaces"), tr(
"Invalid bounding box."));
333 double resX =
m_ui->m_resXLineEdit->text().toDouble();
337 m_ui->m_colsLineEdit->setText(QString::number(maxCols));
345 QMessageBox::warning(
this, tr(
"Cellular Spaces"), tr(
"Invalid bounding box."));
349 double resY =
m_ui->m_resXLineEdit->text().toDouble();
353 m_ui->m_rowsLineEdit->setText(QString::number(maxRows));
358 m_ui->m_newLayerNameLineEdit->clear();
359 m_ui->m_repositoryLineEdit->clear();
364 std::list<te::da::DataSourceInfoPtr> dsPtrList = dlg.
getSelecteds();
366 if(dsPtrList.empty())
369 std::list<te::da::DataSourceInfoPtr>::iterator it = dsPtrList.begin();
373 m_ui->m_repositoryLineEdit->setText(QString(it->get()->getTitle().c_str()));
377 m_ui->m_newLayerNameLineEdit->setEnabled(
true);
382 m_ui->m_newLayerNameLineEdit->clear();
383 m_ui->m_repositoryLineEdit->clear();
385 if (
m_ui->m_colsLineEdit->text().isEmpty())
388 if (
m_ui->m_rowsLineEdit->text().isEmpty())
393 std::string accessDriver;
395 extension = tr(
"Shapefile (*.shp *.SHP);;");
396 accessDriver =
"OGR";
398 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save as..."),
399 QString(), extension,
nullptr, QFileDialog::DontConfirmOverwrite);
401 if (fileName.isEmpty())
404 boost::filesystem::path outfile(fileName.toUtf8().data());
405 std::string aux = outfile.leaf().string();
406 m_ui->m_newLayerNameLineEdit->setText(aux.c_str());
407 aux = outfile.string();
408 m_ui->m_repositoryLineEdit->setText(aux.c_str());
412 m_ui->m_newLayerNameLineEdit->setEnabled(
false);
414 std::string connInfo(
"file://");
415 connInfo +=
m_ui->m_repositoryLineEdit->text().toUtf8().data();
428 QMessageBox::warning(
this, tr(
"Cellular Spaces"), errors.c_str());
436 if(
m_ui->m_polygonsRadioButton->isChecked())
446 if (
m_ui->m_maskRadioButton->isChecked())
465 this->setCursor(Qt::ArrowCursor);
466 QMessageBox::warning(
this, tr(
"Cellular Spaces"), e.
what());
471 this->setCursor(Qt::ArrowCursor);
477 m_ui->m_unitComboBox->addItem(
"UNIT");
486 m_ui->m_unitComboBox->addItem(uptr->getName().c_str(), QVariant::fromValue(uptr));
497 m_ui->m_unitComboBox->setCurrentIndex(0);
502 m_ui->m_llxLineEdit->setText(QString::number(env.
m_llx,
'f',precision));
503 m_ui->m_llyLineEdit->setText(QString::number(env.
m_lly,
'f',precision));
504 m_ui->m_urxLineEdit->setText(QString::number(env.
m_urx,
'f',precision));
505 m_ui->m_uryLineEdit->setText(QString::number(env.
m_ury,
'f',precision));
512 m_ui->m_unitComboBox->setCurrentIndex(0);
516 for(
int i = 0; i <
m_ui->m_unitComboBox->count(); ++i)
518 std::string name =
m_ui->m_unitComboBox->itemText(i).toUtf8().data();
520 if(unit->getName() == name)
522 m_ui->m_unitComboBox->setCurrentIndex(i);
530 QVariant varUnit =
m_ui->m_unitComboBox->itemData(
m_ui->m_unitComboBox->currentIndex(), Qt::UserRole);
536 QVariant varLayer =
m_ui->m_layersComboBox->itemData(
m_ui->m_layersComboBox->currentIndex(), Qt::UserRole);
543 env.
m_llx =
m_ui->m_llxLineEdit->text().toDouble();
544 env.
m_lly =
m_ui->m_llyLineEdit->text().toDouble();
545 env.
m_urx =
m_ui->m_urxLineEdit->text().toDouble();
546 env.
m_ury =
m_ui->m_uryLineEdit->text().toDouble();
553 m_ui->m_llxLineEdit->clear();
554 m_ui->m_llyLineEdit->clear();
555 m_ui->m_urxLineEdit->clear();
556 m_ui->m_uryLineEdit->clear();
562 double resX =
m_ui->m_resXLineEdit->text().toDouble();
573 double resY =
m_ui->m_resYLineEdit->text().toDouble();
621 switch (planar->getId())
640 switch (planar->getId())
659 m_ui->m_resXLineEdit->clear();
660 m_ui->m_resYLineEdit->clear();
661 m_ui->m_colsLineEdit->clear();
662 m_ui->m_rowsLineEdit->clear();
670 m_ui->m_resSRIDLabel->setText(name.c_str());
674 m_ui->m_resSRIDLabel->setText(
"No SRS defined");
680 bool noErrors =
true;
681 errors = tr(
"Consistency errors:").toUtf8().data();
686 errors +=
"\n - " + std::string(tr(
"Invalid bounding box").toUtf8().data());
691 if (resX <= 0. || resX >= env.
getWidth())
695 errors +=
"\n - " + std::string(tr(
"X resolution must be greater than 0 and smaller than the bounding box Width ").toUtf8().data()) + txt;
700 if (resY <= 0. || resY >= env.
getHeight())
704 errors +=
"\n - " + std::string(tr(
"Y resolution must be greater than 0 and smaller than the bounding box Height ").toUtf8().data()) + txt;
708 std::string name =
m_ui->m_newLayerNameLineEdit->text().toUtf8().data();
711 errors +=
"\n - " + std::string(tr(
"Output layer name is empty").toUtf8().data());
715 if (
m_ui->m_maskRadioButton->isChecked())
718 if (!((referenceLayer->getSRID() > 0 &&
m_bbSRID > 0) ||
719 (referenceLayer->getSRID() <= 0 &&
m_bbSRID <= 0)))
721 errors +=
"\n - " + std::string(tr(
"Reference layer and output layer have incompatible SRSs. It is not possible to create cells using polygons as masks.").toUtf8().data());
const_iterator begin() const
It returns an iterator to the beginning of the conteiner.
TEDATAACCESSEXPORT DataSourcePtr GetDataSource(const std::string &datasourceId, const bool opened=true)
Search for a data source with the informed id in the DataSourceManager.
void onTargetDatasourceToolButtonClicked()
This class provide cellular spaces operations.
boost::shared_ptr< DataSetType > DataSetTypePtr
te::gm::Envelope getEnvelope()
boost::shared_ptr< DataSource > DataSourcePtr
void onTargetFileToolButtonClicked()
void onSrsToolButtonClicked()
bool checkList(std::string &errors)
virtual const char * what() const
It outputs the exception message.
void setResolutionUnit(te::common::UnitOfMeasurePtr unit)
double m_urx
Upper right corner x-coordinate.
double getWidth() const
It returns the envelope width.
void onCreatePushButtonClicked()
static te::dt::Date ds(2010, 01, 01)
const_iterator end() const
It returns an iterator to the end of the conteiner.
std::string m_outputDataSetName
bool convertPlanarToAngle(double &val, te::common::UnitOfMeasurePtr planar)
void onEnvelopeChanged(const QString &text)
double m_llx
Lower left corner x-coordinate.
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
bool unitConvertion(double &res, te::common::UnitOfMeasurePtr from, te::common::UnitOfMeasurePtr to)
An Envelope defines a 2D rectangular region.
void onLayersComboBoxChanged(int index)
std::map< unsigned int, UnitOfMeasurePtr >::const_iterator const_iterator
static te::dt::TimeDuration dt(20, 30, 50, 11)
void onUnitComboBoxChanged(int index)
double getConversion(const std::string &unitFromName, const std::string &unitToName) const
Calculates a multiplicative factor to convert from a given unit to its base unit and vice-versa...
te::da::DataSourceInfoPtr m_outDataSourceInfo
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
double m_lly
Lower left corner y-coordinate.
void initUnitsOfMeasure()
~CreateCellularSpaceDialog()
std::unique_ptr< Ui::CreateCellularSpaceDialogForm > m_ui
boost::shared_ptr< UnitOfMeasure > UnitOfMeasurePtr
double m_ury
Upper right corner y-coordinate.
void setLayers(std::list< te::map::AbstractLayerPtr > layers)
void showEnvelope(const te::gm::Envelope &env, int precision)
te::map::AbstractLayerPtr getLayer()
te::map::AbstractLayerPtr getReferenceLayer()
A class that represents a data source component.
void onResYLineEditEditingFinished()
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void transform(int oldsrid, int newsrid)
It will transform the coordinates of the Envelope from the old SRS to the new one.
double getHeight() const
It returns the envelope height.
void onResXLineEditEditingFinished()
bool isValid() const
It tells if the rectangle is valid or not.
te::common::UnitOfMeasurePtr getResolutionUnit()
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
bool convertAngleToPlanar(double &val, te::common::UnitOfMeasurePtr planar)
Q_DECLARE_METATYPE(te::map::AbstractLayerPtr) Q_DECLARE_METATYPE(te