All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
MixtureModelWizardPage.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 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/widgets/rp/MixtureModelWizardPage.cpp
22 
23  \brief This file defines a class for a Mixture Model Wizard page.
24 */
25 
26 // TerraLib
27 #include "../../../common/STLUtils.h"
28 #include "../../../dataaccess/dataset/DataSet.h"
29 #include "../../../dataaccess/utils/Utils.h"
30 #include "../../../geometry/Point.h"
31 #include "../../../maptools/MarkRendererManager.h"
32 #include "../../../raster/Raster.h"
33 #include "../../../rp/MixtureModel.h"
34 #include "../../../rp/MixtureModelLinearStrategy.h"
35 #include "../../../rp/MixtureModelPCAStrategy.h"
36 #include "../../../rp/Functions.h"
37 #include "../../../se/Fill.h"
38 #include "../../../se/Mark.h"
39 #include "../../../se/Stroke.h"
40 #include "../../../se/Utils.h"
41 #include "../canvas/Canvas.h"
42 #include "../canvas/MapDisplay.h"
43 #include "MixtureModelWizardPage.h"
44 #include "RasterNavigatorWidget.h"
45 #include "RasterNavigatorDialog.h"
46 #include "ui_MixtureModelWizardPageForm.h"
47 
48 // Qt
49 #include <QFileDialog>
50 #include <QGridLayout>
51 #include <QMessageBox>
52 
53 // Boost
54 #include <boost/foreach.hpp>
55 #include <boost/property_tree/ptree.hpp>
56 #include <boost/property_tree/json_parser.hpp>
57 #include <boost/uuid/random_generator.hpp>
58 #include <boost/uuid/uuid_io.hpp>
59 
60 //STL
61 #include <fstream>
62 #include <memory>
63 
64 #define PATTERN_SIZE 12
65 
67  : QWizardPage(parent),
68  m_ui(new Ui::MixtureModelWizardPageForm),
69  m_countComponents(0),
70  m_layer(0)
71 {
72 // setup controls
73  m_ui->setupUi(this);
74 
75  m_ui->m_loadToolButton->setIcon(QIcon::fromTheme("document-open"));
76  m_ui->m_saveToolButton->setIcon(QIcon::fromTheme("document-save"));
77 
79 
80 //define mark
81  te::se::Stroke* stroke = te::se::CreateStroke("#000000", "1");
82  te::se::Fill* fill = te::se::CreateFill("#FF0000", "1.0");
83  m_mark = te::se::CreateMark("cross", stroke, fill);
84 
86 
87 //connects
88  connect(m_ui->m_tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(onItemChanged(QTableWidgetItem*)));
89  connect(m_ui->m_removeToolButton, SIGNAL(clicked()), this, SLOT(onRemoveToolButtonClicked()));
90  connect(m_ui->m_acquireToolButton, SIGNAL(toggled(bool)), this, SLOT(showNavigator(bool)));
91  connect(m_ui->m_loadToolButton, SIGNAL(clicked()), this, SLOT(onLoadToolButtonClicked()));
92  connect(m_ui->m_saveToolButton, SIGNAL(clicked()), this, SLOT(onSaveToolButtonClicked()));
93 
94 
95  //configure raster navigator
96  m_navigatorDlg.reset(new te::qt::widgets::RasterNavigatorDialog(this, Qt::Tool));
97  m_navigatorDlg->setWindowTitle(tr("Display"));
98  m_navigatorDlg->setMinimumSize(550, 400);
99  m_navigatorDlg->getWidget()->hideGeomTool(true);
100  m_navigatorDlg->getWidget()->hideInfoTool(true);
101  m_navigatorDlg->getWidget()->hideBoxTool(true);
102 
103  //connects
104  connect(m_navigatorDlg.get(), SIGNAL(navigatorClosed()), this, SLOT(onNavigatorClosed()));
105  connect(m_navigatorDlg->getWidget(), SIGNAL(mapDisplayExtentChanged()), this, SLOT(onMapDisplayExtentChanged()));
106  connect(m_navigatorDlg->getWidget(), SIGNAL(pointPicked(double, double)), this, SLOT(onPointPicked(double, double)));
107 
108 // configure page
109  this->setTitle(tr("Mixture Model"));
110  this->setSubTitle(tr("Select the type of mixture model and set their specific parameters."));
111 
112  m_ui->m_removeToolButton->setIcon(QIcon::fromTheme("list-remove"));
113  m_ui->m_acquireToolButton->setIcon(QIcon::fromTheme("wand"));
114 }
115 
117 {
118  m_components.clear();
119 
120  te::common::Free(m_rgbaMark, PATTERN_SIZE);
121 
122  delete m_mark;
123 }
124 
126 {
127  if(m_ui->m_tableWidget->rowCount() == 0)
128  return false;
129 
130  int nBands = m_ui->m_bandTableWidget->rowCount();
131 
132  bool isChecked = false;
133 
134  std::size_t count = 0;
135  for(int i = 0; i < nBands; ++i)
136  {
137  QCheckBox* checkBox = (QCheckBox*)m_ui->m_bandTableWidget->cellWidget(i, 0);
138 
139  if(checkBox->isChecked())
140  {
141  isChecked = true;
142  ++count;
143  }
144  }
145 
146  if(!isChecked)
147  return false;
148 
149  if(count != m_components.size())
150  return false;
151 
152  return true;
153 }
154 
156 {
157  m_layer = layer;
158 
159  m_navigatorDlg->set(m_layer);
160 
161  listBands();
162 }
163 
165 {
166  return m_layer;
167 }
168 
170 {
171  int idx = m_ui->m_typeComboBox->currentIndex();
172  int type = m_ui->m_typeComboBox->itemData(idx).toInt();
173 
175 
176  if(type == MIXMODEL_LINEAR)
177  {
178  algoInputParams.m_strategyName = "linear";
179 
181  algoInputParams.setMixtureModelStrategyParams(specificParameters);
182  }
183  else if(type == MIXMODEL_PCA)
184  {
185  algoInputParams.m_strategyName = "pca";
186 
188  algoInputParams.setMixtureModelStrategyParams(specificParameters);
189  }
190 
191 // insert selected bands
192  unsigned selectedBands = 0;
193  std::vector<bool> selectedBandsVector;
194 
195  for (int i = 0; i < m_ui->m_bandTableWidget->rowCount(); ++i)
196  {
197  QCheckBox* bandCheckBox = (QCheckBox*) m_ui->m_bandTableWidget->cellWidget(i, 0);
198 
199  if (bandCheckBox->isChecked())
200  {
201  selectedBandsVector.push_back(true);
202  selectedBands++;
203 
204  algoInputParams.m_inputRasterBands.push_back(i);
205 
206  QComboBox *sensorComboBox = (QComboBox*) m_ui->m_bandTableWidget->cellWidget(i, 1);
207  algoInputParams.m_inputSensorBands.push_back(std::string(sensorComboBox->currentText().toStdString()));
208  }
209  else
210  selectedBandsVector.push_back(false);
211  }
212 
213 // insert mixture components
214  std::map<std::string, MixModelComponent>::iterator it = m_components.begin();
215  std::vector<double> components;
216 
217  while(it != m_components.end())
218  {
219  components.clear();
220 
221  for (unsigned int i = 0; i < selectedBandsVector.size(); i++)
222  if (selectedBandsVector[i])
223  components.push_back(it->second.m_values[i]);
224 
225  algoInputParams.m_components[it->second.m_name] = components;
226 
227  ++it;
228  }
229 
230 
231  return algoInputParams;
232 }
233 
235 {
237 
238  algoOutputParams.m_normalizeOutput = m_ui->m_normalizeOutputCheckBox->isChecked();
239  algoOutputParams.m_createErrorRaster = m_ui->m_createErrorRasterCheckBox->isChecked();
240 
241  return algoOutputParams;
242 }
243 
245 {
246  boost::property_tree::ptree pt;
247 
248  std::map<std::string, MixModelComponent >::iterator it = m_components.begin();
249 
250  boost::property_tree::ptree children;
251 
252  while(it != m_components.end())
253  {
254  boost::property_tree::ptree child;
255 
256  child.put("id", it->first);
257  child.put("name", it->second.m_name);
258 
259  boost::property_tree::ptree coordGrid;
260  coordGrid.put("xGrid", it->second.m_coordGrid.getX());
261  coordGrid.put("yGrid", it->second.m_coordGrid.getY());
262  child.push_back(std::make_pair("coordGrid", coordGrid));
263 
264  boost::property_tree::ptree coordGeo;
265  coordGeo.put("xGeo", it->second.m_coordGeo.getX());
266  coordGeo.put("yGeo", it->second.m_coordGeo.getY());
267  child.push_back(std::make_pair("coordGeo", coordGeo));
268 
269  boost::property_tree::ptree values;
270 
271  for(std::size_t t = 0; t < it->second.m_values.size(); ++t)
272  {
273  boost::property_tree::ptree val;
274  val.put("value", it->second.m_values[t]);
275  values.push_back(std::make_pair("", val));
276  }
277 
278  child.add_child("Values", values);
279 
280  children.push_back(std::make_pair("Component", child));
281 
282  ++it;
283  }
284 
285  pt.add_child("MixModel_Components", children);
286 
287  boost::property_tree::json_parser::write_json(fileName, pt);
288 }
289 
291 {
292  try
293  {
294  boost::property_tree::ptree pt;
295  boost::property_tree::json_parser::read_json(fileName, pt);
296 
297  BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("MixModel_Components"))
298  {
299  std::string id = v.second.get<std::string>("id");
300  std::string name = v.second.get<std::string>("name");
301 
302  int xGrid = v.second.get<int>("coordGrid.xGrid");
303  int yGrid = v.second.get<int>("coordGrid.yGrid");
304 
305  double xGeo = v.second.get<double>("coordGeo.xGeo");
306  double yGeo = v.second.get<double>("coordGeo.yGeo");
307 
308  std::vector<double> valuesVec;
309  BOOST_FOREACH(boost::property_tree::ptree::value_type &c, v.second.get_child("Values"))
310  {
311  double val = c.second.get<double>("value");
312 
313  valuesVec.push_back(val);
314  }
315 
316  MixModelComponent mmc;
317  mmc.m_id = id;
318  mmc.m_name = name;
319  mmc.m_values = valuesVec;
320  mmc.m_coordGrid = te::gm::Coord2D(xGrid, yGrid);
321  mmc.m_coordGeo = te::gm::Coord2D(xGeo, yGeo);
322 
323  m_components.insert(std::map<std::string, MixModelComponent >::value_type(id, mmc));
324  }
325 
326  updateComponents();
327  }
328  catch(boost::property_tree::json_parser::json_parser_error &je)
329  {
330  QString errmsg = tr("Error parsing: ") + je.filename().c_str() + ": " + je.message().c_str();
331 
332  QMessageBox::warning(this, tr("Warning"), errmsg);
333 
334  return;
335  }
336  catch (std::exception const& e)
337  {
338  QString errmsg = e.what();
339 
340  QMessageBox::warning(this, tr("Warning"), errmsg);
341  }
342 }
343 
345 {
346  QString fileName = QFileDialog::getSaveFileName(this, tr("Save MixModel Components"), "", "JSON File (*.json)");
347 
348  if(!fileName.isEmpty())
349  saveMixtureModelComponents(fileName.toStdString());
350 }
351 
353 {
354  QString fileName = QFileDialog::getOpenFileName(this, tr("Load MixModel Components"), "", "JSON File (*.json)");
355 
356  if(!fileName.isEmpty())
357  loadMixtureModelComponents(fileName.toStdString());
358 }
359 
361 {
362  if(m_components.empty() == false)
363  drawMarks();
364 }
365 
367 {
368  assert(m_layer.get());
369 
370  //get input raster
371  std::auto_ptr<te::da::DataSet> ds = m_layer->getData();
372 
373  if(ds.get())
374  {
375  std::size_t rpos = te::da::GetFirstPropertyPos(ds.get(), te::dt::RASTER_TYPE);
376  std::auto_ptr<te::rst::Raster> inputRst = ds->getRaster(rpos);
377 
378  if(inputRst.get())
379  {
380  te::gm::Coord2D pixelLocation = inputRst->getGrid()->geoToGrid(x, y);
381 
382  int currentColumn = pixelLocation.x;
383  int currentRow = pixelLocation.y;
384 
385  if (currentColumn < 0 || currentColumn >= (int) inputRst->getNumberOfColumns())
386  return;
387  if (currentRow < 0 || currentRow >= (int) inputRst->getNumberOfRows())
388  return;
389 
390  //component id
391  static boost::uuids::basic_random_generator<boost::mt19937> gen;
392  boost::uuids::uuid u = gen();
393  std::string id = boost::uuids::to_string(u);
394 
395  //component name
396  QString className = QString(tr("Component ") + QString::number(m_countComponents++));
397 
398  //component values
399  std::vector<double> componentsVector;
400 
401  double value;
402  for(unsigned b = 0 ; b < inputRst->getNumberOfBands(); b++)
403  {
404  inputRst->getValue(currentColumn, currentRow, value, b);
405 
406  componentsVector.push_back(value);
407  }
408 
409  //component coordinate
410  te::gm::Coord2D coordinateGrid(currentColumn, currentRow);
411  te::gm::Coord2D coordinateGeo(x, y);
412 
413  MixModelComponent mmc;
414  mmc.m_id = id;
415  mmc.m_name = className.toStdString();
416  mmc.m_values = componentsVector;
417  mmc.m_coordGrid = coordinateGrid;
418  mmc.m_coordGeo = coordinateGeo;
419 
420  m_components.insert(std::map<std::string, MixModelComponent >::value_type(id, mmc));
421 
422  updateComponents();
423  }
424  }
425 }
426 
428 {
429  std::string id = item->data(Qt::UserRole).toString().toStdString();
430 
431  std::string name = item->text().toStdString();
432 
433  std::map<std::string, MixModelComponent >::iterator it = m_components.find(id);
434 
435  bool update = false;
436 
437  if(it != m_components.end())
438  {
439  if(it->second.m_name != name)
440  {
441  it->second.m_name = name;
442  update = true;
443  }
444  }
445 
446  if(update)
447  updateComponents();
448 }
449 
451 {
452  if(m_ui->m_tableWidget->currentRow() == -1)
453  return;
454 
455  std::string id = m_ui->m_tableWidget->item(m_ui->m_tableWidget->currentRow(), 0)->data(Qt::UserRole).toString().toStdString();
456 
457  std::map<std::string, MixModelComponent >::iterator it = m_components.find(id);
458 
459  if(it != m_components.end())
460  {
461  m_components.erase(it);
462 
463  if(m_components.empty())
464  m_countComponents = 0;
465 
466  updateComponents();
467  }
468 }
469 
471 {
472  if(show)
473  m_navigatorDlg->show();
474  else
475  m_navigatorDlg->hide();
476 }
477 
479 {
480  m_ui->m_acquireToolButton->setChecked(false);
481 }
482 
484 {
485  m_ui->m_typeComboBox->clear();
486 
487  m_ui->m_typeComboBox->addItem(tr("Linear"), MIXMODEL_LINEAR);
488  m_ui->m_typeComboBox->addItem(tr("PCA - Principal Component Analysis"), MIXMODEL_PCA);
489 }
490 
492 {
493  assert(m_layer.get());
494 
495  //get input raster
496  std::auto_ptr<te::da::DataSet> ds = m_layer->getData();
497 
498  if(ds.get())
499  {
500  std::size_t rpos = te::da::GetFirstPropertyPos(ds.get(), te::dt::RASTER_TYPE);
501  std::auto_ptr<te::rst::Raster> inputRst = ds->getRaster(rpos);
502 
503  if(inputRst.get())
504  {
505  // define sensor information
506  QStringList sensorsDescriptions;
507  std::vector<std::string> bandNames = te::rp::GetBandNames();
508 
509  for(unsigned int i = 0; i < bandNames.size(); i++)
510  sensorsDescriptions.append(bandNames[i].c_str());
511 
512  m_ui->m_bandTableWidget->setRowCount(0);
513 
514  // initializing the list of bands
515  for(unsigned b = 0 ; b < inputRst->getNumberOfBands(); b++)
516  {
517  int newrow = m_ui->m_bandTableWidget->rowCount();
518  m_ui->m_bandTableWidget->insertRow(newrow);
519 
520  QString bName(tr("Band "));
521  bName.append(QString::number(b));
522 
523  QCheckBox* bandCheckBox = new QCheckBox(bName, this);
524 
525  connect(bandCheckBox, SIGNAL(stateChanged(int)), this, SIGNAL(completeChanged()));
526 
527  bandCheckBox->setChecked(true);
528 
529  QComboBox* sensorDescriptionComboBox = new QComboBox(this);
530  sensorDescriptionComboBox->addItems(sensorsDescriptions);
531 
532  m_ui->m_bandTableWidget->setCellWidget(newrow, 0, bandCheckBox);
533  m_ui->m_bandTableWidget->setCellWidget(newrow, 1, sensorDescriptionComboBox);
534  }
535 
536  m_ui->m_bandTableWidget->resizeColumnToContents(0);
537  }
538  }
539 }
540 
542 {
543  te::qt::widgets::MapDisplay* mapDisplay = m_navigatorDlg->getWidget()->getDisplay();
544 
545  mapDisplay->getDraftPixmap()->fill(QColor(0, 0, 0, 0));
546 
547  const te::gm::Envelope& mapExt = mapDisplay->getExtent();
548 
549  te::qt::widgets::Canvas canvasInstance(mapDisplay->getDraftPixmap());
550  canvasInstance.setWindow(mapExt.m_llx, mapExt.m_lly, mapExt.m_urx, mapExt.m_ury);
551 
552  canvasInstance.setPointPattern(m_rgbaMark, PATTERN_SIZE, PATTERN_SIZE);
553 
554  std::map<std::string, MixModelComponent>::iterator it = m_components.begin();
555 
556  while(it != m_components.end())
557  {
558  te::gm::Coord2D cGeo = it->second.m_coordGeo;
559 
560  te::gm::Point point;
561  point.setX(cGeo.x);
562  point.setY(cGeo.y);
563 
564  canvasInstance.draw(&point);
565 
566  ++it;
567  }
568 
569  mapDisplay->repaint();
570 }
571 
573 {
574  m_ui->m_tableWidget->setRowCount(0);
575 
576  std::map<std::string, MixModelComponent>::iterator it = m_components.begin();
577 
578  while(it != m_components.end())
579  {
580  int newrow = m_ui->m_tableWidget->rowCount();
581  m_ui->m_tableWidget->insertRow(newrow);
582 
583  //name
584  QTableWidgetItem* itemName = new QTableWidgetItem(QString::fromStdString(it->second.m_name));
585  itemName->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable);
586  itemName->setData(Qt::UserRole, QVariant(it->second.m_id.c_str()));
587  m_ui->m_tableWidget->setItem(newrow, 0, itemName);
588 
589  //values
590  QComboBox* combo = new QComboBox(m_ui->m_tableWidget);
591 
592  for(size_t t = 0; t < it->second.m_values.size(); ++t)
593  {
594  combo->addItem(QString::number(it->second.m_values[t]));
595  }
596 
597  m_ui->m_tableWidget->setCellWidget(newrow, 1, combo);
598 
599  ////coord x
600  //QTableWidgetItem* itemCoordX = new QTableWidgetItem(QString::number(it->second.m_coordGeo.x));
601  //itemCoordX->setFlags(Qt::ItemIsEnabled);
602  //m_ui->m_tableWidget->setItem(newrow, 2, itemCoordX);
603 
604  ////coord y
605  //QTableWidgetItem* itemCoordY = new QTableWidgetItem(QString::number(it->second.m_coordGeo.y));
606  //itemCoordY->setFlags(Qt::ItemIsEnabled);
607  //m_ui->m_tableWidget->setItem(newrow, 3, itemCoordY);
608 
609  ////coord x
610  //QTableWidgetItem* itemCoordC = new QTableWidgetItem(QString::number(it->second.m_coordGrid.x));
611  //itemCoordC->setFlags(Qt::ItemIsEnabled);
612  //m_ui->m_tableWidget->setItem(newrow, 4, itemCoordC);
613 
614  ////coord y
615  //QTableWidgetItem* itemCoordL = new QTableWidgetItem(QString::number(it->second.m_coordGrid.y));
616  //itemCoordL->setFlags(Qt::ItemIsEnabled);
617  //m_ui->m_tableWidget->setItem(newrow, 5, itemCoordL);
618 
619  ++it;
620  }
621 
622  m_ui->m_tableWidget->sortByColumn(0, Qt::AscendingOrder);
623 
624  drawMarks();
625 
626  emit completeChanged();
627 }
This file defines a class for a MixtureModel Wizard page.
double y
y-coordinate.
Definition: Coord2D.h:114
This class is a dialog for the RasterNavigator widget.
double x
x-coordinate.
Definition: Coord2D.h:113
te::rp::MixtureModel::InputParameters getInputParams()
void saveMixtureModelComponents(std::string fileName)
std::auto_ptr< te::qt::widgets::RasterNavigatorDialog > m_navigatorDlg
std::vector< std::string > GetBandNames()
Returns a vector os with band's names.
Definition: Functions.cpp:556
double m_urx
Upper right corner x-coordinate.
Definition: Envelope.h:346
std::vector< std::string > m_inputSensorBands
The names of the sensor/bands.
Definition: MixtureModel.h:110
A widget to control the display of a set of layers.
Definition: MapDisplay.h:66
An utility struct for representing 2D coordinates.
Definition: Coord2D.h:40
std::string m_strategyName
The mixture model strategy name see each te::rp::MixtureModelStrategyFactory inherited classes docume...
Definition: MixtureModel.h:112
void loadMixtureModelComponents(std::string fileName)
This file defines a class for a Raster Navigator Dialog.
MixtureModel input parameters.
Definition: MixtureModel.h:69
void Free(std::vector< T * > *v)
This function can be applied to a pointer to a vector of pointers.
Definition: STLUtils.h:131
void setWindow(const double &llx, const double &lly, const double &urx, const double &ury)
It sets the world (or window) coordinates area (supposing a cartesian reference system).
Definition: Canvas.cpp:147
double m_llx
Lower left corner x-coordinate.
Definition: Envelope.h:344
static MarkRendererManager & getInstance()
It returns a reference to the singleton instance.
bool m_normalizeOutput
A flag to indicate that output raster will be normalized, by default [0, 255].
Definition: MixtureModel.h:153
A point with x and y coordinate values.
Definition: Point.h:50
An Envelope defines a 2D rectangular region.
Definition: Envelope.h:51
std::auto_ptr< Ui::MixtureModelWizardPageForm > m_ui
virtual const te::gm::Envelope & getExtent() const
It returns the world extent showned by the MapDisplay.
Definition: MapDisplay.cpp:63
void set(te::map::AbstractLayerPtr layer)
This method is used to set the selected layer for mixture model operation.
A Fill specifies the pattern for filling an area geometry.
Definition: Fill.h:59
TESEEXPORT Mark * CreateMark(const std::string &wellKnownName, Stroke *stroke, Fill *fill)
Creates a mark.
Definition: Utils.cpp:130
double m_lly
Lower left corner y-coordinate.
Definition: Envelope.h:345
TESEEXPORT Stroke * CreateStroke(const std::string &color, const std::string &width)
Creates a stroke.
Definition: Utils.cpp:54
A canvas built on top of Qt.
Definition: Canvas.h:54
te::rp::MixtureModel::OutputParameters getOutputParams()
std::map< std::string, std::vector< double > > m_components
A set of endmembers and its radiances.
Definition: MixtureModel.h:111
MixtureModel output parameters.
Definition: MixtureModel.h:123
void setX(const double &x)
It sets the Point x-coordinate value.
Definition: Point.h:143
virtual QPixmap * getDraftPixmap() const
It returns the map display draft pixmap.
Definition: MapDisplay.cpp:222
double m_ury
Upper right corner y-coordinate.
Definition: Envelope.h:347
A Stroke specifies the appearance of a linear geometry.
Definition: Stroke.h:67
#define PATTERN_SIZE
void setMixtureModelStrategyParams(const StrategyParameters &p)
Set specific mixture model strategy parameters.
This file has the RasterNavigatorWidget class.
TEDATAACCESSEXPORT std::size_t GetFirstPropertyPos(const te::da::DataSet *dataset, int datatype)
Definition: Utils.cpp:481
void setY(const double &y)
It sets the Point y-coordinate value.
Definition: Point.h:157
bool m_createErrorRaster
A flag to indicate that output raster will include the error bands.
Definition: MixtureModel.h:154
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
std::vector< unsigned int > m_inputRasterBands
Bands to be processed from the input raster.
Definition: MixtureModel.h:109
TESEEXPORT Fill * CreateFill(const std::string &color, const std::string &opacity)
Creates a fill.
Definition: Utils.cpp:109