27 #ifndef __TERRALIB_RASTER_INTERNAL_POSITIONITERATOR_H 
   28 #define __TERRALIB_RASTER_INTERNAL_POSITIONITERATOR_H 
   31 #include "../common/STLUtils.h" 
   32 #include "../common/MathUtils.h" 
   33 #include "../core/logger/Logger.h" 
   34 #include "../geometry.h" 
   95         virtual std::complex< T > 
operator()(
const unsigned int i) 
const = 0;
 
   98         virtual unsigned int getRow() 
const = 0;
 
  204         std::complex< T > 
operator()(
const unsigned int i) 
const;
 
  206         unsigned int getRow() 
const;
 
  274           std::vector<std::pair<int, int> >& intersectionRanges ) 
const;
 
  282           std::vector<std::pair<int, int> >& intersectionRanges ) 
const;
 
  291           std::vector<std::pair<int, int> >& intersectionRanges ) 
const;
 
  313           std::vector< te::gm::Geometry const * >& geoms) 
const;        
 
  352         std::complex< T > 
operator()(
const unsigned int i) 
const;
 
  354         unsigned int getRow() 
const;
 
  425         std::complex< T > 
operator()(
const unsigned int i) 
const;
 
  427         unsigned int getRow() 
const;
 
  499       if( ! initialize( r, p, iterationType ) )
 
  501         throw te::rst::Exception( 
TE_TR(
"Iterator initialization error") );
 
  509       if( ! initialize( r, p, ScanLineIterationT ) )
 
  511         throw te::rst::Exception( 
TE_TR(
"Iterator initialization error") );
 
  528       std::vector<T> values( m_raster->getNumberOfBands());
 
  531       for (
unsigned int b = 0; b < this->m_raster->getNumberOfBands(); b++)
 
  533         m_raster->getValue( m_column, m_row, value, b);
 
  534         values[b] = ((T) value);
 
  542       this->m_raster->getValue(m_column, m_row, m_operatorBrackets_value, i);
 
  544       return (T) m_operatorBrackets_value;
 
  549       this->m_raster->getValue(m_column, m_row, m_operatorParenthesis_value, i);
 
  551       return (std::complex< T >) m_operatorParenthesis_value;
 
  566       if( m_column < m_currentRangeEndingColumn )
 
  572         if ( ( m_currentLineIntersectionRangesIndex + 1 ) < (
int)( m_currentLineIntersectionRanges.size() ) )
 
  574           ++m_currentLineIntersectionRangesIndex;
 
  575           m_column = m_currentRangeStartingColumn = m_currentLineIntersectionRanges[ m_currentLineIntersectionRangesIndex ].first;
 
  576           m_currentRangeEndingColumn = m_currentLineIntersectionRanges[ m_currentLineIntersectionRangesIndex ].second;
 
  580           if( m_row < m_polygonEndingRow )
 
  582             m_currentLineIntersectionRanges.clear();
 
  584             while( m_row <= m_polygonEndingRow )
 
  588               getIntersectionRanges( m_row, m_currentLineIntersectionRanges );
 
  590               if( ! m_currentLineIntersectionRanges.empty() )
 
  596             if( m_currentLineIntersectionRanges.empty() )
 
  602               m_column = m_currentRangeStartingColumn = m_currentLineIntersectionRanges[ 0 ].first;
 
  603               m_currentRangeEndingColumn = m_currentLineIntersectionRanges[ 0 ].second;
 
  604               m_currentLineIntersectionRangesIndex = 0;
 
  617       if(m_column > m_currentRangeStartingColumn )
 
  623         if( m_currentLineIntersectionRangesIndex > 0 )
 
  625           --m_currentLineIntersectionRangesIndex;
 
  626           m_currentRangeStartingColumn = m_currentLineIntersectionRanges[ m_currentLineIntersectionRangesIndex ].first;
 
  627           m_column = m_currentRangeEndingColumn = m_currentLineIntersectionRanges[ m_currentLineIntersectionRangesIndex ].second;
 
  631           if( m_row > m_polygonStartingRow )
 
  633             m_currentLineIntersectionRanges.clear();
 
  635             while( m_row >= m_polygonStartingRow )
 
  639               getIntersectionRanges( m_row, m_currentLineIntersectionRanges );
 
  641               if( ! m_currentLineIntersectionRanges.empty() )
 
  647             if( m_currentLineIntersectionRanges.empty() )
 
  653               m_currentLineIntersectionRangesIndex = 
