27 #include "terralib_config.h"
28 #include "../../common/Logger.h"
29 #include "../../common/progress/ProgressManager.h"
30 #include "../../common/Translator.h"
31 #include "../../common/STLUtils.h"
32 #include "../../dataaccess/dataset/DataSetType.h"
33 #include "../../dataaccess/dataset/ObjectIdSet.h"
34 #include "../../dataaccess/datasource/DataSourceCapabilities.h"
35 #include "../../dataaccess/datasource/DataSourceInfo.h"
36 #include "../../dataaccess/datasource/DataSourceInfoManager.h"
37 #include "../../dataaccess/datasource/DataSourceFactory.h"
38 #include "../../dataaccess/datasource/DataSourceManager.h"
39 #include "../../dataaccess/utils/Utils.h"
40 #include "../../datatype/Enums.h"
41 #include "../../datatype/Property.h"
42 #include "../../maptools/AbstractLayer.h"
43 #include "../../qt/af/Utils.h"
44 #include "../../qt/widgets/datasource/selector/DataSourceSelectorDialog.h"
45 #include "../../qt/widgets/layer/utils/DataSet2Layer.h"
46 #include "../../qt/widgets/progress/ProgressViewerDialog.h"
47 #include "../../qt/widgets/rp/Utils.h"
48 #include "../../qt/widgets/Utils.h"
49 #include "../../qt/widgets/utils/DoubleListWidget.h"
50 #include "../../statistics/core/Utils.h"
51 #include "../../srs/SpatialReferenceSystemManager.h"
52 #include "../Config.h"
53 #include "../Exception.h"
55 #include "../VectorToRaster.h"
56 #include "ui_VectorToRasterDialogForm.h"
59 #include <QDoubleValidator>
60 #include <QFileDialog>
61 #include <QIntValidator>
64 #include <QListWidget>
65 #include <QListWidgetItem>
66 #include <QMessageBox>
69 #include <boost/algorithm/string.hpp>
70 #include <boost/filesystem.hpp>
71 #include <boost/lexical_cast.hpp>
72 #include <boost/uuid/random_generator.hpp>
73 #include <boost/uuid/uuid_io.hpp>
77 m_ui(new Ui::VectorToRasterDialogForm),
84 m_ui->m_imgLabel->setPixmap(QIcon::fromTheme(
"vector-raster-hint").pixmap(112,48));
87 m_widget->setLeftLabel(
"Available Properties");
88 m_widget->setRightLabel(
"Used Properties");
90 QGridLayout* displayLayout =
new QGridLayout(
m_ui->m_widget);
91 displayLayout->addWidget(
m_widget.get());
93 m_ui->m_colsLineEdit->setValidator(
new QIntValidator(
this) );
94 m_ui->m_rowsLineEdit->setValidator(
new QIntValidator(
this) );
95 m_ui->m_resXLineEdit->setValidator(
new QDoubleValidator(0, 100, 4,
this) );
96 m_ui->m_resYLineEdit->setValidator(
new QDoubleValidator(0, 100, 4,
this) );
97 m_ui->m_dummyLineEdit->setValidator(
new QIntValidator(
this) );
111 m_ui->m_helpPushButton->setNameSpace(
"dpi.inpe.br.plugins");
112 m_ui->m_helpPushButton->setPageReference(
"plugins/attributefill/attrfill_vector_to_raster.html");
123 std::list<te::map::AbstractLayerPtr>::iterator it = m_layers.begin();
125 while(it != m_layers.end())
127 std::auto_ptr<te::da::DataSetType> dsType = it->get()->getSchema();
128 if(dsType->hasGeom())
129 m_ui->m_inVectorComboBox->addItem(QString(it->get()->getTitle().c_str()), QVariant(it->get()->getId().c_str()));
142 name +=
" - " + boost::lexical_cast<std::string>(m_srid);
144 m_ui->m_sridLabel->setText(name.c_str());
149 std::list<te::map::AbstractLayerPtr>::iterator it = m_layers.begin();
151 std::string layerID = m_ui->m_inVectorComboBox->itemData(index, Qt::UserRole).toString().toStdString();
153 m_widget->clearInputValues();
154 m_widget->clearOutputValues();
156 while(it != m_layers.end())
158 if(layerID == it->get()->getId().c_str())
160 m_selectedLayer = it->get();
161 std::auto_ptr<const te::map::LayerSchema> schema(m_selectedLayer->getSchema());
163 const std::vector<te::dt::Property*> vecProperties = schema->getProperties();
164 std::vector<std::string> propNameVec;
166 for(std::size_t i = 0; i < vecProperties.size(); ++i)
168 int type = vecProperties[i]->getType();
182 propNameVec.push_back(vecProperties[i]->getName().c_str());
183 m_properties.push_back(vecProperties[i]);
186 m_widget->setInputValues(propNameVec);
188 m_srid = m_selectedLayer->getSRID();
198 double resX = m_ui->m_resXLineEdit->text().toDouble();
204 QMessageBox::warning(
this, tr(
"Attribute Fill"), tr(
"Invalid envelope!"));
208 int maxCols = (int)ceil((env.
m_urx - env.
m_llx)/resX);
210 m_ui->m_colsLineEdit->setText(QString::number(maxCols));
215 double resY = m_ui->m_resYLineEdit->text().toDouble();
221 QMessageBox::warning(
this, tr(
"Attribute Fill"), tr(
"Invalid envelope!"));
225 int maxRows = (int)ceil((env.
m_ury - env.
m_lly)/resY);
227 m_ui->m_rowsLineEdit->setText(QString::number(maxRows));
232 int cols = m_ui->m_colsLineEdit->text().toInt();
238 QMessageBox::warning(
this, tr(
"Attribute Fill"), tr(
"Invalid envelope!"));
244 m_ui->m_resXLineEdit->setText(QString::number(resX));
249 int rows = m_ui->m_rowsLineEdit->text().toInt();
255 QMessageBox::warning(
this, tr(
"Attribute Fill"), tr(
"Invalid envelope!"));
261 m_ui->m_resYLineEdit->setText(QString::number(resY));
266 m_ui->m_newLayerNameLineEdit->clear();
267 m_ui->m_repositoryLineEdit->clear();
269 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save as..."),
270 QString(), tr(
"TIFF (*.tif *.TIF);;"),0, QFileDialog::DontConfirmOverwrite);
272 if (fileName.isEmpty())
275 boost::filesystem::path outfile(fileName.toStdString());
276 std::string aux = outfile.leaf().string();
277 m_ui->m_newLayerNameLineEdit->setText(aux.c_str());
278 aux = outfile.string();
279 m_ui->m_repositoryLineEdit->setText(aux.c_str());
282 m_ui->m_newLayerNameLineEdit->setEnabled(
false);
287 QMessageBox::information(
this,
"Help",
"Under development");
292 if(m_ui->m_inVectorComboBox->count() == 0)
294 QMessageBox::information(
this,
"Fill",
"Select an input vector layer.");
302 QMessageBox::information(
this,
"Fill",
"Can not execute this operation on this type of layer.");
307 if (!inDataSource.get())
309 QMessageBox::information(
this,
"Fill",
"The selected input data source can not be accessed.");
310 m_ui->m_targetFileToolButton->setFocus();
314 if(m_widget->getOutputValues().size() == 0)
316 QMessageBox::information(
this,
"Fill",
"Select at least one output attribute to represent the band of the raster.");
320 if(m_ui->m_resXLineEdit->text().isEmpty())
322 QMessageBox::information(
this,
"Fill",
"Define a resolution for the output raster.");
323 m_ui->m_resXLineEdit->setFocus();
327 if(m_ui->m_resYLineEdit->text().isEmpty())
329 QMessageBox::information(
this,
"Fill",
"Define a resolution for the output raster.");
330 m_ui->m_resYLineEdit->setFocus();
334 if(m_ui->m_colsLineEdit->text().isEmpty())
336 QMessageBox::information(
this,
"Fill",
"Define a resolution for the output raster.");
337 m_ui->m_colsLineEdit->setFocus();
341 if(m_ui->m_rowsLineEdit->text().isEmpty())
343 QMessageBox::information(
this,
"Fill",
"Define a resolution for the output raster.");
344 m_ui->m_rowsLineEdit->setFocus();
348 if(m_ui->m_dummyCheckBox->isChecked())
350 if(m_ui->m_dummyLineEdit->text().isEmpty())
352 QMessageBox::information(
this,
"Fill",
"Define a dummy value for the output raster.");
353 m_ui->m_dummyLineEdit->setFocus();
358 if(m_ui->m_repositoryLineEdit->text().isEmpty())
360 QMessageBox::information(
this,
"Fill",
"Define a repository for the result.");
361 m_ui->m_targetFileToolButton->setFocus();
365 if(m_ui->m_newLayerNameLineEdit->text().isEmpty())
367 QMessageBox::information(
this,
"Fill",
"Define a name for the resulting layer.");
368 m_ui->m_newLayerNameLineEdit->setFocus();
372 std::string outputdataset = m_ui->m_newLayerNameLineEdit->text().toStdString();
382 boost::filesystem::path uri(m_ui->m_repositoryLineEdit->text().toStdString());
384 if (boost::filesystem::exists(uri))
386 QMessageBox::information(
this,
"Fill",
"Output file already exists. Remove it or select a new name and try again.");
390 std::size_t idx = outputdataset.find(
".");
391 if (idx != std::string::npos)
392 outputdataset=outputdataset.substr(0,idx);
394 std::map<std::string, std::string> dsinfo;
395 dsinfo[
"URI"] = uri.string();
398 dsOGR->setConnectionInfo(dsinfo);
400 if (dsOGR->dataSetExists(outputdataset))
402 QMessageBox::information(
this,
"Fill",
"There is already a dataset with the requested name in the output data source. Remove it or select a new name and try again.");
406 this->setCursor(Qt::WaitCursor);
410 vec2rst->
setParams( m_widget->getOutputValues(),
411 m_ui->m_resXLineEdit->text().toDouble(),
412 m_ui->m_resYLineEdit->text().toDouble(),
413 m_ui->m_colsLineEdit->text().toInt(),
414 m_ui->m_rowsLineEdit->text().toInt(),
415 m_ui->m_dummyCheckBox->isChecked(),
416 m_ui->m_dummyLineEdit->text().toInt());
417 vec2rst->
setOutput(dsOGR, outputdataset);
422 res = vec2rst->
run();
426 this->setCursor(Qt::ArrowCursor);
428 QMessageBox::information(
this,
"Fill",
"Error: could not generate the operation.");
436 boost::uuids::basic_random_generator<boost::mt19937> gen;
437 boost::uuids::uuid u = gen();
438 std::string id_ds = boost::uuids::to_string(u);
441 ds->setConnInfo(dsinfo);
442 ds->setTitle(uri.stem().string());
443 ds->setAccessDriver(
"GDAL");
445 ds->setDescription(uri.string());
451 m_outputDatasource = ds;
454 catch(
const std::exception& e)
456 this->setCursor(Qt::ArrowCursor);
458 QMessageBox::information(
this,
"Fill", e.what());
460 #ifdef TERRALIB_LOGGER_ENABLED
461 te::common::Logger::logDebug(
"attributefill", e.what());
462 #endif // TERRALIB_LOGGER_ENABLED
470 m_outputDatasource->getConnInfo());
473 this->setCursor(Qt::ArrowCursor);
TEDATAACCESSEXPORT DataSourcePtr GetDataSource(const std::string &datasourceId, const bool opened=true)
Search for a data source with the informed id in the DataSourceManager.
VectorToRasterDialog(QWidget *parent=0, Qt::WindowFlags f=0)
void onTargetFileToolButtonPressed()
boost::shared_ptr< DataSource > DataSourcePtr
void onRowsLineEditEditingFinished()
virtual const std::string & getTitle() const
It returns the layer title.
void onCancelPushButtonClicked()
void onResYLineEditEditingFinished()
double m_urx
Upper right corner x-coordinate.
void onVectorComboBoxChanged(int index)
double m_llx
Lower left corner x-coordinate.
void onResXLineEditEditingFinished()
void removeViewer(int viewerId)
Dettach a progress viewer.
static SpatialReferenceSystemManager & getInstance()
It returns a reference to the singleton instance.
An Envelope defines a 2D rectangular region.
const std::string & getDataSourceId() const
static std::auto_ptr< DataSource > make(const std::string &dsType)
te::map::AbstractLayerPtr getLayer()
Get the generated layer.
void onHelpPushButtonClicked()
void onColsLineEditEditingFinished()
void setInput(te::da::DataSourcePtr inVectorDsrc, std::string inVectorName, std::auto_ptr< te::da::DataSetType > inVectorDsType)
double m_lly
Lower left corner y-coordinate.
int addViewer(AbstractProgressViewer *apv)
Attach a progress viewer.
void setParams(std::vector< std::string > selectedAttVec, double resolutionX, double resolutionY, int columns, int rows, bool useDummy, int dummy=0)
void onOkPushButtonClicked()
double m_ury
Upper right corner y-coordinate.
void setLayers(std::list< te::map::AbstractLayerPtr > layers)
Set the layer that can be used.
std::auto_ptr< Ui::VectorToRasterDialogForm > m_ui
A class that represents a data source component.
A layer with reference to a dataset.
std::auto_ptr< LayerSchema > getSchema() const
It returns the layer schema.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void setOutput(te::da::DataSourcePtr outDsrc, std::string dsName)
std::auto_ptr< te::qt::widgets::DoubleListWidget > m_widget
Double list widget.
bool isValid() const
It tells if the rectangle is valid or not.
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr