28 #include "../../../color/ColorBar.h"
29 #include "../../../common/STLUtils.h"
30 #include "../../../dataaccess/dataset/DataSet.h"
31 #include "../../../dataaccess/dataset/DataSetType.h"
32 #include "../../../dataaccess/utils/Utils.h"
33 #include "../../../datatype.h"
34 #include "../../../maptools/DataSetLayer.h"
35 #include "../../../maptools/GroupingAlgorithms.h"
36 #include "../../../maptools/RasterLayer.h"
37 #include "../../../fe/Literal.h"
38 #include "../../../raster.h"
39 #include "../../../raster/RasterSummary.h"
40 #include "../../../raster/RasterSummaryManager.h"
41 #include "../../../se/ColorMap.h"
42 #include "../../../se/Categorize.h"
43 #include "../../../se/Enums.h"
44 #include "../../../se/Interpolate.h"
45 #include "../../../se/InterpolationPoint.h"
46 #include "../../../se/ParameterValue.h"
47 #include "../../../se/RasterSymbolizer.h"
48 #include "../../../se/Utils.h"
49 #include "../../widgets/colorbar/ColorBar.h"
50 #include "../../widgets/colorbar/ColorCatalogWidget.h"
52 #include "ui_ColorMapWidgetForm.h"
55 #include <QColorDialog>
56 #include <QMessageBox>
67 m_ui(new Ui::ColorMapWidgetForm),
74 QGridLayout* l =
new QGridLayout(
m_ui->m_colorBarWidget);
75 l->setContentsMargins(0,0,0,0);
79 m_ui->m_minValueLineEdit->setValidator(
new QDoubleValidator(
this));
80 m_ui->m_maxValueLineEdit->setValidator(
new QDoubleValidator(
this));
86 connect(
m_ui->m_bandComboBox, SIGNAL(activated(QString)),
this, SLOT(
onBandSelected(QString)));
107 m_ui->m_bandComboBox->clear();
109 for(
int i = 0; i < nBands; ++i)
114 m_ui->m_bandComboBox->addItem(strBand);
118 onBandSelected(m_ui->m_bandComboBox->itemText(0));
132 return m_cm->
clone();
137 if(m_ui->m_bandComboBox->count() != 0)
139 return m_ui->m_bandComboBox->currentText().toStdString();
147 m_colorBar->getColorBar()->setHeight(20);
148 m_colorBar->getColorBar()->setScaleVisible(
false);
150 m_ui->m_transformComboBox->clear();
159 m_ui->m_tableWidget->setRowCount(0);
168 if(m_cm->getCategorize())
170 for(
int i = 0; i < m_ui->m_transformComboBox->count(); ++i)
173 m_ui->m_transformComboBox->setCurrentIndex(i);
176 std::vector<te::se::ParameterValue*> t = m_cm->getCategorize()->getThresholds();
177 std::vector<te::se::ParameterValue*> tV = m_cm->getCategorize()->getThresholdValues();
179 m_ui->m_slicesSpinBox->setValue(tV.size() - 2);
181 m_ui->m_tableWidget->setRowCount(tV.size() - 2);
191 for(
size_t i = 1; i < tV.size() - 1; ++i)
194 std::string lowerLimit =
"";
195 std::string upperLimit =
"";
203 else if(i == tV.size() - 1)
218 if(count != 0 && count != tV.size() - 2)
220 double pos = (1. / (tV.size() - 2)) * count;
231 QTableWidgetItem* item =
new QTableWidgetItem();
232 item->setBackgroundColor(color);
233 item->setFlags(Qt::ItemIsEnabled);
234 item->setData(Qt::UserRole, QVariant((
int)i));
235 m_ui->m_tableWidget->setItem(i - 1, 1, item);
238 std::string range = lowerLimit +
" - " + upperLimit;
239 QTableWidgetItem* itemRange =
new QTableWidgetItem();
240 itemRange->setText(range.c_str());
241 itemRange->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
242 m_ui->m_tableWidget->setItem(i - 1, 0, itemRange);
245 std::string rangeStr = lowerLimit +
" to " + upperLimit;
246 QTableWidgetItem* itemRangeStr =
new QTableWidgetItem();
247 itemRangeStr->setText(rangeStr.c_str());
248 itemRangeStr->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
249 m_ui->m_tableWidget->setItem(i - 1, 2, itemRangeStr);
252 else if(m_cm->getInterpolate())
254 for(
int i = 0; i < m_ui->m_transformComboBox->count(); ++i)
257 m_ui->m_transformComboBox->setCurrentIndex(i);
260 std::vector<te::se::InterpolationPoint*> ip = m_cm->getInterpolate()->getInterpolationPoints();
262 m_ui->m_slicesSpinBox->setValue(ip.size() - 1);
264 m_ui->m_tableWidget->setRowCount(ip.size() - 1);
274 for(
size_t i = 0; i < ip.size() - 1; ++i)
284 valStrBegin.setNum(ipItem->
getData());
285 valStrEnd.setNum(ip[i+1]->getData());
288 valStr.append(valStrBegin);
289 valStr.append(
" - ");
290 valStr.append(valStrEnd);
294 if(count != 0 && count != ip.size() - 1)
296 double pos = (1. / (ip.size() - 1)) * count;
307 QTableWidgetItem* item =
new QTableWidgetItem();
308 item->setBackgroundColor(color);
309 item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
310 item->setData(Qt::UserRole, QVariant((
int)i));
311 m_ui->m_tableWidget->setItem(i, 1, item);
314 QTableWidgetItem* itemRange =
new QTableWidgetItem();
315 itemRange->setText(valStr);
316 itemRange->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
317 m_ui->m_tableWidget->setItem(i, 0, itemRange);
320 QTableWidgetItem* itemRangeStr =
new QTableWidgetItem();
321 itemRangeStr->setText(valStr);
322 itemRangeStr->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
323 m_ui->m_tableWidget->setItem(i, 2, itemRangeStr);
329 disconnect(m_colorBar, SIGNAL(colorBarChanged()),
this, SLOT(onApplyPushButtonClicked()));
334 connect(m_colorBar, SIGNAL(colorBarChanged()),
this, SLOT(onApplyPushButtonClicked()));
337 m_ui->m_tableWidget->resizeColumnToContents(0);
338 m_ui->m_tableWidget->resizeColumnToContents(1);
345 m_cb = m_colorBar->getColorBar()->getColorBar();
347 int sliceValue = m_ui->m_slicesSpinBox->value();
349 std::vector<te::color::RGBAColor> colorVec = m_cb->getSlices(sliceValue);
351 std::vector<te::map::GroupingItem*> legVec;
353 std::vector<double> vec;
354 vec.push_back(m_ui->m_minValueLineEdit->text().toDouble());
355 vec.push_back(m_ui->m_maxValueLineEdit->text().toDouble());
361 c->setFallbackValue(
"#000000");
364 QColor cWhite(Qt::white);
365 std::string colorWhiteStr = cWhite.name().toLatin1().data();
370 for(
size_t i = 0; i < colorVec.size(); ++i)
372 QColor color(colorVec[i].getRed(), colorVec[i].getGreen(), colorVec[i].getBlue(), colorVec[i].getAlpha());
374 std::string rangeStr = legVec[i]->getLowerLimit();
375 std::string colorStr = color.name().toStdString();
380 if(i == colorVec.size() - 1)
382 rangeStr = legVec[i]->getUpperLimit();
394 m_cm->setCategorize(c);
395 m_cm->setInterpolate(0);
403 m_cb = m_colorBar->getColorBar()->getColorBar();
405 int sliceValue = m_ui->m_slicesSpinBox->value();
407 std::vector<te::color::RGBAColor> colorVec = m_cb->getSlices(sliceValue + 1);
409 std::vector<te::map::GroupingItem*> legVec;
411 std::vector<double> vec;
412 vec.push_back(m_ui->m_minValueLineEdit->text().toDouble());
413 vec.push_back(m_ui->m_maxValueLineEdit->text().toDouble());
420 interpolate->setFallbackValue(
"#000000");
425 for(
size_t i = 0; i < colorVec.size(); ++i)
427 QColor color(colorVec[i].getRed(), colorVec[i].getGreen(), colorVec[i].getBlue(), colorVec[i].getAlpha());
429 if(i == colorVec.size() - 1)
431 QString rangeStr = legVec[i - 1]->getUpperLimit().c_str();
432 std::string colorStr = color.name().toLatin1().data();
436 ip->
setData(rangeStr.toDouble());
439 interpolate->add(ip);
443 QString rangeStr = legVec[i]->getLowerLimit().c_str();
444 std::string colorStr = color.name().toLatin1().data();
448 ip->
setData(rangeStr.toDouble());
451 interpolate->add(ip);
457 m_cm->setInterpolate(interpolate);
458 m_cm->setCategorize(0);
470 int index = m_ui->m_transformComboBox->currentIndex();
472 int type = m_ui->m_transformComboBox->itemData(index).toInt();
476 buildCategorizationMap();
480 buildInterpolationMap();
487 emit applyPushButtonClicked();
501 const std::complex<double>* cmin = rsMin->at(0).m_minVal;
502 const std::complex<double>* cmax = rsMax->at(0).m_maxVal;
503 double min = cmin->real();
504 double max = cmax->real();
508 m_ui->m_minValueLineEdit->setText(strMin);
512 m_ui->m_maxValueLineEdit->setText(strMax);
517 int curCol = m_ui->m_tableWidget->currentColumn();
518 int curRow = m_ui->m_tableWidget->currentRow();
522 int index = item->data(Qt::UserRole).toInt();
524 QColor bgColor = item->backgroundColor();
526 QColor newBgColor = QColorDialog::getColor(bgColor, m_ui->m_tableWidget);
528 if(newBgColor.isValid())
529 bgColor = newBgColor;
533 int type = m_ui->m_transformComboBox->itemData(m_ui->m_transformComboBox->currentIndex()).toInt();
541 litExp->
setValue(bgColor.name().toStdString());
545 std::vector<te::se::InterpolationPoint*> ip = m_cm->getInterpolate()->getInterpolationPoints();
552 item->setBackgroundColor(bgColor);
554 emit applyPushButtonClicked();
562 if(layer->getType() ==
"DATASETLAYER")
571 else if(layer->getType() ==
"RASTERLAYER")
596 if(layer->getType() ==
"DATASETLAYER")
602 std::auto_ptr<te::da::DataSet> ds = layer->
getData();
607 return ds->getRaster(rpos).release();
611 else if(layer->getType() ==
"RASTERLAYER")
626 for(std::size_t i = 0; i < allLayers.size(); ++i)
628 std::auto_ptr<te::da::DataSetType> dt(allLayers[i]->getSchema());
630 if(dt->hasRaster() &&
getLayerColorMap(allLayers[i]) && allLayers[i]->getId() != selectedLayer->getId())
632 m_ui->m_layersComboBox->addItem(allLayers[i]->getTitle().c_str(), QVariant::fromValue(allLayers[i]));
639 if(m_ui->m_layersComboBox->currentText() ==
"")
641 QMessageBox::warning(
this, tr(
"Grouping"), tr(
"There are no other layers with Grouping!"));
645 QVariant varLayer = m_ui->m_layersComboBox->itemData(m_ui->m_layersComboBox->currentIndex(), Qt::UserRole);
653 if(cm->getCategorize())
655 buildCategorizationMap();
657 else if(cm->getInterpolate())
659 buildInterpolationMap();
662 emit applyPushButtonClicked();
ParameterValue * getValue() const
The transformation of continuous values to distinct values (Categorize function). ...
void setData(const double &d)
te::fe::Expression * m_expression
Parameter from an expression.
TESEEXPORT RasterSymbolizer * GetRasterSymbolizer(Style *s)
Try to get raster symbolizer from a style.
te::rst::Raster * getRaster() const
void addColor(const RGBAColor &color, const double &pos)
It adds a color in the color bar.
void GroupingByEqualSteps(iterator begin, iterator end, int nSteps, std::vector< te::map::GroupingItem * > &legend, int precision=0, bool countElements=true)
It groups the values defined by a range of iterators using the equal steps algorithm.
The transformation of continuous values to a number of values (Interpolate function).
The "ParameterValueType" uses WFS-Filter expressions to give values for SE graphic parameters...
void setValue(ParameterValue *v)
void setValue(const std::string &v)
It sets the literal value.
const Parameter * getParameter(size_t i) const
std::auto_ptr< te::da::DataSet > getData(te::common::TraverseType travType=te::common::FORWARDONLY, const te::common::AccessPolicy accessPolicy=te::common::RAccess) const
It gets the dataset identified by the layer name.
A layer with reference to a raster.
static RasterSummaryManager & getInstance()
It returns a reference to the singleton instance.
An abstract class for raster data strucutures.
virtual te::se::Style * getStyle() const
It returns the Style associated to the layer.
virtual std::size_t getNumberOfBands() const =0
Returns the number of bands (dimension of cells attribute values) in the raster.
boost::ptr_vector< BandSummary > RasterSummary
RasterSummary is just a typedef of a boost::ptr_vector.
The RasterSymbolizer describes how to render raster/matrix-coverage data (e.g., satellite photos...
This class can be used to represent literal values.
They are used to define a graph of points.
A helper class for 32-bit RGBA (Red-Green-Blue-Alpha channel) color.
It models the concept of color bar.
te::se::ColorMap * getColorMap() const
A layer with reference to a dataset.
TEDATAACCESSEXPORT std::size_t GetFirstPropertyPos(const te::da::DataSet *dataset, int datatype)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
TESEEXPORT std::string GetString(const te::se::ParameterValue *param)
It gets the parameter value as a string.
A ColorMap defines either the colors of a pallette-type raster source or the mapping of numeric pixel...
const std::vector< ParameterValue * > & getThresholdValues() const