static_cast<int>(m_currentLineIntersectionRanges.size()) - 1;
 
  654               m_currentRangeStartingColumn = m_currentLineIntersectionRanges[ m_currentLineIntersectionRangesIndex ].first;
 
  655               m_column = m_currentRangeEndingColumn = m_currentLineIntersectionRanges[ m_currentLineIntersectionRangesIndex ].second;
 
  748       return ( (this->m_row != rhs.
m_row) && (this->m_column != rhs.
m_column));
 
  762       m_iterationType = ScanLineIterationT;
 
  763       m_totalRasterColumns = 0;
 
  764       m_totalRasterRows = 0;
 
  765       m_polygonStartingColumn = -1;
 
  766       m_polygonEndingColumn = -1;
 
  767       m_polygonStartingRow = -1;
 
  768       m_polygonEndingRow = -1;
 
  772       m_currentRangeStartingColumn = -1;
 
  773       m_currentRangeEndingColumn = -1;
 
  774       m_currentLineIntersectionRangesIndex = -1;
 
  779       m_tileIndexerPtr.reset();
 
  780       m_currentLineIntersectionRanges.clear();
 
  787        std::vector<std::pair<int, int> >& intersectionRanges )
 const 
  789       switch( m_iterationType )
 
  791         case ScanLineIterationT :
 
  793           getScanLineIntersectionRanges( lineIndex, intersectionRanges );
 
  796         case NDisjointBBOXIterationT :
 
  798           getBBOXIntersectionRanges( lineIndex, 
false, intersectionRanges );
 
  801         case DisjointBBOXIterationT :
 
  803           getBBOXIntersectionRanges( lineIndex, 
true, intersectionRanges );
 
  808           throw te::rst::Exception( 
TE_TR(
"Invalid iteration type") );
 
  816        std::vector<std::pair<int, int> >& intersectionRanges )
 const 
  818       intersectionRanges.clear();
 
  822       const double& rasterEnvelopeLLX =
 
  823         m_raster->getGrid()->getExtent()->m_llx;
 
  824       const double& rasterEnvelopeURX =
 
  825         m_raster->getGrid()->getExtent()->m_urx;
 
  829       const double lineY = this->m_raster->getGrid()->gridToGeo(0, (
double)lineIndex).y;
 
  833         m_polygon->getSRID() );
 
  835       currline.
setX(0, std::min(
 
  837         m_polygon->getMBR()->getLowerLeft().x) );
 
  838       currline.
setY(0, lineY);
 
  840       currline.
setX(1, std::max(
 
  842         m_polygon->getMBR()->getUpperRight().x ) );
 
  843       currline.
setY(1, lineY);
 
  846       std::vector<te::gm::Point*> intersectionPoints;
 
  854           m_tileIndexerPtr->getTile(currline.
getY(0), ¤tTilePtr)
 
  856           ( currentTilePtr != 0 )
 
  860         std::unique_ptr<te::gm::Line> tileSeg;
 
  861         std::unique_ptr< te::gm::Geometry > interResultPtr;
 
  862         std::vector< te::gm::Geometry const* > singleGeomsPtrs;
 
  863         std::size_t singleGeomsPtrsIdx = 0;
 
  872           for (std::size_t i = 0; i < currentTilePtr->size(); i++)
 
  874             assert((*currentTilePtr)[i].first < m_polygon->getNumRings());
 
  877             assert(
dynamic_cast<te::gm::LinearRing const*
>((*m_polygon)[(*currentTilePtr)[i].first]));
 
  880             assert((*currentTilePtr)[i].second < m_polygon->getNPoints());
 
  884                                                           ringTile->
getY((*currentTilePtr)[i].second),
 
  887                                                           ringTile->
