27 #include "../../../classification/ROI.h"
28 #include "../../../classification/ROISet.h"
29 #include "../../../dataaccess/utils/Utils.h"
30 #include "../../../geometry/Coord2D.h"
31 #include "../../../geometry/Geometry.h"
32 #include "../../../geometry/GeometryProperty.h"
33 #include "../../../geometry/MultiPolygon.h"
34 #include "../../../geometry/Point.h"
35 #include "../../../geometry/Utils.h"
36 #include "../../../se/PolygonSymbolizer.h"
37 #include "../../../se/Fill.h"
38 #include "../../../se/Rule.h"
39 #include "../../../se/Style.h"
40 #include "../../../se/Symbolizer.h"
41 #include "../../../se/Utils.h"
42 #include "../canvas/Canvas.h"
43 #include "../canvas/MapDisplay.h"
44 #include "../rp/RasterNavigatorWidget.h"
45 #include "../utils/ColorPickerToolButton.h"
47 #include "ui_ROIManagerWidgetForm.h"
50 #include <QFileDialog>
51 #include <QGridLayout>
52 #include <QMessageBox>
59 #include <boost/uuid/random_generator.hpp>
60 #include <boost/uuid/uuid_io.hpp>
64 #define ROI_TREE_ITEM 0
65 #define ROI_POLYGON_TREE_ITEM 1
69 m_ui(new
Ui::ROIManagerWidgetForm),
75 m_ui->m_openLayerROIToolButton->setIcon(QIcon::fromTheme(
"folder-open"));
76 m_ui->m_fileDialogToolButton->setIcon(QIcon::fromTheme(
"folder-open"));
77 m_ui->m_removeROIToolButton->setIcon(QIcon::fromTheme(
"list-remove"));
78 m_ui->m_exportROISetToolButton->setIcon(QIcon::fromTheme(
"document-export"));
79 m_ui->m_addROIToolButton->setIcon(QIcon::fromTheme(
"list-add"));
80 m_ui->m_vectorLayerToolButton->setIcon(QIcon::fromTheme(
"map-draw"));
88 QGridLayout* colorPickerLayout =
new QGridLayout(
m_ui->m_colorWidget);
89 colorPickerLayout->setContentsMargins(0, 0, 0, 0);
92 QGridLayout* layout =
new QGridLayout(
m_ui->m_navigatorWidget);
95 layout->setContentsMargins(0,0,0,0);
96 layout->setSizeConstraint(QLayout::SetMinimumSize);
110 connect(
m_ui->m_roiSetTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*,
int)),
this, SLOT(
onROITreItemClicked(QTreeWidgetItem*,
int)));
118 if(m_vectorLayer.get())
120 m_vectorLayer->setVisibility(m_vectorLayerVisibility);
136 m_ui->m_layerROIComboBox->clear();
137 m_ui->m_vectorLayerComboBox->clear();
139 std::list<te::map::AbstractLayerPtr>::iterator it = layerList.begin();
141 while(it != layerList.end())
145 std::auto_ptr<te::da::DataSetType> dsType = l->getSchema();
147 if(dsType->hasGeom())
152 m_ui->m_vectorLayerComboBox->addItem(it->get()->getTitle().c_str(), QVariant::fromValue(l));
155 if(dsType->getProperties().size() == 5 &&
160 m_ui->m_layerROIComboBox->addItem(it->get()->getTitle().c_str(), QVariant::fromValue(l));
172 m_navigator->set(layer);
194 std::map<std::string, te::cl::ROI*> roiMap = m_rs->getROISet();
195 std::map<std::string, te::cl::ROI*>::iterator it = roiMap.begin();
197 while(it != roiMap.end())
201 std::map<std::string, te::gm::Polygon*> polyMap = roi->
getPolygons();
202 std::map<std::string, te::gm::Polygon*>::iterator itPoly = polyMap.begin();
206 canvasInstance.setPolygonContourWidth(2);
207 canvasInstance.setPolygonContourColor(rgba);
208 canvasInstance.setPolygonFillColor(
te::color::RGBAColor(rgba.getRed(), rgba.getGreen(), rgba.getBlue(), 80));
210 while(itPoly != polyMap.end())
214 canvasInstance.draw(poly);
222 if(!m_ui->m_roiSetTreeWidget->selectedItems().isEmpty())
224 QTreeWidgetItem* item = m_ui->m_roiSetTreeWidget->selectedItems()[0];
228 std::string
id = item->data(0, Qt::UserRole).
toString().toStdString();
230 QTreeWidgetItem* parent = item->parent();
232 std::string label = parent->text(0).toStdString();
240 canvasInstance.setPolygonContourWidth(1);
241 canvasInstance.setPolygonContourColor(rgba);
242 canvasInstance.setPolygonFillColor(rgba);
244 canvasInstance.draw(p);
248 mapDisplay->repaint();
253 int idxLayer = m_ui->m_layerROIComboBox->currentIndex();
254 QVariant varLayer = m_ui->m_layerROIComboBox->itemData(idxLayer, Qt::UserRole);
260 std::auto_ptr<te::da::DataSet> ds = layer->getData();
265 m_ui->m_roiSetTreeWidget->clear();
275 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Error extracting ROISet Information. Invalid layer."));
279 std::map<std::string, te::cl::ROI*> roiMap = m_rs->getROISet();
280 std::map<std::string, te::cl::ROI*>::iterator it = roiMap.begin();
282 while(it != roiMap.end())
286 std::map<std::string, te::gm::Polygon*> polyMap = roi->
getPolygons();
287 std::map<std::string, te::gm::Polygon*>::iterator itPoly = polyMap.begin();
291 pix.fill(QColor(roi->
getColor().c_str()));
294 QTreeWidgetItem* item =
new QTreeWidgetItem(m_ui->m_roiSetTreeWidget,
ROI_TREE_ITEM);
295 item->setText(0, roi->
getLabel().c_str());
296 item->setIcon(0, icon);
298 m_ui->m_roiSetTreeWidget->addTopLevelItem(item);
300 while(itPoly != polyMap.end())
305 QString sampleCounter;
306 sampleCounter.setNum(m_sampleCounter);
307 QString sampleName(tr(
"Sample"));
309 fullName.append(sampleName);
310 fullName.append(
" - ");
311 fullName.append(sampleCounter);
314 subItem->setText(0, fullName);
315 subItem->setData(0, Qt::UserRole, QVariant(itPoly->first.c_str()));
316 subItem->setIcon(0, QIcon::fromTheme(
"file-vector"));
317 item->addChild(subItem);
318 item->setExpanded(
true);
325 emit roiSetChanged(m_rs);
332 if(m_ui->m_labelROILineEdit->text().isEmpty())
334 QMessageBox::warning(
this, tr(
"Warning"), tr(
"ROI Label is empty."));
339 std::string label = m_ui->m_labelROILineEdit->text().toStdString();
340 std::string color = m_colorPicker->getColor().name().toStdString();
357 pix.fill(m_colorPicker->getColor());
360 QTreeWidgetItem* item =
new QTreeWidgetItem(m_ui->m_roiSetTreeWidget,
ROI_TREE_ITEM);
361 item->setText(0, roi->
getLabel().c_str());
362 item->setIcon(0, icon);
364 m_ui->m_roiSetTreeWidget->addTopLevelItem(item);
366 m_ui->m_labelROILineEdit->clear();
368 emit roiSetChanged(m_rs);
373 if(m_ui->m_roiSetTreeWidget->selectedItems().empty())
375 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Select a item first."));
379 QTreeWidgetItem* item = m_ui->m_roiSetTreeWidget->selectedItems()[0];
383 std::string label = item->text(0).toStdString();
384 m_rs->removeROI(label);
390 std::string
id = item->data(0, Qt::UserRole).toString().toStdString();
392 QTreeWidgetItem* parent = item->parent();
394 std::string label = parent->text(0).toStdString();
400 parent->removeChild(item);
403 if(m_rs && m_rs->getROISet().empty())
410 emit roiSetChanged(m_rs);
415 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save ROI Set to File"),
"", tr(
"Shape Files (*.shp *.SHP)"));
417 if (fileName.isEmpty())
420 QFileInfo file(fileName);
422 if(file.suffix().isEmpty())
423 fileName.append(
".shp");
425 m_ui->m_roiSetNameLineEdit->setText(fileName);
441 std::string
id = item->data(0, Qt::UserRole).toString().toStdString();
443 QTreeWidgetItem* parent = item->parent();
445 std::string label = parent->text(0).toStdString();
453 canvasInstance.setPolygonContourWidth(1);
454 canvasInstance.setPolygonContourColor(rgba);
455 canvasInstance.setPolygonFillColor(rgba);
457 canvasInstance.draw(p);
459 mapDisplay->repaint();
465 if(m_ui->m_roiSetNameLineEdit->text().isEmpty())
467 QMessageBox::warning(
this, tr(
"Warning"), tr(
"File name not defined."));
470 std::string fileName = m_ui->m_roiSetNameLineEdit->text().toStdString();
472 if(m_rs->getROISet().empty())
474 QMessageBox::warning(
this, tr(
"Warning"), tr(
"ROI Set is empty."));
480 int srid = mapDisplay->
getSRID();
484 m_rs->exportToFile(fileName, srid);
488 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Error exporting ROI Set."));
492 QMessageBox::warning(
this, tr(
"Warning"), tr(
"ROI Set exported successfully."));
499 int idxLayer = m_ui->m_vectorLayerComboBox->currentIndex();
500 QVariant varLayer = m_ui->m_vectorLayerComboBox->itemData(idxLayer, Qt::UserRole);
503 m_vectorLayer = layer;
504 m_vectorLayerVisibility = m_layer->getVisibility();
511 m_symb = symb->
clone();
513 if(symb->
getType() ==
"PolygonSymbolizer")
525 m_navigator->setVectorial(m_vectorLayer);
526 m_navigator->hidePickerTool(
false);
530 m_navigator->removeVectorial();
531 m_navigator->hidePickerTool(
true);
542 if(m_ui->m_roiSetTreeWidget->selectedItems().empty())
544 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Select a ROI item first."));
548 QTreeWidgetItem* item = m_ui->m_roiSetTreeWidget->selectedItems()[0];
552 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Select a ROI item first."));
556 std::string label = item->text(0).toStdString();
559 bool repaint =
false;
564 static boost::uuids::basic_random_generator<boost::mt19937> gen;
565 boost::uuids::uuid u = gen();
566 std::string
id = boost::uuids::to_string(u);
574 QString sampleCounter;
575 sampleCounter.setNum(m_sampleCounter);
576 QString sampleName(tr(
"Sample"));
578 fullName.append(sampleName);
579 fullName.append(
" - ");
580 fullName.append(sampleCounter);
583 subItem->setText(0, fullName);
584 subItem->setData(0, Qt::UserRole, QVariant(
id.c_str()));
585 subItem->setIcon(0, QIcon::fromTheme(
"file-vector"));
586 item->setExpanded(
true);
588 int value = item->childCount();
592 item->addChild(subItem);
596 m_ui->m_roiSetTreeWidget->repaint();
598 emit roiSetChanged(m_rs);
605 if(!m_ui->m_vectorLayerToolButton->isChecked())
610 int idxLayer = m_ui->m_vectorLayerComboBox->currentIndex();
611 QVariant varLayer = m_ui->m_vectorLayerComboBox->itemData(idxLayer, Qt::UserRole);
623 if(!reprojectedEnvelope.
intersects(layer->getExtent()))
630 std::auto_ptr<const te::map::LayerSchema> schema(layer->getSchema());
631 if(!schema->hasGeom())
646 while(dataset->moveNext())
648 std::auto_ptr<te::gm::Geometry> g(dataset->getGeometry(gp->
getName()));
650 if(g->contains(&point) || g->crosses(geometryFromEnvelope.get()) || geometryFromEnvelope->contains(g.get()))
const Fill * getFill() const
Gets the Fill associates with the PolygonSymbolizer.
MultiPolygon is a MultiSurface whose elements are Polygons.
#define TE_CL_ROI_LABEL_NAME
This mark defines the label attribute name.
bool intersects(const Envelope &rhs) const
It returns true if the envelopes "spatially intersects".
The Style defines the styling that is to be applied to a geographic dataset (vector geometries or cov...
A PolygonSymbolizer is used to draw a polygon (or other area-type geometries), including filling its ...
A Symbolizer describes how a feature is to appear on a map.
static te::cl::ROISet * createROISet(std::auto_ptr< te::da::DataSet > ds)
Imports the ROISet from a dataset.
double m_urx
Upper right corner x-coordinate.
void addPolygon(te::gm::Polygon *p, std::string id)
Add a new region into this ROI.
An utility struct for representing 2D coordinates.
A ROISet is a set of ROI's.
Rule * getRule(std::size_t i) const
Coord2D getCenter() const
It returns the rectangle's center coordinate.
double m_llx
Lower left corner x-coordinate.
A point with x and y coordinate values.
An Envelope defines a 2D rectangular region.
#define TE_UNKNOWN_SRS
A numeric value to represent a unknown SRS identification in TerraLib.
virtual int getSRID() const
It return the Spatial Reference System used by the Map Display.
GeomType getGeometryType() const
It returns the geometry subtype allowed for the property.
virtual const te::gm::Envelope & getExtent() const
It returns the world extent showned by the MapDisplay.
void setOpacity(const std::string &opacity)
A Fill specifies the pattern for filling an area geometry.
void setColor(std::string color)
Set the ROI color using the hexadecimal color name.
A region of interest (often abbreviated ROI), is a selected subset of samples within a dataset identi...
double m_lly
Lower left corner y-coordinate.
Fill * clone() const
It creates a new copy of this object.
void removePolygon(std::string id)
Removes a region from this ROI.
Polygon is a subclass of CurvePolygon whose rings are defined by linear rings.
A Rule is used to attach property/scale conditions to and group the individual symbols used for rende...
double m_ury
Upper right corner y-coordinate.
#define TE_CL_ROI_GEOM_ID_NAME
This mark defines the geom id attribute name.
A helper class for 32-bit RGBA (Red-Green-Blue-Alpha channel) color.
std::string toString() const
It returns the data value in a WKT representation.
const std::vector< Geometry * > & getGeometries() const
It returns a reference to the internal list of geometries.
std::string getLabel()
Get the ROI label.
Symbolizer * clone() const
It creates a new copy of this object.
void setFill(Fill *f)
A Fill specifies the pattern for filling an area geometry.
void setSymbolizer(std::size_t i, Symbolizer *s)
#define TE_CL_ROI_COLOR_NAME
This mark defines the color attribute name.
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
virtual const std::string & getType() const =0
It returns the symbolizer type.
virtual Symbolizer * clone() const =0
It creates a new copy of this object.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void transform(int oldsrid, int newsrid)
It will transform the coordinates of the Envelope from the old SRS to the new one.
const Symbolizer * getSymbolizer(std::size_t i) const
TEGEOMEXPORT Geometry * GetGeomFromEnvelope(const Envelope *const e, int srid)
It creates a Geometry (a polygon) from the given envelope.
std::map< std::string, te::gm::Polygon * > & getPolygons()
Get all polygons belongs to this roi.
const std::string & getName() const
It returns the property name.
std::string getColor()
Get the ROI color defined by a hexadecimal color name.