23 , mMaximumTileWidth( DEFAULT_MAXIMUM_TILE_WIDTH )
24 , mMaximumTileHeight( DEFAULT_MAXIMUM_TILE_HEIGHT )
40 const double xRes = rasterExtent.
width() / rasterWidth;
41 const double yRes = rasterExtent.
height() / rasterHeight;
44 int bottom = rasterHeight - 1;
46 int right = rasterWidth - 1;
66 subRegionWidth = right - left + 1;
67 subRegionHeight = bottom - top + 1;
72 rasterExtent.
yMaximum() - ( ( top + subRegionHeight ) * yRes ),
73 rasterExtent.
xMinimum() + ( ( left + subRegionWidth ) * xRes ),
74 rasterExtent.
yMaximum() - ( top * yRes ) );
88 removePartInfo( bandNumber );
96 mRasterPartInfos.insert( bandNumber, pInfo );
101 return readNextRasterPartInternal( bandNumber, columns, rows,
nullptr, topLeftColumn, topLeftRow, &blockExtent );
105 int &nCols,
int &nRows,
107 int &topLeftCol,
int &topLeftRow )
110 std::unique_ptr< QgsRasterBlock > nextBlock;
111 const bool result =
readNextRasterPart( bandNumber, nCols, nRows, nextBlock, topLeftCol, topLeftRow );
113 *block = nextBlock.release();
119 return readNextRasterPartInternal( bandNumber, nCols, nRows, &block, topLeftCol, topLeftRow, blockExtent );
122 bool QgsRasterIterator::readNextRasterPartInternal(
int bandNumber,
int &nCols,
int &nRows, std::unique_ptr<QgsRasterBlock> *block,
int &topLeftCol,
int &topLeftRow,
QgsRectangle *blockExtent )
128 const QMap<int, RasterPartInfo>::iterator partIt = mRasterPartInfos.find( bandNumber );
129 if ( partIt == mRasterPartInfos.end() )
134 RasterPartInfo &pInfo = partIt.value();
137 if ( 0 == pInfo.nCols || 0 == pInfo.nRows )
145 if ( pInfo.currentCol == pInfo.nCols && pInfo.currentRow == pInfo.nRows )
151 nCols =
static_cast< int >( std::min(
static_cast< qgssize >( mMaximumTileWidth ), pInfo.nCols - pInfo.currentCol ) );
152 nRows =
static_cast< int >( std::min(
static_cast< qgssize >( mMaximumTileHeight ), pInfo.nRows - pInfo.currentRow ) );
153 QgsDebugMsgLevel( QStringLiteral(
"nCols = %1 nRows = %2" ).arg( nCols ).arg( nRows ), 4 );
157 const double xmin = viewPortExtent.
xMinimum() + pInfo.currentCol /
static_cast< double >( pInfo.nCols ) * viewPortExtent.
width();
158 const double xmax = pInfo.currentCol + nCols == pInfo.nCols ? viewPortExtent.
xMaximum() :
159 viewPortExtent.
xMinimum() + ( pInfo.currentCol + nCols ) /
static_cast< double >( pInfo.nCols ) * viewPortExtent.
width();
160 const double ymin = pInfo.currentRow + nRows == pInfo.nRows ? viewPortExtent.
yMinimum() :
161 viewPortExtent.
yMaximum() - ( pInfo.currentRow + nRows ) /
static_cast< double >( pInfo.nRows ) * viewPortExtent.
height();
162 const double ymax = viewPortExtent.
yMaximum() - pInfo.currentRow /
static_cast< double >( pInfo.nRows ) * viewPortExtent.
height();
166 *blockExtent = blockRect;
169 block->reset( mInput->
block( bandNumber, blockRect, nCols, nRows, mFeedback ) );
170 topLeftCol = pInfo.currentCol;
171 topLeftRow = pInfo.currentRow;
173 pInfo.currentCol += nCols;
174 if ( pInfo.currentCol == pInfo.nCols && pInfo.currentRow + nRows == pInfo.nRows )
176 pInfo.currentRow = pInfo.nRows;
178 else if ( pInfo.currentCol == pInfo.nCols )
180 pInfo.currentCol = 0;
181 pInfo.currentRow += nRows;
189 removePartInfo( bandNumber );
192 void QgsRasterIterator::removePartInfo(
int bandNumber )
194 const auto partIt = mRasterPartInfos.constFind( bandNumber );
195 if ( partIt != mRasterPartInfos.constEnd() )
197 mRasterPartInfos.remove( bandNumber );