getY((*currentTilePtr)[i].second + 1),
 
  893             interResultPtr.reset( tileSeg->intersection( &currline ) );
 
  895             if( interResultPtr.get() != 0 )
 
  897               singleGeomsPtrs.clear();
 
  898               breakIntoSingleGeoms( interResultPtr.get(), singleGeomsPtrs );
 
  900               for( singleGeomsPtrsIdx = 0 ; singleGeomsPtrsIdx < singleGeomsPtrs.size() ;
 
  901                 ++singleGeomsPtrsIdx )
 
  903                 if( singleGeomsPtrs[ singleGeomsPtrsIdx ]->getGeomTypeId() ==
 
  907                     singleGeomsPtrs[ singleGeomsPtrsIdx ]->clone() ) );
 
  909                 else if( singleGeomsPtrs[ singleGeomsPtrsIdx ]->getGeomTypeId() ==
 
  913                     singleGeomsPtrsIdx ]);
 
  915                   if( lineStrPtr->
size() > 1 )
 
  917                     intersectionPoints.push_back( lineStrPtr->
getStartPoint().release() );
 
  918                     intersectionPoints.push_back( lineStrPtr->
getEndPoint().release() );
 
  925         catch(
const std::exception& e)
 
  927           TE_LOG_WARN( 
"Geometry intersection error:" + e.what() );
 
  931           for( std::size_t intersectionPointsIdx = 0; intersectionPointsIdx <
 
  932             intersectionPoints.size() ; ++intersectionPointsIdx )
 
  934             delete intersectionPoints[intersectionPointsIdx];
 
  937           intersectionPoints.clear();
 
  945           for( std::size_t intersectionPointsIdx = 0; intersectionPointsIdx <
 
  946             intersectionPoints.size() ; ++intersectionPointsIdx )
 
  948             delete intersectionPoints[intersectionPointsIdx];
 
  951           intersectionPoints.clear();
 
  958         std::size_t positionBegin = 0;
 
  959         std::size_t positionEnd = 0;
 
  960         std::vector<te::gm::Point*> intersectionPointsAux = intersectionPoints;
 
  962         intersectionPoints.clear();
 
  964         while( positionBegin < intersectionPointsAux.size() )
 
  966           if( intersectionPointsAux[positionBegin] )
 
  968             positionEnd = positionBegin + 1;
 
  970             while( positionEnd < intersectionPointsAux.size() )
 
  973                   ( intersectionPointsAux[positionEnd] != 0 )
 
  975                   intersectionPointsAux[positionBegin]->equals(
 
  976                     intersectionPointsAux[positionEnd], 
true)
 
  979                 delete intersectionPointsAux[positionEnd];
 
  980                 intersectionPointsAux[positionEnd] = 0;
 
  986             intersectionPoints.push_back( intersectionPointsAux[positionBegin] );
 
  994       std::sort(intersectionPoints.begin(), intersectionPoints.end(),
 
 1000       std::size_t positionBegin = 0;
 
 1001       std::size_t positionEnd = 0;
 
 1002       int startingCol = 0;
 
 1004       double startingX = 0;
 
 1005       double startingY = 0;
 
 1009       while( ( positionBegin + 1 ) < intersectionPoints.size() )
 
 1011         positionEnd = positionBegin + 1;
 
 1013         startingX = intersectionPoints[positionBegin]->getX();
 
 1014         startingX = std::max( startingX, rasterEnvelopeLLX );
 
 1016         startingY = intersectionPoints[positionBegin]->getY();
 
 1018         endingX = intersectionPoints[positionEnd]->getX();
 
 1019         endingX = std::min( endingX, rasterEnvelopeURX );
 
 1021         endingY = intersectionPoints[positionEnd]->getY();
 
 1028             ( startingX != endingX )
 
 1032                 (startingX + (endingX - startingX) / 2.0 ),
 
 1033                 (startingY +(endingY - startingY) / 2.0 ),
 
 1034                 m_polygon->getSRID()))
 
 1041           startingCol = (int)std::ceil( m_raster->getGrid()->geoToGrid(startingX, startingY).x );
 
 1042           startingCol = std::max( 0, startingCol );
 
 1043           startingCol = std::min( m_totalRasterColumns - 1, startingCol );
 
 1045           endingCol = (int)std::floor( m_raster->getGrid()->geoToGrid(endingX, endingY).x );
 
 1046           endingCol = std::max( 0, endingCol );
 
 1047           endingCol = std::min( m_totalRasterColumns - 1, endingCol );
 
 1049           if( endingCol >= startingCol )
 
 1051             intersectionRanges.push_back(std::pair<int, int>(startingCol, endingCol));
 
 1055         positionBegin = positionEnd;
 
 1062       while ( positionBegin < intersectionPoints.size() )
 
 1064         delete intersectionPoints[positionBegin];
 
 1069     template<
