27 #include "../../common/CharEncodingConv.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/Utils.h"
48 #include "../AddressGeocodingOp.h"
49 #include "../Config.h"
50 #include "../Exception.h"
54 #include "ui_MainWindowDialogForm.h"
57 #include <QFileDialog>
58 #include <QMessageBox>
62 #include <boost/algorithm/string.hpp>
63 #include <boost/filesystem.hpp>
64 #include <boost/uuid/random_generator.hpp>
65 #include <boost/uuid/uuid_io.hpp>
69 m_ui(new
Ui::MainWindowDialogForm),
77 m_ui->m_imgLabel->setPixmap(QIcon::fromTheme(
"addressgeocoding-hint").pixmap(112,48));
78 m_ui->m_targetDatasourceToolButton->setIcon(QIcon::fromTheme(
"datasource"));
79 m_ui->m_targetDataSourceAddressToolButton->setIcon(QIcon::fromTheme(
"datasource"));
80 m_ui->m_editAddressFileToolButton->setIcon(QIcon::fromTheme(
"preferences-system"));
81 m_ui->m_removeAddressFileToolButton->setIcon(QIcon::fromTheme(
"delete"));
102 m_ui->m_helpPushButton->setNameSpace(
"dpi.inpe.br.plugins");
103 m_ui->m_helpPushButton->setPageReference(
"plugins/addressgeocoding/addressgeocoding.html");
107 std::map<std::string, std::vector<std::string> >::iterator it =
m_mapFields.begin();
111 m_ui->m_inputAddressComboBox->addItem(QString(it->first.c_str()));
124 std::list<te::map::AbstractLayerPtr>::iterator it = m_layers.begin();
126 while(it != m_layers.end())
128 std::auto_ptr<te::da::DataSetType> dsType = it->get()->getSchema();
129 std::vector<te::dt::Property*> properties = dsType->getProperties();
130 for(std::size_t i = 0; i < properties.size(); ++i)
132 std::string name = properties[i]->getName();
133 if(name ==
"tsvector")
134 m_ui->m_inputLayerComboBox->addItem(QString(it->get()->getTitle().c_str()), QVariant(it->get()->getId().c_str()));
143 return m_resultLayer;
148 std::list<te::map::AbstractLayerPtr>::iterator it = m_layers.begin();
150 std::string layerID = m_ui->m_inputLayerComboBox->itemData(index, Qt::UserRole).toString().toStdString();
152 while(it != m_layers.end())
154 if(layerID == it->get()->getId().c_str())
157 m_selectedLayer = selectedLayer;
159 std::auto_ptr<te::da::DataSetType> dsType = m_selectedLayer->getSchema();
160 std::vector<te::dt::Property*> propVec = dsType->getProperties();
162 m_ui->m_iLeftComboBox->clear();
163 m_ui->m_fLeftComboBox->clear();
164 m_ui->m_iRightComboBox->clear();
165 m_ui->m_fRightComboBox->clear();
167 m_ui->m_iLeftComboBox->addItem(
"");
168 m_ui->m_fLeftComboBox->addItem(
"");
169 m_ui->m_iRightComboBox->addItem(
"");
170 m_ui->m_fRightComboBox->addItem(
"");
174 for(std::size_t i = 0; i < propVec.size(); ++i)
176 type = propVec[i]->getType();
183 m_ui->m_iLeftComboBox->addItem(QString(propVec[i]->getName().c_str()));
184 m_ui->m_fLeftComboBox->addItem(QString(propVec[i]->getName().c_str()));
185 m_ui->m_iRightComboBox->addItem(QString(propVec[i]->getName().c_str()));
186 m_ui->m_fRightComboBox->addItem(QString(propVec[i]->getName().c_str()));
198 m_initialLeft = m_ui->m_iLeftComboBox->itemText(index).toStdString();
203 m_finalLeft = m_ui->m_fLeftComboBox->itemText(index).toStdString();
208 m_initialRight = m_ui->m_iRightComboBox->itemText(index).toStdString();
213 m_finalRight = m_ui->m_fRightComboBox->itemText(index).toStdString();
221 if(dlg.exec() == QDialog::Accepted)
225 m_ui->m_inputLayerComboBox->clear();
237 m_ui->m_editAddressFileToolButton->setEnabled(
false);
238 m_ui->m_removeAddressFileToolButton->setEnabled(
false);
242 GetAddressFilePathToSettings(m_mapFields);
244 std::map<std::string, std::vector<std::string> >::iterator it;
246 std::string value = m_ui->m_inputAddressComboBox->itemText(index).toStdString();
248 it = m_mapFields.find(value);
249 m_addressFile = it->first;
250 std::vector<std::string> vecFields = it->second;
252 m_associatedProps.clear();
254 for(std::size_t i = 0; i < vecFields.size(); ++i)
256 if(i != 0 && i != 2 && vecFields[i] !=
"")
257 m_associatedProps.push_back(vecFields[i]);
259 GetAddressDataSource(vecFields[i]);
261 m_streetNumber = m_mapFields.begin()->second[i];
264 m_ui->m_editAddressFileToolButton->setEnabled(
true);
265 m_ui->m_removeAddressFileToolButton->setEnabled(
true);
272 QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Open Textual File"),
te::qt::widgets::GetFilePathFromSettings(
"tabular"), tr(
"dBASE (*.dbf *.DBF);; Comma Separated Value (*.csv *.CSV)"),
273 0, QFileDialog::ReadOnly);
275 GetAddressDataSource(fileName.toStdString());
277 if (fileName.isEmpty())
282 if(m_addressDataSource)
285 if(dlg.exec() == QDialog::Accepted)
307 m_ui->m_inputAddressComboBox->addItem(QString(m_addressFile.c_str()));
312 catch(
const std::exception& e)
314 QMessageBox::warning(
this, tr(
"Address Geocoding"), e.what());
322 if(m_addressDataSource)
325 std::map<std::string, std::vector<std::string> > mapFields;
326 GetAddressFilePathToSettings(mapFields);
327 std::map<std::string, std::vector<std::string> >::iterator it;
329 std::string value = m_ui->m_inputAddressComboBox->currentText().toStdString();
331 it = mapFields.find(value);
332 m_addressFile = it->first;
333 std::vector<std::string> vecFields = it->second;
342 if(dlg.exec() == QDialog::Accepted)
364 m_ui->m_inputAddressComboBox->addItem(QString(m_addressFile.c_str()));
372 QSettings sett(QSettings::IniFormat, QSettings::UserScope, qApp->organizationName(), qApp->applicationName());
374 sett.beginGroup(
"Address Geocoding");
376 sett.remove(m_ui->m_inputAddressComboBox->currentText());
377 m_ui->m_inputAddressComboBox->removeItem(m_ui->m_inputAddressComboBox->currentIndex());
384 m_ui->m_newLayerNameLineEdit->clear();
385 m_ui->m_newLayerNameLineEdit->setEnabled(
true);
389 std::list<te::da::DataSourceInfoPtr> dsPtrList = dlg.
getSelecteds();
391 if(dsPtrList.size() <= 0)
394 std::list<te::da::DataSourceInfoPtr>::iterator it = dsPtrList.begin();
396 m_ui->m_repositoryLineEdit->setText(QString(it->get()->getTitle().c_str()));
398 m_outputDatasource = *it;
405 m_ui->m_newLayerNameLineEdit->clear();
406 m_ui->m_repositoryLineEdit->clear();
408 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save as..."),
409 QString(), tr(
"Shapefile (*.shp *.SHP);;"),0, QFileDialog::DontConfirmOverwrite);
411 if (fileName.isEmpty())
414 boost::filesystem::path outfile(fileName.toStdString());
415 std::string aux = outfile.leaf().string();
416 m_ui->m_newLayerNameLineEdit->setText(aux.c_str());
417 aux = outfile.string();
418 m_ui->m_repositoryLineEdit->setText(aux.c_str());
421 m_ui->m_newLayerNameLineEdit->setEnabled(
false);
428 QMessageBox::information(
this,
"Address Geocoding",
"Configure an input layer.");
432 if((m_initialLeft ==
"" || m_finalLeft ==
"")&&(m_initialRight ==
"" || m_finalRight ==
""))
434 QMessageBox::information(
this,
"Address Geocoding",
"Associates the number fields with attributes of input layer.");
438 if(m_addressFile ==
"")
440 QMessageBox::information(
this,
"Address Geocoding",
"Configure an input address.");
444 if(!m_layerDataSource)
452 addGeoOp->
setInput( m_layerDataSource,
453 m_selectedLayer->getTitle(),
454 m_selectedLayer->getSRID(),
466 std::string outputdataset = m_ui->m_newLayerNameLineEdit->text().toStdString();
475 boost::filesystem::path uri(m_ui->m_repositoryLineEdit->text().toStdString());
477 if (boost::filesystem::exists(uri))
479 QMessageBox::information(
this,
"Address Geocoding",
"Output file already exists. Remove it or select a new name and try again.");
483 std::size_t idx = outputdataset.find(
".");
484 if (idx != std::string::npos)
485 outputdataset=outputdataset.substr(0,idx);
487 std::map<std::string, std::string> dsinfo;
488 dsinfo[
"URI"] = uri.string();
491 outputDataSource->setConnectionInfo(dsinfo);
492 outputDataSource->open();
493 if (outputDataSource->dataSetExists(outputdataset))
495 QMessageBox::information(
this,
"Address Geocoding",
"There is already a dataset with the requested name in the output data source. Remove it or select a new name and try again.");
499 this->setCursor(Qt::WaitCursor);
507 res = addGeoOp->
run();
511 this->setCursor(Qt::ArrowCursor);
512 outputDataSource->close();
513 QMessageBox::information(
this,
"Address Geocoding",
"Error: could not generate the address geocoding.");
516 outputDataSource->close();
521 boost::uuids::basic_random_generator<boost::mt19937> gen;
522 boost::uuids::uuid u = gen();
523 std::string id_ds = boost::uuids::to_string(u);
526 ds->setConnInfo(dsinfo);
527 ds->setTitle(uri.stem().string());
528 ds->setAccessDriver(
"OGR");
530 ds->setDescription(uri.string());
536 m_outputDatasource = ds;
542 if (!outputDataSource)
544 QMessageBox::information(
this,
"Address Geocoding",
"The selected output datasource can not be accessed.");
548 if (outputDataSource->dataSetExists(outputdataset))
550 QMessageBox::information(
this,
"Address Geocoding",
"Dataset already exists. Remove it or select a new name and try again.");
553 this->setCursor(Qt::WaitCursor);
561 res = addGeoOp->
run();
567 this->setCursor(Qt::ArrowCursor);
568 outputDataSource->close();
569 QMessageBox::information(
this,
"Address Geocoding",
"Error: could not generate the address geocoding.");
572 outputDataSource->close();
582 m_resultLayer = converter(dt);
585 catch(
const std::exception& e)
587 this->setCursor(Qt::ArrowCursor);
589 QMessageBox::information(
this,
"Address Geocoding", e.what());
596 this->setCursor(Qt::ArrowCursor);
608 QSettings sett(QSettings::IniFormat, QSettings::UserScope, qApp->organizationName(), qApp->applicationName());
610 sett.beginGroup(
"Address Geocoding");
611 QStringList lst = sett.childGroups();
613 QStringList::iterator it;
615 for(it=lst.begin(); it != lst.end(); ++it)
621 std::vector<std::string> vecFields;
623 std::string fileName = sett.value(
"fileName").toString().toStdString();
624 vecFields.push_back(sett.value(
"filePath").toString().toStdString());
625 vecFields.push_back(sett.value(
"neighborhood").toString().toStdString());
626 vecFields.push_back(sett.value(
"number").toString().toStdString());
627 vecFields.push_back(sett.value(
"postalCode").toString().toStdString());
628 vecFields.push_back(sett.value(
"streetName").toString().toStdString());
629 vecFields.push_back(sett.value(
"streetTitle").toString().toStdString());
630 vecFields.push_back(sett.value(
"streetType").toString().toStdString());
632 mapFields.insert(std::pair<std::string, std::vector<std::string> >(fileName, vecFields));
641 if(QString(filePath.c_str()).isEmpty())
644 QFileInfo info(QString(filePath.c_str()));
648 std::string ogrInfo(
"connection_string=" + filePath);
649 std::map<std::string, std::string> connInfo;
650 connInfo[
"URI"] = filePath;
652 boost::filesystem::path uri(filePath);
653 std::string file = uri.stem().string();
656 static boost::uuids::basic_random_generator<boost::mt19937> gen;
657 boost::uuids::uuid u = gen();
660 dsInfo->setConnInfo(connInfo);
661 dsInfo->setId(boost::uuids::to_string(u));
662 dsInfo->setTitle(filePath);
663 dsInfo->setDescription(
"");
664 dsInfo->setAccessDriver(
"OGR");
665 dsInfo->setType(
"OGR");
670 m_addressDataSource->setConnectionInfo(dsInfo->getConnInfo());
672 m_addressDataSource->setId(boost::uuids::to_string(u));
673 m_addressDataSource->open();
void setParams(std::vector< std::string > associatedProps, std::string streetNumber)
TEDATAACCESSEXPORT DataSourcePtr GetDataSource(const std::string &datasourceId, const bool opened=true)
Search for a data source with the informed id in the DataSourceManager.
void setInput(te::da::DataSourcePtr inDsrc, std::string inDsetName, int inSRID, te::da::DataSourcePtr inAddressDsrc, std::string inAddressDsetName)
void onTargetDatasourceToolButtonPressed()
boost::shared_ptr< DataSetType > DataSetTypePtr
boost::shared_ptr< DataSource > DataSourcePtr
void onTargetFileToolButtonPressed()
void setNumAttributes(std::string initialLeft, std::string finalLeft, std::string initialRight, std::string finalRight)
void onFinalLeftComboBoxChanged(int index)
void onEditAddressToolButtonPressed()
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
const std::string & getDataSourceId() const
void onInitialRightComboBoxChanged(int index)
static std::auto_ptr< DataSource > make(const std::string &dsType)
void setOutput(te::da::DataSourcePtr outDsrc, std::string m_outDsetName)
void onOkPushButtonClicked()
void onRemoveAddressToolButtonPressed()
void onTargetFileAddressToolButtonPressed()
MainWindowDialog(QWidget *parent=0, Qt::WindowFlags f=0)
void GetAddressFilePathToSettings(std::map< std::string, std::vector< std::string > > &mapFields)
void GetAddressDataSource(std::string fileName)
void onAddressComboBoxChanged(int index)
void onLayerComboBoxChanged(int index)
void onCancelPushButtonClicked()
void setLayers(std::list< te::map::AbstractLayerPtr > layers)
Set the layer that can be used.
A class that represents a data source component.
te::map::AbstractLayerPtr getLayer()
Get the generated layer.
std::auto_ptr< Ui::MainWindowDialogForm > m_ui
A layer with reference to a dataset.
std::map< std::string, std::vector< std::string > > m_mapFields
void onConfigureLayerClicked()
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void onInitialLeftComboBoxChanged(int index)
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
void onFinalRightComboBoxChanged(int index)