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"));
105 std::map<std::string, std::vector<std::string> >::iterator it =
m_mapFields.begin();
109 m_ui->m_inputAddressComboBox->addItem(QString(it->first.c_str()));
122 std::list<te::map::AbstractLayerPtr>::iterator it = m_layers.begin();
124 while(it != m_layers.end())
126 std::auto_ptr<te::da::DataSetType> dsType = it->get()->getSchema();
127 std::vector<te::dt::Property*> properties = dsType->getProperties();
128 for(std::size_t i = 0; i < properties.size(); ++i)
130 std::string name = properties[i]->getName();
131 if(name ==
"tsvector")
132 m_ui->m_inputLayerComboBox->addItem(QString(it->get()->getTitle().c_str()), QVariant(it->get()->getId().c_str()));
141 return m_resultLayer;
146 std::list<te::map::AbstractLayerPtr>::iterator it = m_layers.begin();
148 std::string layerID = m_ui->m_inputLayerComboBox->itemData(index, Qt::UserRole).toString().toStdString();
150 while(it != m_layers.end())
152 if(layerID == it->get()->getId().c_str())
155 m_selectedLayer = selectedLayer;
157 std::auto_ptr<te::da::DataSetType> dsType = m_selectedLayer->getSchema();
158 std::vector<te::dt::Property*> propVec = dsType->getProperties();
160 m_ui->m_iLeftComboBox->clear();
161 m_ui->m_fLeftComboBox->clear();
162 m_ui->m_iRightComboBox->clear();
163 m_ui->m_fRightComboBox->clear();
165 m_ui->m_iLeftComboBox->addItem(
"");
166 m_ui->m_fLeftComboBox->addItem(
"");
167 m_ui->m_iRightComboBox->addItem(
"");
168 m_ui->m_fRightComboBox->addItem(
"");
172 for(std::size_t i = 0; i < propVec.size(); ++i)
174 type = propVec[i]->getType();
181 m_ui->m_iLeftComboBox->addItem(QString(propVec[i]->getName().c_str()));
182 m_ui->m_fLeftComboBox->addItem(QString(propVec[i]->getName().c_str()));
183 m_ui->m_iRightComboBox->addItem(QString(propVec[i]->getName().c_str()));
184 m_ui->m_fRightComboBox->addItem(QString(propVec[i]->getName().c_str()));
196 m_initialLeft = m_ui->m_iLeftComboBox->itemText(index).toStdString();
201 m_finalLeft = m_ui->m_fLeftComboBox->itemText(index).toStdString();
206 m_initialRight = m_ui->m_iRightComboBox->itemText(index).toStdString();
211 m_finalRight = m_ui->m_fRightComboBox->itemText(index).toStdString();
219 if(dlg.exec() == QDialog::Accepted)
223 m_ui->m_inputLayerComboBox->clear();
235 m_ui->m_editAddressFileToolButton->setEnabled(
false);
236 m_ui->m_removeAddressFileToolButton->setEnabled(
false);
240 GetAddressFilePathToSettings(m_mapFields);
242 std::map<std::string, std::vector<std::string> >::iterator it;
244 std::string value = m_ui->m_inputAddressComboBox->itemText(index).toStdString();
246 it = m_mapFields.find(value);
247 m_addressFile = it->first;
248 std::vector<std::string> vecFields = it->second;
250 m_associatedProps.clear();
252 for(std::size_t i = 0; i < vecFields.size(); ++i)
254 if(i != 0 && i != 2 && vecFields[i] !=
"")
255 m_associatedProps.push_back(vecFields[i]);
257 GetAddressDataSource(vecFields[i]);
259 m_streetNumber = m_mapFields.begin()->second[i];
262 m_ui->m_editAddressFileToolButton->setEnabled(
true);
263 m_ui->m_removeAddressFileToolButton->setEnabled(
true);
270 QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Open Textual File"),
te::qt::widgets::GetFilePathFromSettings(
"tabular"), tr(
"dBASE (*.dbf *.DBF);; Comma Separated Value (*.csv *.CSV)"),
271 0, QFileDialog::ReadOnly);
273 GetAddressDataSource(fileName.toStdString());
275 if (fileName.isEmpty())
280 if(m_addressDataSource)
283 if(dlg.exec() == QDialog::Accepted)
305 m_ui->m_inputAddressComboBox->addItem(QString(m_addressFile.c_str()));
310 catch(
const std::exception& e)
312 QMessageBox::warning(
this, tr(
"Address Geocoding"), e.what());
320 if(m_addressDataSource)
323 std::map<std::string, std::vector<std::string> > mapFields;
324 GetAddressFilePathToSettings(mapFields);
325 std::map<std::string, std::vector<std::string> >::iterator it;
327 std::string value = m_ui->m_inputAddressComboBox->currentText().toStdString();
329 it = mapFields.find(value);
330 m_addressFile = it->first;
331 std::vector<std::string> vecFields = it->second;
340 if(dlg.exec() == QDialog::Accepted)
362 m_ui->m_inputAddressComboBox->addItem(QString(m_addressFile.c_str()));
370 QSettings sett(QSettings::IniFormat, QSettings::UserScope, qApp->organizationName(), qApp->applicationName());
372 sett.beginGroup(
"Address Geocoding");
374 sett.remove(m_ui->m_inputAddressComboBox->currentText());
375 m_ui->m_inputAddressComboBox->removeItem(m_ui->m_inputAddressComboBox->currentIndex());
382 m_ui->m_newLayerNameLineEdit->clear();
383 m_ui->m_newLayerNameLineEdit->setEnabled(
true);
387 std::list<te::da::DataSourceInfoPtr> dsPtrList = dlg.
getSelecteds();
389 if(dsPtrList.size() <= 0)
392 std::list<te::da::DataSourceInfoPtr>::iterator it = dsPtrList.begin();
394 m_ui->m_repositoryLineEdit->setText(QString(it->get()->getTitle().c_str()));
396 m_outputDatasource = *it;
403 m_ui->m_newLayerNameLineEdit->clear();
404 m_ui->m_repositoryLineEdit->clear();
406 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save as..."),
407 QString(), tr(
"Shapefile (*.shp *.SHP);;"),0, QFileDialog::DontConfirmOverwrite);
409 if (fileName.isEmpty())
412 boost::filesystem::path outfile(fileName.toStdString());
413 std::string aux = outfile.leaf().string();
414 m_ui->m_newLayerNameLineEdit->setText(aux.c_str());
415 aux = outfile.string();
416 m_ui->m_repositoryLineEdit->setText(aux.c_str());
419 m_ui->m_newLayerNameLineEdit->setEnabled(
false);
424 QMessageBox::information(
this,
"Help",
"Under development");
431 QMessageBox::information(
this,
"Address Geocoding",
"Configure an input layer.");
435 if((m_initialLeft ==
"" || m_finalLeft ==
"")&&(m_initialRight ==
"" || m_finalRight ==
""))
437 QMessageBox::information(
this,
"Address Geocoding",
"Associates the number fields with attributes of input layer.");
441 if(m_addressFile ==
"")
443 QMessageBox::information(
this,
"Address Geocoding",
"Configure an input address.");
447 if(!m_layerDataSource)
455 addGeoOp->
setInput( m_layerDataSource,
456 m_selectedLayer->getTitle(),
457 m_selectedLayer->getSRID(),
469 std::string outputdataset = m_ui->m_newLayerNameLineEdit->text().toStdString();
478 boost::filesystem::path uri(m_ui->m_repositoryLineEdit->text().toStdString());
480 if (boost::filesystem::exists(uri))
482 QMessageBox::information(
this,
"Address Geocoding",
"Output file already exists. Remove it or select a new name and try again.");
486 std::size_t idx = outputdataset.find(
".");
487 if (idx != std::string::npos)
488 outputdataset=outputdataset.substr(0,idx);
490 std::map<std::string, std::string> dsinfo;
491 dsinfo[
"URI"] = uri.string();
494 outputDataSource->setConnectionInfo(dsinfo);
495 outputDataSource->open();
496 if (outputDataSource->dataSetExists(outputdataset))
498 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.");
502 this->setCursor(Qt::WaitCursor);
510 res = addGeoOp->
run();
514 this->setCursor(Qt::ArrowCursor);
515 outputDataSource->close();
516 QMessageBox::information(
this,
"Address Geocoding",
"Error: could not generate the address geocoding.");
519 outputDataSource->close();
524 boost::uuids::basic_random_generator<boost::mt19937> gen;
525 boost::uuids::uuid u = gen();
526 std::string id_ds = boost::uuids::to_string(u);
529 ds->setConnInfo(dsinfo);
530 ds->setTitle(uri.stem().string());
531 ds->setAccessDriver(
"OGR");
533 ds->setDescription(uri.string());
539 m_outputDatasource = ds;
545 if (!outputDataSource)
547 QMessageBox::information(
this,
"Address Geocoding",
"The selected output datasource can not be accessed.");
551 if (outputDataSource->dataSetExists(outputdataset))
553 QMessageBox::information(
this,
"Address Geocoding",
"Dataset already exists. Remove it or select a new name and try again.");
556 this->setCursor(Qt::WaitCursor);
564 res = addGeoOp->
run();
570 this->setCursor(Qt::ArrowCursor);
571 outputDataSource->close();
572 QMessageBox::information(
this,
"Address Geocoding",
"Error: could not generate the address geocoding.");
575 outputDataSource->close();
585 m_resultLayer = converter(dt);
588 catch(
const std::exception& e)
590 this->setCursor(Qt::ArrowCursor);
592 QMessageBox::information(
this,
"Address Geocoding", e.what());
599 this->setCursor(Qt::ArrowCursor);
611 QSettings sett(QSettings::IniFormat, QSettings::UserScope, qApp->organizationName(), qApp->applicationName());
613 sett.beginGroup(
"Address Geocoding");
614 QStringList lst = sett.childGroups();
616 QStringList::iterator it;
618 for(it=lst.begin(); it != lst.end(); ++it)
624 std::vector<std::string> vecFields;
626 std::string fileName = sett.value(
"fileName").toString().toStdString();
627 vecFields.push_back(sett.value(
"filePath").toString().toStdString());
628 vecFields.push_back(sett.value(
"neighborhood").toString().toStdString());
629 vecFields.push_back(sett.value(
"number").toString().toStdString());
630 vecFields.push_back(sett.value(
"postalCode").toString().toStdString());
631 vecFields.push_back(sett.value(
"streetName").toString().toStdString());
632 vecFields.push_back(sett.value(
"streetTitle").toString().toStdString());
633 vecFields.push_back(sett.value(
"streetType").toString().toStdString());
635 mapFields.insert(std::pair<std::string, std::vector<std::string> >(fileName, vecFields));
644 if(QString(filePath.c_str()).isEmpty())
647 QFileInfo info(QString(filePath.c_str()));
651 std::string ogrInfo(
"connection_string=" + filePath);
652 std::map<std::string, std::string> connInfo;
653 connInfo[
"URI"] = filePath;
655 boost::filesystem::path uri(filePath);
656 std::string file = uri.stem().string();
659 static boost::uuids::basic_random_generator<boost::mt19937> gen;
660 boost::uuids::uuid u = gen();
663 dsInfo->setConnInfo(connInfo);
664 dsInfo->setId(boost::uuids::to_string(u));
665 dsInfo->setTitle(filePath);
666 dsInfo->setDescription(
"");
667 dsInfo->setAccessDriver(
"OGR");
668 dsInfo->setType(
"OGR");
673 m_addressDataSource->setConnectionInfo(dsInfo->getConnInfo());
675 m_addressDataSource->setId(boost::uuids::to_string(u));
676 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 onHelpPushButtonClicked()
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
A main window to address geocoding operation.
void onConfigureLayerClicked()
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void onInitialLeftComboBoxChanged(int index)
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
void onFinalRightComboBoxChanged(int index)