typename T>
 
 1071        const bool areDisjoint, std::vector<std::pair<int, int> >& intersectionRanges )
 const 
 1073       intersectionRanges.clear();
 
 1075       double ulXCoord = 0;
 
 1076       double ulYCoord = 0;
 
 1077       m_raster->getGrid()->gridToGeo( ((
double)m_polygonStartingColumn) - 0.5,
 
 1078         ((
double)lineIndex) - 0.5, ulXCoord, ulYCoord);
 
 1080       const double yRes = this->m_raster->getGrid()->getResolutionY();
 
 1081       const double xRes = this->m_raster->getGrid()->getResolutionX();
 
 1084         m_polygon->getSRID(), 0 );
 
 1088       bool rangeStarted = 
false;
 
 1089       std::pair<int, int> range;
 
 1091       for(  
int col = m_polygonStartingColumn ; col <= m_polygonEndingColumn ; ++col )
 
 1094         currBBOXCoordsPtr[ 0 ].
x = currBBOXCoordsPtr[ 4 ].
x =
 
 1095           ulXCoord + ( xRes * (double)( col - m_polygonStartingColumn ) );
 
 1096         currBBOXCoordsPtr[ 0 ].
y = currBBOXCoordsPtr[ 4 ].
y = ulYCoord;
 
 1099         currBBOXCoordsPtr[ 1 ].
x = currBBOXCoordsPtr[ 0 ].
x + xRes;
 
 1100         currBBOXCoordsPtr[ 1 ].
y = ulYCoord;
 
 1103         currBBOXCoordsPtr[ 2 ].
x = currBBOXCoordsPtr[ 1 ].
x;
 
 1104         currBBOXCoordsPtr[ 2 ].
y = ulYCoord - yRes;
 
 1107         currBBOXCoordsPtr[ 3 ].
x = currBBOXCoordsPtr[ 0 ].
x;
 
 1108         currBBOXCoordsPtr[ 3 ].
y = ulYCoord - yRes;
 
 1110         if( areDisjoint == currBBOX.
disjoint( m_polygon ) )
 
 1118             rangeStarted = 
true;
 
 1119             range.first = range.second = col;
 
 1126             rangeStarted = 
false;
 
 1127             intersectionRanges.push_back( range );
 
 1135         intersectionRanges.push_back( range );
 
 1139     template<
typename T>
 
 1149       m_iterationType = iterationType;
 
 1165           ( ll.
x > rasterEnvelope.
m_urx )
 
 1167           ( ur.
x < rasterEnvelope.
m_llx )
 
 1169           ( ur.
y < rasterEnvelope.
m_lly )
 
 1171           ( ll.
y > rasterEnvelope.
m_ury )
 
 1185         m_polygonStartingRow = (int)std::floor( urIndexed.
y );
 
 1186         m_polygonStartingRow = std::max( 0, m_polygonStartingRow );
 
 1187         m_polygonStartingRow = std::min( m_polygonStartingRow, ((
int)rasterGrid.
getNumberOfRows()) - 1 );
 
 1189         m_polygonEndingRow = (int)std::ceil( llIndexed.
y );
 
 1190         m_polygonEndingRow = std::max( 0, m_polygonEndingRow );
 
 1191         m_polygonEndingRow = std::min( m_polygonEndingRow, ((
int)rasterGrid.
getNumberOfRows()) - 1 );
 
 1193         m_polygonStartingColumn = (int)std::floor( llIndexed.
x );
 
 1194         m_polygonStartingColumn = std::max( 0, m_polygonStartingColumn );
 
 1195         m_polygonStartingColumn = std::min( m_polygonStartingColumn, ((
int)rasterGrid.
getNumberOfColumns()) - 1 );
 
 1197         m_polygonEndingColumn = (int)std::ceil( urIndexed.
x );
 
 1198         m_polygonEndingColumn = std::max( 0, m_polygonEndingColumn );
 
 1199         m_polygonEndingColumn = std::min( m_polygonEndingColumn, ((
int)rasterGrid.
getNumberOfColumns()) - 1 );
 
 1202             ( m_polygonEndingRow < m_polygonStartingRow )
 
 1204             ( m_polygonEndingColumn < m_polygonStartingColumn )
 
 1213           if( m_iterationType == ScanLineIterationT )
 
 1220           m_row = m_polygonStartingRow;
 
 1222           while( m_row <= m_polygonEndingRow )
 
 1224             getIntersectionRanges( m_row, m_currentLineIntersectionRanges );
 
 1226             if( ! m_currentLineIntersectionRanges.empty() )
 
 1234           if( m_currentLineIntersectionRanges.empty() )
 
 1240             m_column = m_currentRangeStartingColumn = m_currentLineIntersectionRanges[ 0 ].first;
 
 1241             m_currentRangeEndingColumn = m_currentLineIntersectionRanges[ 0 ].second;
 
 1242             m_currentLineIntersectionRangesIndex = 0;
 
 1250     template<
