All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
TL4ConverterWizard.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2011-2012 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/qt/plugins/terralib4/TL4ConverterWizard.cpp
22 
23  \brief A wizard for guiding the conversion of a TerraLib 4.x database to a OGC SFS compliant format or any other format known by OGR and GDAL.
24 */
25 
26 // TerraLib
27 #include "../../../../common/Exception.h"
28 #include "../../../../common/Translator.h"
29 #include "../../../../dataaccess.h"
30 #include "../../../../geometry/GeometryProperty.h"
31 #include "../../../../maptools/DataSetLayer.h"
32 #include "../../../../qt/widgets/datasource/selector/DataSourceSelectorWidget.h"
33 #include "../../../../qt/widgets/datasource/selector/DataSourceSelectorWizardPage.h"
34 #include "../../../../qt/widgets/layer/utils/DataSet2Layer.h"
35 #include "../../../../qt/widgets/help/HelpPushButton.h"
36 #include "../../../../qt/widgets/rp/Utils.h"
37 #include "../../../../qt/widgets/utils/ScopedCursor.h"
38 #include "../../../../qt/af/ApplicationController.h"
39 #include "../../../../qt/af/Project.h"
40 #include "../../../../qt/af/events/LayerEvents.h"
41 #include "../../../../raster/Utils.h"
42 #include "../../../../terralib4/DataSource.h"
43 #include "../../../../terralib4/ThemeInfo.h"
44 #include "../../../../se/ChannelSelection.h"
45 #include "../../../../se/ColorMap.h"
46 #include "../../../../se/FeatureTypeStyle.h"
47 #include "../../../../se/Fill.h"
48 #include "../../../../se/PolygonSymbolizer.h"
49 #include "../../../../se/RasterSymbolizer.h"
50 #include "../../../../se/Rule.h"
51 #include "../../../../se/SelectedChannel.h"
52 #include "../../../../se/Stroke.h"
53 #include "../../../../se/Style.h"
54 #include "../../../../se/Symbolizer.h"
55 #include "../../../../se/Utils.h"
56 #include "TL4ConverterWizard.h"
57 #include "TL4ConnectorWizardPage.h"
60 #include "TL4FinalPageWizardPage.h"
62 #include "Utils.h"
63 #include "ui_TL4ConverterWizardForm.h"
64 #include "ui_TL4ConnectorWizardPageForm.h"
65 #include "ui_TL4LayerSelectionWizardPageForm.h"
66 #include "ui_TL4RasterFolderSelectionWizardPageForm.h"
67 #include "ui_TL4FinalPageWizardPageForm.h"
68 #include "ui_TL4ThemeSelectionWizardPageForm.h"
69 
70 // STL
71 #include <cassert>
72 
73 // Boost
74 #include <boost/filesystem.hpp>
75 #include <boost/lexical_cast.hpp>
76 
77 // Qt
78 #include <QIcon>
79 #include <QMessageBox>
80 #include <QTableWidgetItem>
81 #include <QGridLayout>
82 
83 // TerraLib 4
84 #include <terralib4/kernel/TeLegendEntry.h>
85 #include <terralib4/kernel/TeRasterTransform.h>
86 #include <terralib4/kernel/TeTheme.h>
87 
89  : QWizard(parent, f),
90  m_hasNonRaster(false),
91  m_hasRaster(false),
92  m_rollback(false),
93  m_ui(new Ui::TL4ConverterWizardForm)
94 {
95 // setup controls
96  m_ui->setupUi(this);
97 
98 // add pages
99  m_connectorPage.reset(new TL4ConnectorWizardPage(this));
100  m_connectorPage->setTitle(tr("TerraLib 4.x Database"));
101  m_connectorPage->setSubTitle(tr("Connect to a TerraLib 4.x database."));
102 
104  m_layerSelectionPage->setTitle(tr("Layer Selection"));
105  m_layerSelectionPage->setSubTitle(tr("Select the layers to be added to the project"));
106 
108  m_datasourceSelectorPage->setTitle(tr("Target Data Source"));
109  m_datasourceSelectorPage->setSubTitle(tr("Select a data source to store the converted data"));
110  m_datasourceSelectorPage->getSelectorWidget()->setSelectionMode(QAbstractItemView::SingleSelection);
111  m_datasourceSelectorPage->getSelectorWidget()->showDataSourceWithRasterSupport(false);
112 
114  m_rasterFolderSelectionPage->setTitle(tr("Target Raster Folder"));
115  m_rasterFolderSelectionPage->setSubTitle(tr("Select folder to store raster data"));
116 
117  m_resolveNamePage.reset(new QWizardPage(this));
118  m_resolveNamePage->setTitle(tr("Resolve Name Conflicts"));
119  m_resolveNamePage->setSubTitle(tr("Some layer names clashes with target data source names. Please, give a new name for the layers showed below"));
120  m_resolveNamePage->setCommitPage(true);
121 
122  QGridLayout* displayLayout = new QGridLayout(m_resolveNamePage.get());
123  m_resolveNameTableWidget.reset(new QTableWidget(m_resolveNamePage.get()));
124  displayLayout->addWidget(m_resolveNameTableWidget.get());
125  displayLayout->setContentsMargins(0,0,0,0);
126  m_resolveNameTableWidget->setColumnCount(3);
127  QStringList labels;
128  labels << "" << tr("Source Names") << tr("Target Names");
129  m_resolveNameTableWidget->setHorizontalHeaderLabels(labels);
130 
131  m_finalPage.reset(new TL4FinalPageWizardPage(this));
132  m_finalPage->setTitle(tr("Layer Creation"));
133  m_finalPage->setSubTitle(tr("Select the TerraLib 4.x Layer converted that you want to create a TerraLib 5 Project Layer."));
134 
136  m_themeSelection->setTitle(tr("Theme Creation"));
137  m_themeSelection->setSubTitle(tr("Select the TerraLib 4.x Theme of converted Layers that you want to create a TerraLib 5 Project Layer, with informations like Visual and Grouping."));
138  m_themeSelection->setFinalPage(true);
139 
145  setPage(PAGE_FINALPAGE, m_finalPage.get());
146  setPage(PAGE_THEME_SELECTION, m_themeSelection.get());
147 
148  connect(this->button(QWizard::NextButton), SIGNAL(pressed()), this, SLOT(next()));
149  connect(this->button(QWizard::BackButton), SIGNAL(pressed()), this, SLOT(back()));
150  connect(this->button(QWizard::FinishButton), SIGNAL(pressed()), this, SLOT(finish()));
151  connect(this->button(QWizard::CommitButton), SIGNAL(pressed()), this, SLOT(commit()));
152 
154 
155  this->setButton(QWizard::HelpButton, helpButton);
156 
157  helpButton->setPageReference("plugins/terralib4/Terralib4Converter.html");
158 }
159 
161 {
162 }
163 
165 {
166  if(currentId() == PAGE_TERRALIB4_CONNECTOR)
167  return PAGE_LAYER_SELECTION;
168 
169  if(currentId() == PAGE_LAYER_SELECTION)
170  {
171  if(m_hasNonRaster)
172  return PAGE_DATASOURCE_SELECTOR;
173 
174  if(m_hasRaster)
175  return PAGE_RASTERFOLDER_SELECTOR;
176 
177  return PAGE_LAYER_SELECTION;
178  }
179 
180  if(currentId() == PAGE_DATASOURCE_SELECTOR)
181  {
182  if(m_hasRaster)
183  return PAGE_RASTERFOLDER_SELECTOR;
184 
185  return PAGE_NAME_RESOLVE_SELECTOR;
186  }
187 
188  if(currentId() == PAGE_RASTERFOLDER_SELECTOR)
189  return PAGE_NAME_RESOLVE_SELECTOR;
190 
191  if(currentId() == PAGE_NAME_RESOLVE_SELECTOR)
192  return PAGE_FINALPAGE;
193 
194  if(currentId() == PAGE_FINALPAGE)
195  return PAGE_THEME_SELECTION;
196 
197  return -1;
198 }
199 
201 {
202  int current_page_id = currentId();
203 
204  if(current_page_id == PAGE_TERRALIB4_CONNECTOR)
205  {
206  if(!validTerraLib4Connection())
207  return false;
208 
209  ::terralib4::DataSource* tl4Ds = dynamic_cast<::terralib4::DataSource*>(m_tl4Database.get());
210 
211  std::vector<std::string> layers = tl4Ds->getTL4Layers();
212  std::vector<std::string> tables = tl4Ds->getTL4Tables();
213 
214  m_layerSelectionPage->setDatasets(layers, tables);
215 
216  }
217  else if(current_page_id == PAGE_LAYER_SELECTION)
218  {
219  if(!validLayerSelection())
220  return false;
221  }
222  else if(current_page_id == PAGE_DATASOURCE_SELECTOR)
223  {
224  m_targetDataSource = *m_datasourceSelectorPage->getSelectorWidget()->getSelecteds().begin();
225  }
226  else if(current_page_id == PAGE_RASTERFOLDER_SELECTOR)
227  {
228  m_rasterFolderPath = m_rasterFolderSelectionPage->getPath();
229  }
230  else if(current_page_id == PAGE_NAME_RESOLVE_SELECTOR)
231  {
232  return !m_rollback;
233  }
234 
235  try
236  {
237  if(nextId() == PAGE_NAME_RESOLVE_SELECTOR)
238  {
239  te::qt::widgets::ScopedCursor sc(Qt::WaitCursor);
240 
241  std::vector<QListWidgetItem*> selectedLayerItems = m_layerSelectionPage->getCheckedItems();
242 
243  m_resolveNameTableWidget->clearContents();
244  m_resolveNameTableWidget->setRowCount(selectedLayerItems.size());
245 
246  te::da::DataSourcePtr tl5ds;
247 
248  if(m_hasNonRaster)
249  tl5ds = te::da::DataSourceManager::getInstance().get(m_targetDataSource->getId(), m_targetDataSource->getType(), m_targetDataSource->getConnInfo());
250 
251  bool hasConflicts = false;
252 
253  for(std::size_t i = 0; i < selectedLayerItems.size(); ++i)
254  {
255  std::string targetDatasetName = selectedLayerItems[i]->text().toStdString();
256 
257  // is it a raster?
258  std::auto_ptr<te::da::DataSetType> input_dataset_type(m_tl4Database->getDataSetType(selectedLayerItems[i]->text().toStdString()));
259 
260  if(input_dataset_type->hasRaster())
261  {
262  QTableWidgetItem *conflictItem = 0;
263 
264  if(boost::filesystem::exists(m_rasterFolderPath + "/" + targetDatasetName + ".tif"))
265  {
266  hasConflicts = true;
267 
268  conflictItem = new QTableWidgetItem(QIcon::fromTheme("delete"), "");
269  }
270  else
271  {
272  conflictItem = new QTableWidgetItem(QIcon::fromTheme("check"), "");
273  }
274 
275  conflictItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
276  m_resolveNameTableWidget->setItem(i, 0, conflictItem);
277  }
278  else
279  {
280  // non-raster
281  QTableWidgetItem *conflictItem = 0;
282 
283  if(tl5ds->dataSetExists(targetDatasetName))
284  {
285  hasConflicts = true;
286 
287  conflictItem = new QTableWidgetItem(QIcon::fromTheme("delete"), "");
288  }
289  else
290  {
291  conflictItem = new QTableWidgetItem(QIcon::fromTheme("check"), "");
292  }
293 
294  conflictItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
295  m_resolveNameTableWidget->setItem(i, 0, conflictItem);
296  }
297 
298  QTableWidgetItem *oldNameItem = new QTableWidgetItem(selectedLayerItems[i]->text(), selectedLayerItems[i]->type());
299  oldNameItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
300  m_resolveNameTableWidget->setItem(i, 1, oldNameItem);
301 
302  QTableWidgetItem *newNameItem = new QTableWidgetItem(targetDatasetName.c_str(), selectedLayerItems[i]->type());
303  m_resolveNameTableWidget->setItem(i, 2, newNameItem);
304  }
305 
306  m_resolveNameTableWidget->resizeColumnsToContents();
307  m_resolveNameTableWidget->sortByColumn(1, Qt::AscendingOrder);
308 
309  if(hasConflicts)
310  {
311  m_resolveNamePage->setTitle(tr("Resolve Name Conflicts"));
312  m_resolveNamePage->setSubTitle(tr("Some layer names clash with target data source dataset names. Please, give a new name for the layers showed below"));
313  }
314  else
315  {
316  m_resolveNamePage->setTitle(tr("No Name Conflicts"));
317  m_resolveNamePage->setSubTitle(tr("You can change the layer names in the target data source"));
318  }
319  }
320  }
321  catch(const te::da::Exception& e)
322  {
323  QMessageBox::warning(this, tr("Warning"), e.what());
324  return false;
325  }
326  catch(...)
327  {
328  QMessageBox::warning(this, tr("Warning"), tr("Could not valid this page!"));
329  return false;
330  }
331 
332  return true;
333 }
334 
336 {
337  std::map<std::string, std::string> connInfo = m_connectorPage->getConnInfo();
338 
339  try
340  {
341  te::qt::widgets::ScopedCursor sc(Qt::WaitCursor);
342  m_tl4Database = te::da::DataSourceFactory::make("TERRALIB4");
343  m_tl4Database->setConnectionInfo(connInfo);
344  m_tl4Database->open();
345  }
346  catch(const te::da::Exception& e)
347  {
348  QMessageBox::warning(this, tr("Warning"), e.what());
349  return false;
350  }
351  catch(...)
352  {
353  QMessageBox::warning(this, tr("Warning"), tr("A connection to the informed Terralib 4.x database could not be established. Please, verify the informed parameters."));
354  return false;
355  }
356 
357  return true;
358 }
359 
361 {
362  if(!m_layerSelectionPage->hasChecked())
363  {
364  // TODO: ao inves de dar esta mensagem deve-se desabilitar o botao next quando nenhum item esta selecionado!
365  QMessageBox::warning(this,
366  tr("Warning"),
367  tr("Please, select at least one layer for conversion!"));
368  return false;
369  }
370 
371  std::vector<std::string> layersNames = m_layerSelectionPage->getChecked();
372 
373 // do we have vector or raster layers?
374  m_hasNonRaster = false;
375  m_hasRaster = false;
376 
377  try
378  {
379  te::qt::widgets::ScopedCursor sc(Qt::WaitCursor);
380 
381  for(std::size_t i = 0; i < layersNames.size(); ++i)
382  {
383  std::auto_ptr<te::da::DataSetType> dst(m_tl4Database->getDataSetType(layersNames[i]));
384 
385  if(dst->hasRaster())
386  m_hasRaster = true;
387  else
388  m_hasNonRaster = true;
389  }
390  }
391  catch(const te::da::Exception& e)
392  {
393  QMessageBox::warning(this, tr("Warning"), e.what());
394  return false;
395  }
396  catch(...)
397  {
398  QMessageBox::warning(this, tr("Warning"), tr("Could not valid layer selection!"));
399  return false;
400  }
401 
402  return true;
403 }
404 
406 {
407  bool hasConflict = false;
408 
409 // TODO: acrescentar try e catch para evitar problemas
410  te::da::DataSourcePtr tl5ds;
411 
412  try
413  {
414  if(m_hasNonRaster)
415  tl5ds = te::da::DataSourceManager::getInstance().get(m_targetDataSource->getId(), m_targetDataSource->getType(), m_targetDataSource->getConnInfo());
416  }
417  catch(const te::da::Exception& e)
418  {
419  QMessageBox::warning(this, tr("Warning"), e.what());
420  return false;
421  }
422  catch(...)
423  {
424  QMessageBox::warning(this, tr("Warning"), tr("Could not connect to TerraLib 5 data source!"));
425  return false;
426  }
427 
428  int nrows = m_resolveNameTableWidget->rowCount();
429 
430  for(int i = 0; i != nrows; ++i)
431  {
432 // get original dataset name
433  QTableWidgetItem* item_source = m_resolveNameTableWidget->item(i, 1);
434 
435  if(item_source == 0)
436  throw te::common::Exception(TE_TR("Invalid source table item!"));
437 
438  std::string sourceName = item_source->text().toStdString();
439 
440 // get target dataset name
441  QTableWidgetItem* item_target = m_resolveNameTableWidget->item(i, 2);
442 
443  if(item_target == 0)
444  throw te::common::Exception(TE_TR("Invalid target table item!"));
445 
446  std::string targetName = item_target->text().toStdString();
447 
448 // ask if the dataset is a raster
449  try
450  {
451  te::qt::widgets::ScopedCursor sc(Qt::WaitCursor);
452 
453  std::auto_ptr<te::da::DataSetType> input_dataset_type(m_tl4Database->getDataSetType(sourceName));
454 
455  if(input_dataset_type->hasRaster())
456  {
457 // yes!
458  if(boost::filesystem::exists(m_rasterFolderPath + "/" + targetName + ".tif"))
459  {
460  hasConflict = true;
461  }
462  else
463  {
464  QTableWidgetItem *nonconflictItem = new QTableWidgetItem(QIcon::fromTheme("check"), "");
465 
466  m_resolveNameTableWidget->setItem(i, 0, nonconflictItem);
467  }
468  }
469  else
470  {
471 // no!
472  if(tl5ds->dataSetExists(targetName))
473  {
474  hasConflict = true;
475  }
476  else
477  {
478  QTableWidgetItem *nonconflictItem = new QTableWidgetItem(QIcon::fromTheme("check"), "");
479 
480  m_resolveNameTableWidget->setItem(i, 0, nonconflictItem);
481  }
482  }
483  }
484  catch(const te::da::Exception& e)
485  {
486  QMessageBox::warning(this, tr("Warning"), e.what());
487  return false;
488  }
489  catch(...)
490  {
491  QMessageBox::warning(this, tr("Warning"), tr("Could not valid layer names in target data source!"));
492  return false;
493  }
494  }
495 
496  if(hasConflict)
497  {
498  QString errMsg(tr("There still have name conflicts. Please, resolve the indicated conflicts before continue!"));
499 
500  QMessageBox::warning(this, tr("TerraLib 4.x Converter"), errMsg);
501 
502  return false;
503  }
504 
505  return true;
506 }
507 
508 std::string te::qt::plugins::terralib4::TL4ConverterWizard::getOriginalName(const std::string& targetName)
509 {
510  int rowCount = m_resolveNameTableWidget->rowCount();
511 
512  for(int i = 0; i < rowCount; ++i)
513  {
514  QString targetNameInTable = m_resolveNameTableWidget->item(i, 2)->text();
515 
516  if(targetName.c_str() == targetNameInTable)
517  return m_resolveNameTableWidget->item(i, 1)->text().toStdString();
518 
519  }
520 
521  return "";
522 }
523 
524 std::string te::qt::plugins::terralib4::TL4ConverterWizard::getNewName(const std::string& originalName)
525 {
526  int rowCount = m_resolveNameTableWidget->rowCount();
527 
528  for(int i = 0; i < rowCount; ++i)
529  {
530  QString oName = m_resolveNameTableWidget->item(i, 1)->text();
531 
532  if(originalName.c_str() == oName)
533  return m_resolveNameTableWidget->item(i, 2)->text().toStdString();
534  }
535 
536  return "";
537 }
538 
540 {
541  QWizard::back();
542 }
543 
545 {
546  QWizard::next();
547 }
548 
550 {
551  if(!validLayerNames())
552  {
553  m_rollback = true;
554  return;
555  }
556 
557 // validation successful => convert the source layers!
558  std::vector<std::pair<std::string, std::string> > problematicDatasets;
559  std::vector<std::string> successfulDatasets;
560 
561  te::da::DataSourcePtr tl5ds;
562 
563  try
564  {
565  if(m_hasNonRaster)
566  tl5ds = te::da::DataSourceManager::getInstance().get(m_targetDataSource->getId(), m_targetDataSource->getType(), m_targetDataSource->getConnInfo());
567  }
568  catch(const te::da::Exception& e)
569  {
570  m_rollback = true;
571  QMessageBox::warning(this, tr("Warning"), e.what());
572  return;
573  }
574  catch(...)
575  {
576  m_rollback = true;
577  QMessageBox::warning(this, tr("Warning"), tr("Could not connect to TerraLib 5 data source!"));
578  return;
579  }
580 
581  int nrows = m_resolveNameTableWidget->rowCount();
582 
583  for(int i = 0; i != nrows; ++i)
584  {
585 // get original dataset name
586  QTableWidgetItem* item_source = m_resolveNameTableWidget->item(i, 1);
587 
588  if(item_source == 0)
589  throw te::common::Exception(TE_TR("Invalid source table item!"));
590 
591  std::string sourceName = item_source->text().toStdString();
592 
593 // get target dataset name
594  QTableWidgetItem* item_target = m_resolveNameTableWidget->item(i, 2);
595 
596  if(item_target == 0)
597  throw te::common::Exception(TE_TR("Invalid target table item!"));
598 
599  std::string targetName = item_target->text().toStdString();
600 
601 // ask if the dataset is a raster
602  try
603  {
604  te::qt::widgets::ScopedCursor sc(Qt::WaitCursor);
605 
606  std::auto_ptr<te::da::DataSetType> input_dataset_type(m_tl4Database->getDataSetType(sourceName));
607 
608  if(input_dataset_type->hasRaster())
609  {
610 // yes!
611  std::auto_ptr<te::da::DataSet> ds = m_tl4Database->getDataSet(sourceName);
612 
613  std::auto_ptr<te::rst::Raster> raster = ds->getRaster("Raster");
614 
615  std::string newName = m_rasterFolderPath + "/" + targetName + ".tif";
616 
617  te::rst::CreateCopy(*raster.release(), newName);
618 
619  successfulDatasets.push_back(targetName);
620  }
621  else
622  {
623 // no!
624  input_dataset_type->setName(targetName);
625 
626  std::auto_ptr<te::da::DataSetTypeConverter> dt_adapter(new te::da::DataSetTypeConverter(input_dataset_type.get(), tl5ds->getCapabilities()));
627 
628  std::auto_ptr<te::da::DataSet> ds(m_tl4Database->getDataSet(sourceName));
629 
630  std::auto_ptr<te::da::DataSetAdapter> ds_adapter(new te::da::DataSetAdapter(ds.get()));//te::da::CreateAdapter(ds.get(), dt_adapter.get()));
631 
632  const std::vector<std::vector<std::size_t> >& indexes = dt_adapter->getConvertedPropertyIndexes();
633  const std::vector<te::da::AttributeConverter>& funcs = dt_adapter->getConverters();
634 
635  te::da::DataSetType* type = dt_adapter->getResult();
636 
637  te::common::CharEncoding encTo = tl5ds->getEncoding();
638 
639  for(std::size_t i = 0; i < type->size(); ++i)
640  {
641  te::dt::Property* p = type->getProperty(i);
642 
643  if(p->getType() == te::dt::STRING_TYPE)
644  {
645  te::da::CharEncodingConverter conversor(encTo);
646  ds_adapter->add(p->getName(), p->getType(), indexes[i], conversor);
647  }
648  else
649  {
650  ds_adapter->add(p->getName(), p->getType(), indexes[i], funcs[i]);
651  }
652  }
653 
654  ::terralib4::DataSource* tl4Ds = dynamic_cast<::terralib4::DataSource*>(m_tl4Database.get());
655 
656  int finalSrid = tl4Ds->getLayerSRID(targetName);
657 
658  if(finalSrid == 4979)
659  finalSrid = 4326;
660 
661  ds_adapter->setSRID(finalSrid);
662 
663  std::map<std::string, std::string> opt;
664 
665  ds_adapter->moveBeforeFirst();
666 
667  te::da::Create(tl5ds.get(), dt_adapter->getResult(), ds_adapter.get(), opt);
668 
669  successfulDatasets.push_back(targetName);
670  }
671  }
672  catch(const te::common::Exception& e)
673  {
674  std::pair<std::string, std::string> dproblem;
675  dproblem.first = sourceName;
676  dproblem.second = e.what();
677 
678  problematicDatasets.push_back(dproblem);
679  }
680  catch(...)
681  {
682  std::pair<std::string, std::string> dproblem;
683  dproblem.first = sourceName;
684  dproblem.second = TE_TR("unknown problem in conversion!");
685 
686  problematicDatasets.push_back(dproblem);
687  }
688  }
689 
690 // give a warning
691  if(!problematicDatasets.empty())
692  {
693  QString error(tr("Some TerraLib 4.x Layers could not be converted: \n\n"));
694  QString details;
695 
696  for(std::size_t i = 0; i < problematicDatasets.size(); ++i)
697  {
698  error.append(QString(" - ") + problematicDatasets[i].first.c_str() + QString(""));
699  details.append(problematicDatasets[i].first.c_str() + QString(":\n"));
700  details.append(problematicDatasets[i].second.c_str() + QString("\n\n"));
701  }
702 
703  QMessageBox message(QMessageBox::Warning, tr("TerraLib 4.x Converter"), error, QMessageBox::Ok, this);
704  message.setDetailedText(details);
705 
706  message.exec();
707  }
708 
709 // fill next page!
710  ::terralib4::DataSource* tl4Ds = dynamic_cast<::terralib4::DataSource*>(m_tl4Database.get());
711 
712  m_finalPage->setDataSets(successfulDatasets);
713 
714  std::vector<::terralib4::ThemeInfo> themes = tl4Ds->getTL4Themes();
715 
716  std::vector<::terralib4::ThemeInfo> convertedThemes;
717  for(std::size_t i = 0; i < themes.size(); ++i)
718  {
719  for(std::size_t j = 0; j < successfulDatasets.size(); ++j)
720  {
721  if(themes[i].m_layerName == getOriginalName(successfulDatasets[j]))
722  {
723  convertedThemes.push_back(themes[i]);
724  }
725  }
726  }
727 
728  m_themeSelection->setThemes(convertedThemes);
729 
730  m_rollback = false;
731 }
732 
734 {
735  std::vector<std::string> selected = m_finalPage->getSelected();
736 
737  te::da::DataSourcePtr outDataSource;
738 
739  try
740  {
741  if(m_hasNonRaster)
742  outDataSource = te::da::DataSourceManager::getInstance().find(m_targetDataSource->getId());
743  }
744  catch(const te::da::Exception& e)
745  {
746  m_rollback = true;
747  QMessageBox::warning(this, tr("Warning"), e.what());
748  return;
749  }
750  catch(...)
751  {
752  m_rollback = true;
753  QMessageBox::warning(this, tr("Warning"), tr("Could not connect to TerraLib 5 data source!"));
754  return;
755  }
756 
757  try
758  {
759  te::qt::widgets::ScopedCursor sc(Qt::WaitCursor);
760 
761  for(std::size_t i = 0; i < selected.size(); ++i)
762  {
763  te::map::AbstractLayerPtr layer = 0;
764 
765  std::auto_ptr<te::da::DataSetType> sourceDt = m_tl4Database->getDataSetType(getOriginalName(selected[i]));
766 
767  if(sourceDt->hasRaster())
768  {
769  std::map<std::string, std::string> connInfo;
770  connInfo["URI"] = m_rasterFolderPath + "/" + selected[i] + ".tif";
771 
772  layer = te::qt::widgets::createLayer("GDAL", connInfo);
773  }
774  else
775  {
776  te::qt::widgets::DataSet2Layer converter(m_targetDataSource->getId());
777 
778  std::auto_ptr<te::da::DataSetType> dsType = outDataSource->getDataSetType(selected[i]);
779 
780  te::da::DataSetTypePtr dt(dsType.release());
781 
782  layer = converter(dt);
783  }
784 
785  te::qt::af::evt::LayerAdded evt(layer);
786 
788  }
789 
790  std::vector<::terralib4::ThemeInfo> themes = m_themeSelection->getThemes();
791 
792  for(std::size_t i = 0; i < themes.size(); ++i)
793  {
794  te::map::AbstractLayerPtr layer = 0;
795 
796  std::string newName = getNewName(themes[i].m_layerName);
797 
798  std::auto_ptr<te::da::DataSetType> sourceDt = m_tl4Database->getDataSetType(newName);
799 
800  ::terralib4::DataSource* tl4Ds = dynamic_cast<::terralib4::DataSource*>(m_tl4Database.get());
801 
802  TeTheme* theme = tl4Ds->getTL4Theme(themes[i]);
803 
804  te::se::Style* style = 0;
805 
806  if(sourceDt->hasRaster())
807  {
808  std::map<std::string, std::string> connInfo;
809  connInfo["URI"] = m_rasterFolderPath + "/" + themes[i].m_name + ".tif";
810 
811  layer = te::qt::widgets::createLayer("GDAL", connInfo);
812 
813  style = Convert2TerraLib5(0, theme, true);
814 
816 
817  if(theme->grouping().groupMode_ != TeNoGrouping)
818  {
819  te::se::ColorMap* cm = 0;
820 
821  cm = GetRasterGrouping(theme);
822 
823  symb->setColorMap(cm);
824 
825  std::string band = "0";
826 
828 
829  if(cs->getGrayChannel())
830  {
831  te::se::SelectedChannel* scGray = cs->getGrayChannel();
832 
833  scGray->setSourceChannelName(band);
834  }
835  else
836  {
838 
839  scGray->setSourceChannelName(band);
840 
841  cs->setGrayChannel(scGray);
842  }
843 
845  }
846  }
847  else
848  {
849  std::auto_ptr<te::da::DataSetType> dst = outDataSource->getDataSetType(getNewName(themes[i].m_layerName));
850 
851  te::qt::widgets::DataSet2Layer converter(m_targetDataSource->getId());
852 
853  te::da::DataSetTypePtr dstPtr(dst.release());
854 
855  layer = converter(dstPtr);
856  layer->setTitle(themes[i].m_name);
857 
858  // Get Style
859  te::gm::GeometryProperty* geomProp = te::da::GetFirstGeomProperty(dstPtr.get());
860 
861  style = Convert2TerraLib5(geomProp->getGeometryType(), theme);
862 
863  if(theme->grouping().groupMode_ != TeNoGrouping)
864  layer->setGrouping(GetGrouping(theme));
865  }
866 
867  layer->setStyle(style->clone());
868 
869  delete style;
870 
871  te::qt::af::evt::LayerAdded evt(layer);
872 
874  }
875  }
876  catch(const te::da::Exception& e)
877  {
878  m_rollback = true;
879  QMessageBox::warning(this, tr("Warning"), e.what());
880  return;
881  }
882  catch(...)
883  {
884  m_rollback = true;
885  QMessageBox::warning(this, tr("Warning"), tr("Automatic layer creation failed!"));
886  return;
887  }
888 }
889 
891 {
892  QMessageBox::warning(this,
893  tr("TerraLib 4.x Converter"),
894  tr("This option is not implemented yet!\nWe will provide it soon!"));
895 }
896 
897 
898 
899 
900 
901 
902 
Property * getProperty(std::size_t i) const
It returns the i-th property.
This event signals that a new layer was created.
Definition: LayerEvents.h:66
A selected channel to be display.
Geometric property.
te::color::RGBAColor Convert2TerraLib5(TeColor color)
Definition: Utils.cpp:68
std::auto_ptr< te::qt::widgets::DataSourceSelectorWizardPage > m_datasourceSelectorPage
boost::shared_ptr< DataSetType > DataSetTypePtr
Definition: DataSetType.h:653
The Style defines the styling that is to be applied to a geographic dataset (vector geometries or cov...
Definition: Style.h:65
CharEncoding
Supported charsets (character encoding).
std::string getNewName(const std::string &originalName)
te::map::Grouping * GetGrouping(TeTheme *theme)
Definition: Utils.cpp:314
std::auto_ptr< TL4ThemeSelectionWizardPage > m_themeSelection
std::string * m_name
It allows the style to be referenced. Names must be unique in the context in which they are defined...
Definition: Style.h:133
boost::shared_ptr< DataSource > DataSourcePtr
Definition: DataSource.h:1435
A class that models the description of a dataset.
Definition: DataSetType.h:72
std::auto_ptr< Ui::TL4ConverterWizardForm > m_ui
void setPageReference(const QString &ref)
Sets the documentation page reference.
virtual const char * what() const
It outputs the exception message.
Definition: Exception.cpp:58
TESEEXPORT RasterSymbolizer * GetRasterSymbolizer(Style *s)
Try to get raster symbolizer from a style.
Definition: Utils.cpp:371
TERASTEREXPORT te::rst::RasterPtr CreateCopy(const te::rst::Raster &rin, const std::string &uri, const std::string &rType=std::string("GDAL"))
Create a new raster from existing one.
Definition: Utils.cpp:303
te::se::ChannelSelection * getChannelSelection() const
TeTheme * getTL4Theme(const ::terralib4::ThemeInfo theme)
Definition: DataSource.cpp:225
void setGrayChannel(SelectedChannel *c)
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:345
It models a property definition.
Definition: Property.h:59
An converter for DataSetType.
A wizard page that provides the capability of connecting to a TerraLib 4.x database.
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
TEDATAACCESSEXPORT void Create(DataSource *ds, DataSetType *dt, DataSet *d, std::size_t limit=0)
It creates the dataset definition in a data source and then fill it with data from the input dataset...
Definition: Utils.cpp:577
static std::auto_ptr< DataSource > make(const std::string &dsType)
void setColorCompositionType(ColorCompositionType cct)
GeomType getGeometryType() const
It returns the geometry subtype allowed for the property.
The RasterSymbolizer describes how to render raster/matrix-coverage data (e.g., satellite photos...
std::size_t size() const
It returns the number of properties of the CompositeProperty.
std::vector< std::string > getTL4Tables()
Definition: DataSource.cpp:201
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
Definition: Exception.h:58
std::auto_ptr< TL4ConnectorWizardPage > m_connectorPage
virtual Style * clone() const =0
It creates a new copy of this object.
int getType() const
It returns the property data type.
Definition: Property.h:143
std::vector<::terralib4::ThemeInfo > getTL4Themes()
Definition: DataSource.cpp:213
Push button that uses te::qt::widgets::HelpManager on its mouse pressed implementation.
void setColorMap(ColorMap *c)
void setSourceChannelName(const std::string &name)
int getLayerSRID(const std::string &layerName)
Definition: DataSource.cpp:237
std::auto_ptr< QTableWidget > m_resolveNameTableWidget
TL4ConverterWizard(QWidget *parent=0, Qt::WindowFlags f=0)
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
Definition: Utils.cpp:508
te::se::ColorMap * GetRasterGrouping(TeTheme *theme)
Definition: Utils.cpp:379
SelectedChannel * getGrayChannel() const
std::auto_ptr< TL4FinalPageWizardPage > m_finalPage
std::string getOriginalName(const std::string &targetName)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
TEQTWIDGETSEXPORT te::map::AbstractLayerPtr createLayer(const std::string &driverName, const std::map< std::string, std::string > &connInfo)
Definition: Utils.cpp:40
An adapter for DataSet.
std::auto_ptr< TL4LayerSelectionWizardPage > m_layerSelectionPage
A ColorMap defines either the colors of a pallette-type raster source or the mapping of numeric pixel...
Definition: ColorMap.h:60
std::auto_ptr< TL4RasterFolderSelectionWizardPage > m_rasterFolderSelectionPage
An object that when created shows a cursor during its scope.
Definition: ScopedCursor.h:48
ChannelSelection specifies the false-color channel selection for a multi-spectral raster source (such...
std::vector< std::string > getTL4Layers()
Definition: DataSource.cpp:189
const std::string & getName() const
It returns the property name.
Definition: Property.h:126