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