typename T>
 
 1253       std::vector< te::gm::Geometry const * >& geoms)
 const 
 1263         for (std::size_t i = 0; i < nGeoms ; ++i)
 
 1266           breakIntoSingleGeoms(currentGeom, geoms);
 
 1271         geoms.push_back( g );
 
 1282         m_currentpixelindex(0),
 
 1290         m_currentpixelindex(0),
 
 1295         throw te::rst::Exception( 
TE_TR(
"Invalid line SRID") );
 
 1315       double startingcolumn;
 
 1317       std::unique_ptr<te::gm::Point> startpoint = inrasterline->
getStartPoint();
 
 1319                                            startingcolumn, startingrow);
 
 1321       double endingcolumn;
 
 1323       std::unique_ptr<te::gm::Point> endpoint = inrasterline->
getEndPoint();
 
 1325                                            endingcolumn, endingrow);
 
 1330       double x1, x2, y1, y2, geoX, geoY;
 
 1331       for(
int r = (
int)startingrow; r <= (int)endingrow; r++)
 
 1332         for(
int c = (
int)startingcolumn; c <= (int)endingcolumn; c++)
 
 1336           x1 = geoX - resXdiv2; y1 = geoY - resYdiv2;
 
 1337           x2 = geoX + resXdiv2; y2 = geoY + resYdiv2;
 
 1351       : m_raster(rhs.m_raster),
 
 1352         m_currentpixelindex(rhs.m_currentpixelindex),
 
 1353         m_pixelsinline(rhs.m_pixelsinline)
 
 1359       m_pixelsinline.clear();
 
 1364       std::vector<T> values(this->m_raster->getNumberOfBands());
 
 1367       for (
unsigned int b = 0; b < this->m_raster->getNumberOfBands(); b++)
 
 1369         this->m_raster->getValue(getColumn(), getRow(), value, b);
 
 1370         values[b] = ((T) value);
 
 1378       this->m_raster->getValue(getColumn(), getRow(), m_operatorBrackets_value, i);
 
 1380       return (T) m_operatorBrackets_value;
 
 1385       this->m_raster->getValue(getColumn(), getRow(), m_operatorParenthesis_value, i);
 
 1387       return (std::complex< T >) m_operatorParenthesis_value;
 
 1392       return (
unsigned int)(m_pixelsinline[m_currentpixelindex]->getY());
 
 1397       return (
unsigned int)(m_pixelsinline[m_currentpixelindex]->getX());
 
 1402       m_currentpixelindex++;
 
 1404       if (m_currentpixelindex >= (
int)(m_pixelsinline.size()))
 
 1410       m_currentpixelindex--;
 
 1412       if (m_currentpixelindex < 0)
 
 1430     template<
typename T>
 
 1439       this->m_currentpixelindex = -1;
 
 1461     template<
typename T>
 
 1471         m_pixelsinpointset(0),
 
 1472         m_currentpixelindex(0)
 
 1478         m_pixelsinpointset(p),
 
 1479         m_currentpixelindex(0)
 
 1487       std::vector<te::gm::Point*> inside_points;
 
 1494           throw te::rst::Exception( 
TE_TR(
"Invalid point SRID") );
 
 1513       : m_raster(rhs.m_raster),
 
 1514         m_pixelsinpointset(rhs.m_pixelsinpointset),
 
 1515         m_currentpixelindex(rhs.m_currentpixelindex)
 
 1521       m_pixelsinpointset.clear();
 
 1526       std::vector<T> values(this->m_raster->getNumberOfBands());
 
 1529       for (
unsigned int b = 0; b < this->m_raster->getNumberOfBands(); b++)
 
 1531         this->m_raster->getValue(getColumn(), getRow(), value, b);
 
 1532         values[b] = ((T) value);
 
 1540       this->m_raster->getValue(getColumn(), getRow(), m_operatorBrackets_value, i);
 
 1542       return (T) m_operatorBrackets_value;
 
 1547       this->m_raster->getValue(getColumn(), getRow(), m_operatorParenthesis_value, i);
 
 1549       return (std::complex< T >) m_operatorParenthesis_value;
 
 1554       return (
unsigned int)(m_pixelsinpointset[m_currentpixelindex]->getY());
 
 1559       return (
unsigned int)(m_pixelsinpointset[m_currentpixelindex]->getX());
 
 1564       m_currentpixelindex++;
 
 1566       if (m_currentpixelindex >= (
int) m_pixelsinpointset.size())
 
 1572       m_currentpixelindex--;
 
 1574       if (m_currentpixelindex < 0)
 
 1591     template<
