26 void QgsRasterAnalysisUtils::cellInfoForBBox(
const QgsRectangle &rasterBBox,
const QgsRectangle &featureBBox,
double cellSizeX,
double cellSizeY,
27 int &nCellsX,
int &nCellsY,
int rasterWidth,
int rasterHeight,
QgsRectangle &rasterBlockExtent )
40 int offsetX =
static_cast< int >( std::floor( ( intersectBox.
xMinimum() - rasterBBox.
xMinimum() ) / cellSizeX ) );
41 int offsetY =
static_cast< int >( std::floor( ( rasterBBox.
yMaximum() - intersectBox.
yMaximum() ) / cellSizeY ) );
43 int maxColumn =
static_cast< int >( std::floor( ( intersectBox.
xMaximum() - rasterBBox.
xMinimum() ) / cellSizeX ) ) + 1;
44 int maxRow =
static_cast< int >( std::floor( ( rasterBBox.
yMaximum() - intersectBox.
yMinimum() ) / cellSizeY ) ) + 1;
46 nCellsX = maxColumn - offsetX;
47 nCellsY = maxRow - offsetY;
50 nCellsX = std::min( offsetX + nCellsX, rasterWidth ) - offsetX;
51 nCellsY = std::min( offsetY + nCellsY, rasterHeight ) - offsetY;
54 rasterBBox.
yMaximum() - offsetY * cellSizeY,
55 rasterBBox.
xMinimum() + ( nCellsX + offsetX ) * cellSizeX,
56 rasterBBox.
yMaximum() - ( nCellsY + offsetY ) * cellSizeY );
59 void QgsRasterAnalysisUtils::statisticsFromMiddlePointTest(
QgsRasterInterface *rasterInterface,
int rasterBand,
const QgsGeometry &poly,
int nCellsX,
int nCellsY,
double cellSizeX,
double cellSizeY,
const QgsRectangle &rasterBBox,
const std::function<
void(
double )> &addValue,
bool skipNodata )
66 polyEngine->prepareGeometry();
69 iter.startRasterRead( rasterBand, nCellsX, nCellsY, rasterBBox );
71 std::unique_ptr< QgsRasterBlock > block;
77 bool isNoData =
false;
78 while ( iter.readNextRasterPart( rasterBand, iterCols, iterRows, block, iterLeft, iterTop, &blockExtent ) )
80 double cellCenterY = blockExtent.
yMaximum() - 0.5 * cellSizeY;
82 for (
int row = 0; row < iterRows; ++row )
84 double cellCenterX = blockExtent.
xMinimum() + 0.5 * cellSizeX;
85 for (
int col = 0; col < iterCols; ++col )
87 const double pixelValue = block->valueAndNoData( row, col, isNoData );
88 if ( validPixel( pixelValue ) && ( !skipNodata || !isNoData ) )
90 QgsPoint cellCenter( cellCenterX, cellCenterY );
91 if ( polyEngine->contains( &cellCenter ) )
93 addValue( pixelValue );
96 cellCenterX += cellSizeX;
98 cellCenterY -= cellSizeY;
103 void QgsRasterAnalysisUtils::statisticsFromPreciseIntersection(
QgsRasterInterface *rasterInterface,
int rasterBand,
const QgsGeometry &poly,
int nCellsX,
int nCellsY,
double cellSizeX,
double cellSizeY,
const QgsRectangle &rasterBBox,
const std::function<
void(
double,
double )> &addValue,
bool skipNodata )
107 double hCellSizeX = cellSizeX / 2.0;
108 double hCellSizeY = cellSizeY / 2.0;
109 double pixelArea = cellSizeX * cellSizeY;
117 polyEngine->prepareGeometry();
120 iter.startRasterRead( rasterBand, nCellsX, nCellsY, rasterBBox );
122 std::unique_ptr< QgsRasterBlock > block;
128 bool isNoData =
false;
129 while ( iter.readNextRasterPart( rasterBand, iterCols, iterRows, block, iterLeft, iterTop, &blockExtent ) )
131 double currentY = blockExtent.
yMaximum() - 0.5 * cellSizeY;
132 for (
int row = 0; row < iterRows; ++row )
134 double currentX = blockExtent.
xMinimum() + 0.5 * cellSizeX;
135 for (
int col = 0; col < iterCols; ++col )
137 const double pixelValue = block->valueAndNoData( row, col, isNoData );
138 if ( validPixel( pixelValue ) && ( !skipNodata || !isNoData ) )
143 if ( !pixelRectGeometry.
isNull() && polyEngine->intersects( pixelRectGeometry.
constGet() ) )
147 if ( !intersectGeometry.
isEmpty() )
149 double intersectionArea = intersectGeometry.
area();
150 if ( intersectionArea > 0.0 )
152 weight = intersectionArea / pixelArea;
153 addValue( pixelValue, weight );
158 currentX += cellSizeX;
160 currentY -= cellSizeY;
165 bool QgsRasterAnalysisUtils::validPixel(
double value )
167 return !std::isnan( value );
170 static QVector< QPair< QString, Qgis::DataType > > sDataTypes;
172 void populateDataTypes()
174 if ( sDataTypes.empty() )
176 sDataTypes.append( qMakePair( QStringLiteral(
"Byte" ),
Qgis::Byte ) );
177 sDataTypes.append( qMakePair( QStringLiteral(
"Int16" ),
Qgis::Int16 ) );
178 sDataTypes.append( qMakePair( QStringLiteral(
"UInt16" ),
Qgis::UInt16 ) );
179 sDataTypes.append( qMakePair( QStringLiteral(
"Int32" ),
Qgis::Int32 ) );
180 sDataTypes.append( qMakePair( QStringLiteral(
"UInt32" ),
Qgis::UInt32 ) );
181 sDataTypes.append( qMakePair( QStringLiteral(
"Float32" ),
Qgis::Float32 ) );
182 sDataTypes.append( qMakePair( QStringLiteral(
"Float64" ),
Qgis::Float64 ) );
183 sDataTypes.append( qMakePair( QStringLiteral(
"CInt16" ),
Qgis::CInt16 ) );
184 sDataTypes.append( qMakePair( QStringLiteral(
"CInt32" ),
Qgis::CInt32 ) );
185 sDataTypes.append( qMakePair( QStringLiteral(
"CFloat32" ),
Qgis::CFloat32 ) );
186 sDataTypes.append( qMakePair( QStringLiteral(
"CFloat64" ),
Qgis::CFloat64 ) );
190 std::unique_ptr<QgsProcessingParameterDefinition> QgsRasterAnalysisUtils::createRasterTypeParameter(
const QString &name,
const QString &description,
Qgis::DataType defaultType )
195 int defaultChoice = 0;
197 for (
auto it = sDataTypes.constBegin(); it != sDataTypes.constEnd(); ++it )
199 names.append( it->first );
200 if ( it->second == defaultType )
205 return qgis::make_unique< QgsProcessingParameterEnum >( name, description, names,
false, defaultChoice );
208 Qgis::DataType QgsRasterAnalysisUtils::rasterTypeChoiceToDataType(
int choice )
210 if ( choice < 0 || choice >= sDataTypes.count() )
213 return sDataTypes.value( choice ).second;
216 void QgsRasterAnalysisUtils::applyRasterLogicOperator(
const std::vector< QgsRasterAnalysisUtils::RasterLogicInput > &inputs,
QgsRasterDataProvider *destinationRaster,
double outputNoDataValue,
const bool treatNoDataAsFalse,
218 std::function<
void(
const std::vector< std::unique_ptr< QgsRasterBlock > > &,
bool &,
bool &,
int,
int,
bool )> &applyLogicFunc,
223 int nbBlocksWidth =
static_cast< int>( std::ceil( 1.0 * width / maxWidth ) );
224 int nbBlocksHeight =
static_cast< int >( std::ceil( 1.0 * height / maxHeight ) );
225 int nbBlocks = nbBlocksWidth * nbBlocksHeight;
229 outputIter.startRasterRead( 1, width, height, extent );
236 std::unique_ptr< QgsRasterBlock > outputBlock;
237 while ( outputIter.readNextRasterPart( 1, iterCols, iterRows, outputBlock, iterLeft, iterTop, &blockExtent ) )
239 std::vector< std::unique_ptr< QgsRasterBlock > > inputBlocks;
240 for (
const QgsRasterAnalysisUtils::RasterLogicInput &i : inputs )
242 for (
int band : i.bands )
244 std::unique_ptr< QgsRasterBlock > b( i.interface->block( band, blockExtent, iterCols, iterRows ) );
245 inputBlocks.emplace_back( std::move( b ) );
249 feedback->
setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
250 for (
int row = 0; row < iterRows; row++ )
255 for (
int column = 0; column < iterCols; column++ )
258 bool resIsNoData =
false;
259 applyLogicFunc( inputBlocks, res, resIsNoData, row, column, treatNoDataAsFalse );
267 outputBlock->setValue( row, column, resIsNoData ? outputNoDataValue : ( res ? 1 : 0 ) );
270 destinationRaster->
writeBlock( outputBlock.get(), 1, iterLeft, iterTop );
A rectangle specified with double values.
Thirty two bit signed integer (qint32)
Iterator for sequentially processing raster cells.
void setProgress(double progress)
Sets the current progress for the feedback object.
Thirty two bit unsigned integer (quint32)
DataType
Raster data types.
A geometry is the spatial representation of a feature.
Thirty two bit floating point (float)
QgsGeometry intersection(const QgsGeometry &geometry) const
Returns a geometry representing the points shared by this geometry and other.
Sixteen bit signed integer (qint16)
Sixty four bit floating point (double)
Base class for feedback objects to be used for cancellation of something running in a worker thread...
virtual bool setEditable(bool enabled)
Turns on/off editing mode of the provider.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
bool isEmpty() const
Returns true if the rectangle is empty.
static const int DEFAULT_MAXIMUM_TILE_HEIGHT
Default maximum tile height.
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
Sixteen bit unsigned integer (quint16)
Base class for processing filters like renderers, reprojector, resampler etc.
Point geometry type, with support for z-dimension and m-values.
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
double xMaximum() const
Returns the x maximum value (right side of rectangle).
bool isCanceled() const
Tells whether the operation has been canceled already.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
double yMaximum() const
Returns the y maximum value (top side of rectangle).
double area() const
Returns the planar, 2-dimensional area of the geometry.
bool writeBlock(QgsRasterBlock *block, int band, int xOffset=0, int yOffset=0)
Writes pixel data from a raster block into the provider data source.
static const int DEFAULT_MAXIMUM_TILE_WIDTH
Default maximum tile width.
Eight bit unsigned integer (quint8)
Base class for raster data providers.