27 #include "../common/progress/TaskProgress.h"
28 #include "../common/Translator.h"
29 #include "../common/STLUtils.h"
30 #include "../common/StringUtils.h"
31 #include "../dataaccess/dataset/DataSetType.h"
32 #include "../dataaccess/query/And.h"
33 #include "../dataaccess/query/DataSetName.h"
34 #include "../dataaccess/query/Field.h"
35 #include "../dataaccess/query/LiteralEnvelope.h"
36 #include "../dataaccess/query/PropertyName.h"
37 #include "../dataaccess/query/Select.h"
38 #include "../dataaccess/query/ST_Intersects.h"
39 #include "../dataaccess/query/Where.h"
40 #include "../dataaccess/utils/Utils.h"
41 #include "../fe/Literal.h"
42 #include "../geometry/GeometryProperty.h"
43 #include "../geometry/Utils.h"
44 #include "../memory/DataSet.h"
45 #include "../raster/Grid.h"
46 #include "../raster/Raster.h"
47 #include "../raster/RasterFactory.h"
48 #include "../raster/RasterProperty.h"
49 #include "../raster/RasterSummary.h"
50 #include "../raster/RasterSummaryManager.h"
51 #include "../raster/Utils.h"
52 #include "../se/ChannelSelection.h"
53 #include "../se/CoverageStyle.h"
54 #include "../se/FeatureTypeStyle.h"
55 #include "../se/ImageOutline.h"
56 #include "../se/RasterSymbolizer.h"
57 #include "../se/Rule.h"
58 #include "../se/Utils.h"
59 #include "../srs/Config.h"
60 #include "../srs/Converter.h"
71 #include <boost/format.hpp>
72 #include <boost/lexical_cast.hpp>
81 std::list<te::map::AbstractLayerPtr>::const_iterator it = layers.begin();
85 while(it != layers.end())
87 if(it == layers.begin())
107 if(!layer->hasChildren())
109 std::auto_ptr<te::da::DataSetType> dt(layer->getSchema());
116 std::auto_ptr<te::da::DataSet> ds(layer->getData(objSet));
120 while(ds->moveNext())
122 std::auto_ptr<te::gm::Geometry> geom = ds->getGeometry(geomProp->getName());
126 if(layer->getSRID() != srid)
127 auxEnv.
transform(layer->getSRID(), srid);
136 finalEnv.
Union(auxEnv);
141 for(std::size_t i = 0; i < layer->getChildrenCount(); ++i)
157 std::vector<std::string> values;
159 for(std::size_t i = 0; i < values.size(); ++i)
160 style.push_back(atof(values[i].c_str()));
166 throw Exception(
TE_TR(
"The layer is invalid!"));
172 throw Exception(
TE_TR(
"The data set name referenced by the layer is empty!"));
178 std::auto_ptr<te::da::DataSetType> dstype(ds->getDataSetType(dsname));
180 if(dstype.get() == 0)
181 throw Exception(
TE_TR(
"Could not get the data set type!"));
184 std::auto_ptr<te::rst::RasterProperty> rasterProperty(dynamic_cast<te::rst::RasterProperty*>(dstype->getProperties()[0]->clone()));
186 if(rasterProperty.get() == 0)
187 throw Exception(
TE_TR(
"Could not get the raster property!"));
189 return rasterProperty.release();
195 throw Exception(
TE_TR(
"The layer is invalid!"));
201 throw Exception(
TE_TR(
"The data set name referenced by the layer is empty!"));
207 std::auto_ptr<te::da::DataSetType> dstype(ds->getDataSetType(dsname));
209 if(dstype.get() == 0)
210 throw Exception(
TE_TR(
"Could not get the data set type!"));
212 if(!dstype->hasRaster())
213 throw Exception(
TE_TR(
"The data set referenced by the layer not contains raster data!"));
216 std::auto_ptr<te::da::DataSet> dataset(ds->getDataSet(dsname));
217 if(dataset.get() == 0)
218 throw Exception(
TE_TR(
"Could not get the data set reference by the layer!"));
223 std::auto_ptr<te::rst::Raster> raster(dataset->getRaster(rpos));
224 if(raster.get() == 0)
225 throw Exception(
TE_TR(
"Could not get the raster referenced by the layer!"));
227 return raster.release();
238 visibleLayers.push_back(layer);
240 for(std::size_t i = 0; i < layer->getChildrenCount(); ++i)
250 for(std::list<te::map::AbstractLayerPtr>::const_iterator it = layers.begin(); it != layers.end(); ++it)
258 for(std::list<te::map::AbstractLayerPtr>::const_iterator it = layers.begin(); it != layers.end(); ++it)
274 for(std::size_t i = 0; i < layer->getChildrenCount(); ++i)
288 throw Exception(
TE_TR(
"Could not copy the data set to memory!"));
303 const std::string& datasetName = type->
getName();
304 assert(!datasetName.empty());
313 std::size_t nRules = style->
getRules().size();
315 for(std::size_t i = 0; i < nRules; ++i)
327 std::auto_ptr<te::da::DataSet> dataset(0);
331 dataset = ds->getDataSet(datasetName, geometryProperty->getName(), &bbox,
te::gm::INTERSECTS);
341 throw Exception(
TE_TR(
"Could not convert the OGC Filter expression to TerraLib expression!"));
354 wh->
setExp(finalRestriction);
369 dataset = ds->query(select);
372 if(dataset.get() == 0)
373 throw Exception((boost::format(
TE_TR(
"Could not retrieve the data set %1%.")) % datasetName).str());
375 if(dataset->moveNext() ==
false)
379 const std::vector<te::se::Symbolizer*>& symbolizers = rule->
getSymbolizers();
380 std::size_t nSymbolizers = symbolizers.size();
383 std::string message =
TE_TR(
"Drawing the dataset");
384 message +=
" " + datasetName +
". ";
385 message +=
TE_TR(
"Rule");
386 message +=
" " + boost::lexical_cast<std::string>(i + 1) +
" " +
TE_TR(
"of") +
" ";
387 message += boost::lexical_cast<std::string>(nRules) +
".";
393 for(std::size_t j = 0; j < nSymbolizers; ++j)
405 DrawGeometries(dataset.get(), gpos, canvas, bboxSRID, srid, &task);
408 dataset->moveFirst();
421 bool needRemap =
false;
436 std::auto_ptr<te::gm::Geometry> geom(0);
443 catch(std::exception& )
451 geom->setSRID(fromSRID);
452 geom->transform(toSRID);
455 canvas->
draw(geom.get());
470 const std::string& datasetName = type->
getName();
471 assert(!datasetName.empty());
477 std::auto_ptr<te::da::DataSet> dataset(ds->getDataSet(datasetName, rasterProperty->getName(), &bbox,
te::gm::INTERSECTS));
478 if(dataset.get() == 0)
479 throw Exception((boost::format(
TE_TR(
"Could not retrieve the data set %1%.")) % datasetName).str());
483 std::auto_ptr<te::rst::Raster> raster(dataset->getRaster(rpos));
484 if(dataset.get() == 0)
485 throw Exception((boost::format(
TE_TR(
"Could not retrieve the raster from the data set %1%.")) % datasetName).str());
487 DrawRaster(raster.get(), canvas, bbox, bboxSRID, visibleArea, srid, style);
501 std::auto_ptr<te::rst::Grid> gridCanvas(
new te::rst::Grid(static_cast<unsigned int>(canvas->
getWidth()), static_cast<unsigned int>(canvas->
getHeight()), gmbr, srid));
512 const std::complex<double>* cmin = rsMin->at(0).m_minVal;
513 const std::complex<double>* cmax = rsMax->at(0).m_maxVal;
514 double min = cmin->real();
515 double max = cmax->real();
518 rasterTransform.setLinearTransfParameters(min, max, 0, 255);
522 rasterTransform.setLinearTransfParameters(0, 255, 0, 255);
526 std::size_t nRules = style->
getRules().size();
532 const std::vector<te::se::Symbolizer*>& symbolizers = rule->
getSymbolizers();
533 assert(!symbolizers.empty());
537 assert(rasterSymbolizer);
544 bool needRemap =
false;
549 std::string message =
TE_TR(
"Drawing raster");
550 const std::string& rasterName = raster->
getName();
551 !rasterName.empty() ? message +=
" " + raster->
getName() +
". " : message +=
".";
569 converter->setSourceSRID(srid);
570 converter->setTargetSRID(bboxSRID);
574 for(
unsigned int r = 0; r < gridCanvas->getNumberOfRows(); ++r)
576 for(
unsigned int c = 0; c < gridCanvas->getNumberOfColumns(); ++c)
581 converter->convert(inputGeo.
x, inputGeo.
y, inputGeo.
x, inputGeo.
y);
593 color = rasterTransform.apply(x, y);
626 if(rasterSymbolizer->getImageOutline() == 0)
630 te::se::Symbolizer* outlineSymbolizer = rasterSymbolizer->getImageOutline()->getSymbolizer();
631 if(outlineSymbolizer == 0)
636 cc.
config(outlineSymbolizer);
642 geom->setSRID(bboxSRID);
643 geom->transform(srid);
646 canvas->
draw(geom.get());
656 std::vector<te::rst::BandProperty*> bprops;
664 bprops.push_back(bp);
675 bool needRemap =
false;
684 converter->setSourceSRID(srid);
685 converter->setTargetSRID(bboxSRID);
696 converter->convert(inputGeo.
x, inputGeo.
y, inputGeo.
x, inputGeo.
y);
707 std::vector<double> values;
721 std::auto_ptr<te::map::LayerSchema> schema(layer->getSchema());
724 assert(geometryProperty);
743 std::auto_ptr<te::da::DataSet> dataset(layer->getData());
744 assert(dataset.get());
750 std::auto_ptr<te::gm::Geometry> g(dataset->getGeometry(gpos));
753 return g->getGeomTypeId();
TEDATAACCESSEXPORT DataSourcePtr GetDataSource(const std::string &datasourceId, const bool opened=true)
Search for a data source with the informed id in the DataSourceManager.
unsigned int getNumberOfRows() const
Returns the grid number of rows.
virtual void setValues(unsigned int c, unsigned int r, const std::vector< double > &values)
Sets the imaginary attribute values in all complex bands of a cell.
te::gm::Envelope * getExtent()
Returns the geographic extension of the raster data.
TEDATAACCESSEXPORT te::rst::RasterProperty * GetFirstRasterProperty(const DataSetType *dt)
GeomType
Each enumerated type is compatible with a Well-known Binary (WKB) type code.
Utility functions for the data access module.
const std::string & getDataSetName() const
An abstract class that models a source of data in a query.
The Field class can be used to model an expression that takes part of the output items of a SELECT...
Spatial intersects operator.
A class that models the name of a dataset used in a From clause.
boost::shared_ptr< DataSource > DataSourcePtr
bool hasGeom() const
It returns true if the DataSetType has at least one geometry property; otherwise, it returns false...
A raster band description.
TEMAPEXPORT te::gm::Envelope GetExtent(const std::list< te::map::AbstractLayerPtr > &layers, int srid, bool onlyVisibles)
It calculates the extent of the given layers in the given SRID.
A class that models the name of any property of an object.
A class that models the description of a dataset.
unsigned int getNumberOfColumns() const
Returns the raster number of columns.
A Symbolizer describes how a feature is to appear on a map.
virtual const Band * getBand(std::size_t i) const =0
Returns the raster i-th band.
TEMAPEXPORT te::rst::RasterProperty * GetRasterProperty(DataSetLayer *layer)
It gets the raster property referenced by the given data set layer.
A visitor that converts a OGC Filter Expression to TerraLib Expression.
virtual int getHeight() const =0
It returns the canvas height.
The CoverageStyle defines the styling that is to be applied to a subset of Coverage data...
virtual void getValues(unsigned int c, unsigned int r, std::vector< double > &values) const
Returns the imaginary attribute values in all complex bands of a cell.
This class can be used to inform the progress of a task.
TEMAPEXPORT te::gm::GeomType GetGeomType(const te::map::AbstractLayerPtr &layer)
It gets the geometry type of the given layer.
te::da::Expression * getExpression(const te::fe::Filter *f)
It converts the OGC Filter Expression to a TerraLib Expression.
virtual int getWidth() const =0
It returns the canvas width.
An utility struct for representing 2D coordinates.
A layer with reference to a dataset.
const te::fe::Filter * getFilter() const
#define TE_TR(message)
It marks a string in order to get translated.
TEMAPEXPORT void DrawGeometries(te::da::DataSetType *type, te::da::DataSourcePtr ds, Canvas *canvas, const te::gm::Envelope &bbox, int bboxSRID, int srid, te::se::FeatureTypeStyle *style)
It draws the data set geometries in the given canvas using the informed SRID and style.
bool isActive() const
Verify if the task is active.
Boolean logic operator: AND.
void Union(const Envelope &rhs)
It updates the envelop with coordinates of another envelope.
void geoToGrid(const double &x, const double &y, double &col, double &row) const
Get the grid point associated to a spatial location.
This is an abstract class that models a query expression.
Rule * getRule(std::size_t i) const
const std::vector< Rule * > & getRules() const
TEMAPEXPORT te::gm::Envelope GetSelectedExtent(const std::list< te::map::AbstractLayerPtr > layers, int srid, bool onlyVisibles)
It calculates the extent of selected objects of the given layers in the given SRID.
virtual bool moveNext()=0
It moves the internal pointer to the next item of the collection.
TEMAPEXPORT te::da::DataSet * DataSet2Memory(te::da::DataSet *dataset)
It creates a new In-Memory dataset with the items from the given dataset.
void Tokenize(const std::string &str, std::vector< std::string > &tokens, const std::string &delimiters=" ")
It tokenizes a given string with a delimiter of your own choice.
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
void Free(std::vector< T * > *v)
This function can be applied to a pointer to a vector of pointers.
TEMAPEXPORT void GetDashStyle(const std::string &dasharray, std::vector< double > &style)
Converts a dasharray pattern coded by a string to a vector of double.
static RasterSummaryManager & getInstance()
It returns a reference to the singleton instance.
TERASTEREXPORT int Round(double val)
Round a double value to a integer value.
An Envelope defines a 2D rectangular region.
const std::string & getDataSourceId() const
The FeatureTypeStyle defines the styling that is to be applied to a dataset that can be viewed as a f...
#define TE_UNKNOWN_SRS
A numeric value to represent a unknown SRS identification in TerraLib.
This class represents a set of unique ids created in the same context. i.e. from the same data set...
An abstract class for raster data strucutures.
unsigned int getNumberOfRows() const
Returns the raster number of rows.
bool hasRaster() const
It returns true if the DataSetType has at least one raster property; otherwise, it returns false...
BandProperty * getProperty()
Returns the band property.
virtual std::size_t getNumberOfBands() const =0
Returns the number of bands (dimension of cells attribute values) in the raster.
unsigned int getNumberOfColumns() const
Returns the grid number of columns.
boost::ptr_vector< Field > Fields
Fields is just a boost::ptr_vector of Field pointers.
A visitor that converts a OGC Filter Expression to TerraLib Expression.
boost::ptr_vector< BandSummary > RasterSummary
RasterSummary is just a typedef of a boost::ptr_vector.
A class that can be used to model a filter expression that can be applied to a query.
void setExp(Expression *exp)
Sets the expression.
void pulse()
Calls setCurrentStep() function using getCurrentStep() + 1.
The RasterSymbolizer describes how to render raster/matrix-coverage data (e.g., satellite photos...
virtual void drawImage(char *src, std::size_t size, ImageType t)=0
It draws the src image over the canvas.
A raster band description.
A filter is any valid predicate expression.
Grid * getGrid()
It returns the raster grid.
TEMAPEXPORT te::rst::Raster * GetRaster(DataSetLayer *layer)
It gets the raster referenced by the given data set layer.
A Select models a query to be used when retrieving data from a DataSource.
virtual std::auto_ptr< te::gm::Geometry > getGeometry(std::size_t i) const =0
Method for retrieving a geometric attribute value.
const std::vector< Symbolizer * > & getSymbolizers() const
boost::ptr_vector< FromItem > From
It models the FROM clause for a query.
A Converter is responsible for the conversion of coordinates between different Coordinate Systems (CS...
A dataset is the unit of information manipulated by the data access module of TerraLib.
A canvas is an abstraction of a drawing area.
const std::string & getName() const
Returns the raster name.
A Rule is used to attach property/scale conditions to and group the individual symbols used for rende...
std::auto_ptr< te::gm::Envelope > GetExtent(te::da::DataSet *dset, te::qt::widgets::Promoter *p, const int &rowPosition)
static Raster * make()
It creates and returns an empty raster with default raster driver.
A helper class for 32-bit RGBA (Red-Green-Blue-Alpha channel) color.
TEMAPEXPORT te::rst::Raster * GetExtentRaster(te::rst::Raster *raster, int w, int h, const te::gm::Envelope &bbox, int bboxSRID, const te::gm::Envelope &visibleArea, int srid)
A class that models a literal for Envelope values.
void gridToGeo(const double &col, const double &row, double &x, double &y) const
Get the spatial location of a grid point.
int getType() const
It returns the data type of the elements in the band.
A layer with reference to a dataset.
TEDATAACCESSEXPORT std::size_t GetFirstPropertyPos(const te::da::DataSet *dataset, int datatype)
Visibility
Each layer can have three states of visibility.
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
A rectified grid is the spatial support for raster data.
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.
virtual int getBandDataType(std::size_t i) const =0
Returns the data type in a particular band (or dimension).
virtual void draw(const te::gm::Geometry *geom)=0
It draws the geometry on canvas.
bool isValid() const
It tells if the rectangle is valid or not.
TEMAPEXPORT void DrawRaster(te::da::DataSetType *type, te::da::DataSourcePtr ds, Canvas *canvas, const te::gm::Envelope &bbox, int bboxSRID, const te::gm::Envelope &visibleArea, int srid, te::se::CoverageStyle *style)
TEGEOMEXPORT Geometry * GetGeomFromEnvelope(const Envelope *const e, int srid)
It creates a Geometry (a polygon) from the given envelope.
TEMAPEXPORT void GetVisibleLayers(const std::list< te::map::AbstractLayerPtr > &layers, std::list< te::map::AbstractLayerPtr > &visibleLayers)
It gets the visible layers of the given layer list.
const std::string & getName() const
It returns the property name.