typename T>
 
 1600       this->m_currentpixelindex = -1;
 
 1622     template<
typename T>
 
It describes one band (or dimension) of a raster.
 
Utility functions for dealing with raster data blocks.
 
#define TE_LOG_WARN(message)
Use this tag in order to log a message to the TerraLib default logger with the WARN level.
 
#define TE_TR(message)
It marks a string in order to get translated.
 
An Envelope defines a 2D rectangular region.
 
double m_llx
Lower left corner x-coordinate.
 
double m_urx
Upper right corner x-coordinate.
 
double m_ury
Upper right corner y-coordinate.
 
double m_lly
Lower left corner y-coordinate.
 
It is a collection of other geometric objects.
 
std::size_t getNumGeometries() const
It returns the number of geometries in this GeometryCollection.
 
Geometry * getGeometryN(std::size_t i) const
It returns the n-th geometry in this GeometryCollection.
 
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
 
virtual Geometry * intersection(const Geometry *const rhs) const _NOEXCEPT_OP(false)
It returns a geometric object that represents the point set intersection with another geometry.
 
virtual bool isEmpty() const _NOEXCEPT_OP(false)
It returns true if this geometric object is the empty Geometry.
 
int getSRID() const _NOEXCEPT_OP(true)
It returns the Spatial Reference System ID associated to this geometric object.
 
virtual bool disjoint(const Geometry *const rhs) const _NOEXCEPT_OP(false)
It returns true if the geometry object is spatially disjoint from rhs geometry.
 
LineString is a curve with linear interpolation between points.
 
void setX(std::size_t i, const double &x)
It sets the n-th x coordinate value.
 
const double & getX(std::size_t i) const
It returns the n-th x coordinate value.
 
const double & getY(std::size_t i) const
It returns the n-th y coordinate value.
 
std::unique_ptr< Point > getEndPoint() const
It returns the curve end point.
 
Coord2D * getCoordinates() const
It returns a pointer to the internal array of coordinates.
 
void setNumCoordinates(std::size_t size)
It reserves room for the number of coordinates in this LineString.
 
std::unique_ptr< Point > getStartPoint() const
The length of this Curve in its associated spatial reference.
 
std::size_t size() const
It returns the number of points (vertexes) in the geometry.
 
void setY(std::size_t i, const double &y)
It sets the n-th y coordinate value.
 
A Line is LineString with 2 points.
 
A LinearRing is a LineString that is both closed and simple.
 
A point with x and y coordinate values.
 
Polygon is a subclass of CurvePolygon whose rings are defined by linear rings.
 
This class is the base for implementing ways to navigate over the band with spatial restriction,...
 
virtual T operator[](const unsigned int i) const =0
Returns the real value in current position (column, row, band) from iterator.
 
virtual void operator--()=0
Returns to the previous position.
 
virtual std::complex< T > operator()(const unsigned int i) const =0
Returns the complex value in current position (column, row, band) from iterator.
 
virtual ~AbstractPositionIterator()
Destructor.
 
virtual AbstractPositionIterator< T > & operator=(const AbstractPositionIterator< T > &rhs)
Assignment operator.
 
virtual unsigned int getRow() const =0
Returns the current row in iterator.
 
virtual bool operator!=(const AbstractPositionIterator< T > &rhs) const =0
Difference operator.
 
virtual const std::vector< T > operator*() const =0
Returns a vector of the values in current position (column, row) from iterator.
 
AbstractPositionIterator()
Constructor.
 
virtual void operator++()=0
Advances to the next position.
 
virtual void setEnd()=0
Sets the iterator position to the end of the current band.
 
virtual unsigned int getColumn() const =0
Returns the current column in iterator.
 
A rectified grid is the spatial support for raster data.
 
void gridToGeo(const double &col, const double &row, double &x, double &y) const
Get the spatial location of a grid point.
 
unsigned int getNumberOfColumns() const
Returns the grid number of columns.
 
