Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsrasteriterator.h 3 : : --------------------- 4 : : begin : July 2012 5 : : copyright : (C) 2012 by Marco Hugentobler 6 : : email : marco dot hugentobler at sourcepole dot ch 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : #ifndef QGSRASTERITERATOR_H 16 : : #define QGSRASTERITERATOR_H 17 : : 18 : : #include "qgis_core.h" 19 : : #include "qgsrectangle.h" 20 : : #include "qgis_sip.h" 21 : : #include <QMap> 22 : : 23 : : class QgsMapToPixel; 24 : : class QgsRasterBlock; 25 : : class QgsRasterBlockFeedback; 26 : : class QgsRasterInterface; 27 : : class QgsRasterProjector; 28 : : struct QgsRasterViewPort; 29 : : 30 : : /** 31 : : * \ingroup core 32 : : * \brief Iterator for sequentially processing raster cells. 33 : : */ 34 : 0 : class CORE_EXPORT QgsRasterIterator 35 : : { 36 : : public: 37 : : 38 : : /** 39 : : * Constructor for QgsRasterIterator, iterating over the specified \a input raster source. 40 : : */ 41 : : QgsRasterIterator( QgsRasterInterface *input ); 42 : : 43 : : /** 44 : : * Start reading of raster band. Raster data can then be retrieved by calling readNextRasterPart until it returns FALSE. 45 : : * \param bandNumber number of raster band to read 46 : : * \param nCols number of columns 47 : : * \param nRows number of rows 48 : : * \param extent area to read 49 : : * \param feedback optional raster feedback object for cancellation/preview. Added in QGIS 3.0. 50 : : */ 51 : : void startRasterRead( int bandNumber, qgssize nCols, qgssize nRows, const QgsRectangle &extent, QgsRasterBlockFeedback *feedback = nullptr ); 52 : : 53 : : /** 54 : : * Fetches details of the next part of the raster data. This method does NOT actually fetch the raster 55 : : * data itself, rather it calculates and iterates over the details of the raster alone. 56 : : * 57 : : * It's useful for iterating over several layers using a target "reference" layer. E.g. summing 58 : : * the pixels in n rasters whilst aligning the result to a reference layer which is not being summed. 59 : : * 60 : : * Note that calling this method also advances the iterator, just like calling readNextRasterPart(). 61 : : * 62 : : * \param bandNumber band to read 63 : : * \param columns number of columns on output device 64 : : * \param rows number of rows on output device 65 : : * \param topLeftColumn top left column 66 : : * \param topLeftRow top left row 67 : : * \param blockExtent exact extent of returned raster block 68 : : * \returns FALSE if the last part was already returned 69 : : * 70 : : * \since QGIS 3.6 71 : : */ 72 : : bool next( int bandNumber, int &columns SIP_OUT, int &rows SIP_OUT, int &topLeftColumn SIP_OUT, int &topLeftRow SIP_OUT, QgsRectangle &blockExtent SIP_OUT ); 73 : : 74 : : /** 75 : : * Fetches next part of raster data, caller takes ownership of the block and 76 : : * caller should delete the block. 77 : : * \param bandNumber band to read 78 : : * \param nCols number of columns on output device 79 : : * \param nRows number of rows on output device 80 : : * \param block address of block pointer 81 : : * \param topLeftCol top left column 82 : : * \param topLeftRow top left row 83 : : * \returns FALSE if the last part was already returned 84 : : */ 85 : : bool readNextRasterPart( int bandNumber, 86 : : int &nCols, int &nRows, 87 : : QgsRasterBlock **block, 88 : : int &topLeftCol, int &topLeftRow ); 89 : : 90 : : /** 91 : : * Fetches next part of raster data. 92 : : * \param bandNumber band to read 93 : : * \param nCols number of columns on output device 94 : : * \param nRows number of rows on output device 95 : : * \param block address of block pointer 96 : : * \param topLeftCol top left column 97 : : * \param topLeftRow top left row 98 : : * \param blockExtent optional storage for exact extent of returned raster block 99 : : * \returns FALSE if the last part was already returned 100 : : * \note Not available in Python bindings 101 : : * \since QGIS 3.2 102 : : */ 103 : : bool readNextRasterPart( int bandNumber, 104 : : int &nCols, int &nRows, 105 : : std::unique_ptr< QgsRasterBlock > &block, 106 : : int &topLeftCol, int &topLeftRow, 107 : : QgsRectangle *blockExtent = nullptr ) SIP_SKIP; 108 : : 109 : : /** 110 : : * Cancels the raster iteration and resets the iterator. 111 : : */ 112 : : void stopRasterRead( int bandNumber ); 113 : : 114 : : /** 115 : : * Returns the input raster interface which is being iterated over. 116 : : */ 117 : 0 : const QgsRasterInterface *input() const { return mInput; } 118 : : 119 : : /** 120 : : * Sets the maximum tile width returned during iteration. 121 : : * \see maximumTileWidth() 122 : : * \see setMaximumTileHeight() 123 : : */ 124 : 0 : void setMaximumTileWidth( int w ) { mMaximumTileWidth = w; } 125 : : 126 : : /** 127 : : * Returns the maximum tile width returned during iteration. 128 : : * \see setMaximumTileWidth() 129 : : * \see maximumTileHeight() 130 : : */ 131 : 0 : int maximumTileWidth() const { return mMaximumTileWidth; } 132 : : 133 : : /** 134 : : * Sets the minimum tile height returned during iteration. 135 : : * \see maximumTileHeight() 136 : : * \see setMaximumTileWidth() 137 : : */ 138 : 0 : void setMaximumTileHeight( int h ) { mMaximumTileHeight = h; } 139 : : 140 : : /** 141 : : * Returns the minimum tile width returned during iteration. 142 : : * \see setMaximumTileHeight() 143 : : * \see maximumTileWidth() 144 : : */ 145 : 0 : int maximumTileHeight() const { return mMaximumTileHeight; } 146 : : 147 : : //! Default maximum tile width 148 : : static const int DEFAULT_MAXIMUM_TILE_WIDTH = 2000; 149 : : 150 : : //! Default maximum tile height 151 : : static const int DEFAULT_MAXIMUM_TILE_HEIGHT = 2000; 152 : : 153 : : private: 154 : : //Stores information about reading of a raster band. Columns and rows are in unsampled coordinates 155 : : struct RasterPartInfo 156 : : { 157 : : qgssize currentCol; 158 : : qgssize currentRow; 159 : : qgssize nCols; 160 : : qgssize nRows; 161 : : }; 162 : : 163 : : QgsRasterInterface *mInput = nullptr; 164 : : QMap<int, RasterPartInfo> mRasterPartInfos; 165 : : QgsRectangle mExtent; 166 : : QgsRasterBlockFeedback *mFeedback = nullptr; 167 : : 168 : : int mMaximumTileWidth; 169 : : int mMaximumTileHeight; 170 : : 171 : : //! Remove part into and release memory 172 : : void removePartInfo( int bandNumber ); 173 : : bool readNextRasterPartInternal( int bandNumber, int &nCols, int &nRows, std::unique_ptr<QgsRasterBlock> *block, int &topLeftCol, int &topLeftRow, QgsRectangle *blockExtent ); 174 : : }; 175 : : 176 : : #endif // QGSRASTERITERATOR_H