double getResolutionY() const
Returns the grid vertical (y-axis) resolution.
 
unsigned int getNumberOfRows() const
Returns the grid number of rows.
 
void geoToGrid(const double &x, const double &y, double &col, double &row) const
Get the grid point associated to a spatial location.
 
te::gm::Envelope * getExtent()
Returns the geographic extension of the grid.
 
This class implements the strategy to iterate with spatial restriction, the iteration occurs inside a...
 
static LineIterator begin(const te::rst::Raster *r, const te::gm::Line *l)
Returns an iterator referring to the first value of the band.
 
void operator--()
Returns to the previous position.
 
bool operator!=(const LineIterator< T > &rhs) const
 
std::complex< T > operator()(const unsigned int i) const
Returns the complex value in current position (column, row, band) from iterator.
 
static LineIterator end(const te::rst::Raster *r, const te::gm::Line *l)
Returns an iterator referring to after the end of the iterator.
 
unsigned int getColumn() const
Returns the current column in iterator.
 
unsigned int getRow() const
Returns the current row in iterator.
 
LineIterator & operator=(const LineIterator &rhs)
 
double m_operatorBrackets_value
Used by the operator[] method.
 
void setEnd()
Sets the iterator position to the end of the current band.
 
void operator++()
Advances to the next position.
 
const te::gm::Line * m_line
The spatial restriction to be applied in the iterator.
 
std::vector< te::gm::Point * > m_pixelsinline
A vector of pixel locations that intersects the line.
 
std::complex< double > m_operatorParenthesis_value
Used by the operator() method.
 
const te::rst::Raster * m_raster
The band from where to get the values.
 
const std::vector< T > operator*() const
Returns a vector of the values in current position (column, row) from iterator.
 
int m_currentpixelindex
The index of the current pixel location.
 
T operator[](const unsigned int i) const
Returns the real value in current position (column, row, band) from iterator.
 
This class implements the strategy to iterate with spatial restriction, the iteration occurs inside a...
 
T operator[](const unsigned int i) const
Returns the real value in current position (column, row, band) from iterator.
 
PointSetIterator & operator=(const PointSetIterator &rhs)
 
const std::vector< T > operator*() const
Returns a vector of the values in current position (column, row) from iterator.
 
unsigned int getRow() const
Returns the current row in iterator.
 
unsigned int getColumn() const
Returns the current column in iterator.
 
void operator--()
Returns to the previous position.
 
bool operator!=(const PointSetIterator< T > &rhs) const
 
std::complex< double > m_operatorParenthesis_value
Used by the operator() method.
 
void setEnd()
Sets the iterator position to the end of the current band.
 
static PointSetIterator end(const te::rst::Raster *r, const std::vector< te::gm::Point * > p)
Returns an iterator referring to after the end of the iterator.
 
std::vector< te::gm::Point * > m_pixelsinpointset
The spatial restriction to be applied in the iterator.
 
std::complex< T > operator()(const unsigned int i) const
Returns the complex value in current position (column, row, band) from iterator.
 
int m_currentpixelindex
The index of the current pixel location.
 
double m_operatorBrackets_value
Used by the operator[] method.
 
const te::rst::Raster * m_raster
The band from where to get the values.
 
static PointSetIterator begin(const te::rst::Raster *r, const std::vector< te::gm::Point * > p)
Returns an iterator referring to the first value of the band.
 
void operator++()
Advances to the next position.
 
This class implements the strategy to iterate with spatial restriction, the iteration occurs inside a...
 
PolygonIterator & operator=(const PolygonIterator &rhs)
 
const te::gm::Polygon * m_polygon
The spatial restriction to be applied in the iterator (default 0).
 
bool operator!=(const PolygonIterator< T > &rhs) const
 
int m_row
The current row of the iterator (default -1).
 
int m_totalRasterColumns
The number of columns in band (default: 0).
 
int m_polygonEndingRow
Polygon last raster row (default: -1).
 
void breakIntoSingleGeoms(te::gm::Geometry const *const g, std::vector< te::gm::Geometry const * > &geoms) const
It will get a GeometryCollection and distribute in a vector.
 
void setEnd()
Sets the iterator position to the end of the current band.
 
std::complex< T > operator()(const unsigned int i) const
Returns the complex value in current position (column, row, band) from iterator.
 
std::vector< std::pair< int, int > > m_currentLineIntersectionRanges
Coordinates of the columns to be transversed.
 
T operator[](const unsigned int i) const
Returns the real value in current position (column, row, band) from iterator.
 
int m_polygonStartingColumn
Polygon first raster column (default: -1).
 
void getIntersectionRanges(int lineIndex, std::vector< std::pair< int, int > > &intersectionRanges) const
Returns the given line intersection ranges (Coordinates of the columns to be transversed) using the c...
 
void clear()
Clear all internal allocated objects and reset back to the initial state.
 
IterationType m_iterationType
Current iteration type (default ScanLineIterationT).
 
static PolygonIterator begin(const te::rst::Raster *r, const te::gm::Polygon *p, const IterationType iterationType)
Returns an iterator referring to the first value of the band.
 
void getBBOXIntersectionRanges(int lineIndex, const bool areDisjoint, std::vector< std::pair< int, int > > &intersectionRanges) const
Returns the given line intersection ranges using the pixel bounding box as reference.
 
void initiateVariables()
Initialize all internal variables to initial states.
 
void operator--()
Returns to the previous position.
 
int m_column
The current column of the iterator (default -1).
 
bool initialize(const te::rst::Raster *r, const te::gm::Polygon *p, const IterationType iterationType)
Initialize this instance.
 
const std::vector< T > operator*() const
Returns a vector of the values in current position (column, row) from iterator.
 
const te::rst::Raster * m_raster
The band from where to get the values (default 0).
 
std::complex< double > m_operatorParenthesis_value
 
int m_currentRangeEndingColumn
The current line iteration range column to finalize the iteration (default: -1).
 
@ ScanLineIterationT
Scan line iteration type.
 
@ DisjointBBOXIterationT
Itaration over pixels whose bounding boxes are disjoint in relation with the polygon.
 
@ NDisjointBBOXIterationT
Itaration over pixels whose bounding boxes are not disjoint in relation with the polygon.
 
double m_operatorBrackets_value
 
void operator++()
Advances to the next position.
 
std::unique_ptr< te::rst::TileIndexer > m_tileIndexerPtr
Tile indexer used to optimize the geometric operations.
 
unsigned int getRow() const
Returns the current row in iterator.
 
int m_totalRasterRows
The number of rows in band (default: 0).
 
int m_currentLineIntersectionRangesIndex
The actual line of the iterator (default -1).
 
void getScanLineIntersectionRanges(int lineIndex, std::vector< std::pair< int, int > > &intersectionRanges) const
Returns the given line intersection ranges (Coordinates of the columns to be transversed) using the S...
 
int m_polygonStartingRow
Polygon first raster row (default: -1).
 
static PolygonIterator end(const te::rst::Raster *r, const te::gm::Polygon *p)
Returns an iterator referring to after the end of the iterator.
 
int m_polygonEndingColumn
Polygon last raster column (default: -1).
 
unsigned int getColumn() const
Returns the current column in iterator.
 
int m_currentRangeStartingColumn
The current line iteration range starting column (default: -1).
 
An abstract class for raster data strucutures.
 
double getResolutionY() const
Returns the raster vertical (y-axis) resolution.
 
int getSRID() const
Returns the raster spatial reference system identifier.
 
te::gm::Envelope * getExtent()
Returns the geographic extension of the raster data.
 
unsigned int getNumberOfRows() const
Returns the raster number of rows.
 
Grid * getGrid()
It returns the raster grid.
 
double getResolutionX() const
Returns the raster horizontal (x-axis) resolution.
 
unsigned int getNumberOfColumns() const
Returns the raster number of columns.
 
Polygon tile indexing class for optmized geometrical relational tests.
 
std::vector< std::pair< unsigned int, unsigned int > > TileSegIndex
 
TEDATAACCESSEXPORT te::da::Expression * operator!=(const te::da::Expression &e1, const te::da::Expression &e2)
 
TEGEOMEXPORT Geometry * GetGeomFromEnvelope(const Envelope *const e, int srid)
It creates a Geometry (a polygon) from the given envelope.
 
TEGEOMEXPORT bool SatisfySpatialRelation(const Geometry *g1, const Geometry *g2, SpatialRelation relation)
It returns if two geometries satisfy a given spatial relation.
 
bool StdSortPointPointerComparison(te::gm::Point *p1, te::gm::Point *p2)
 
A rectified grid is the spatial support for raster data.
 
An utility struct for representing 2D coordinates.
 
Band implementation for TerraLib 4.x.
 
An exception class for the XML module.