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 while ( iter.readNextRasterPart( rasterBand, iterCols, iterRows, block, iterLeft, iterTop, &blockExtent ) )
79 double cellCenterY = blockExtent.
yMaximum() - 0.5 * cellSizeY;
81 for (
int row = 0; row < iterRows; ++row )
83 double cellCenterX = blockExtent.
xMinimum() + 0.5 * cellSizeX;
84 for (
int col = 0; col < iterCols; ++col )
86 double pixelValue = block->value( row, col );
87 if ( validPixel( pixelValue ) && ( !skipNodata || !block->isNoData( row, col ) ) )
89 QgsPoint cellCenter( cellCenterX, cellCenterY );
90 if ( polyEngine->contains( &cellCenter ) )
92 addValue( pixelValue );
95 cellCenterX += cellSizeX;
97 cellCenterY -= cellSizeY;
102 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 )
106 double hCellSizeX = cellSizeX / 2.0;
107 double hCellSizeY = cellSizeY / 2.0;
108 double pixelArea = cellSizeX * cellSizeY;
116 polyEngine->prepareGeometry();
119 iter.startRasterRead( rasterBand, nCellsX, nCellsY, rasterBBox );
121 std::unique_ptr< QgsRasterBlock > block;
127 while ( iter.readNextRasterPart( rasterBand, iterCols, iterRows, block, iterLeft, iterTop, &blockExtent ) )
129 double currentY = blockExtent.
yMaximum() - 0.5 * cellSizeY;
130 for (
int row = 0; row < iterRows; ++row )
132 double currentX = blockExtent.
xMinimum() + 0.5 * cellSizeX;
133 for (
int col = 0; col < iterCols; ++col )
135 double pixelValue = block->value( row, col );
136 if ( validPixel( pixelValue ) && ( !skipNodata || !block->isNoData( row, col ) ) )
141 if ( !pixelRectGeometry.
isNull() && polyEngine->intersects( pixelRectGeometry.
constGet() ) )
145 if ( !intersectGeometry.
isEmpty() )
147 double intersectionArea = intersectGeometry.
area();
148 if ( intersectionArea > 0.0 )
150 weight = intersectionArea / pixelArea;
151 addValue( pixelValue, weight );
156 currentX += cellSizeX;
158 currentY -= cellSizeY;
163 bool QgsRasterAnalysisUtils::validPixel(
double value )
165 return !std::isnan( value );
168 static QVector< QPair< QString, Qgis::DataType > > sDataTypes;
170 void populateDataTypes()
172 if ( sDataTypes.empty() )
174 sDataTypes.append( qMakePair( QStringLiteral(
"Byte" ),
Qgis::Byte ) );
175 sDataTypes.append( qMakePair( QStringLiteral(
"Int16" ),
Qgis::Int16 ) );
176 sDataTypes.append( qMakePair( QStringLiteral(
"UInt16" ),
Qgis::UInt16 ) );
177 sDataTypes.append( qMakePair( QStringLiteral(
"Int32" ),
Qgis::Int32 ) );
178 sDataTypes.append( qMakePair( QStringLiteral(
"UInt32" ),
Qgis::UInt32 ) );
179 sDataTypes.append( qMakePair( QStringLiteral(
"Float32" ),
Qgis::Float32 ) );
180 sDataTypes.append( qMakePair( QStringLiteral(
"Float64" ),
Qgis::Float64 ) );
181 sDataTypes.append( qMakePair( QStringLiteral(
"CInt16" ),
Qgis::CInt16 ) );
182 sDataTypes.append( qMakePair( QStringLiteral(
"CInt32" ),
Qgis::CInt32 ) );
183 sDataTypes.append( qMakePair( QStringLiteral(
"CFloat32" ),
Qgis::CFloat32 ) );
184 sDataTypes.append( qMakePair( QStringLiteral(
"CFloat64" ),
Qgis::CFloat64 ) );
188 std::unique_ptr<QgsProcessingParameterDefinition> QgsRasterAnalysisUtils::createRasterTypeParameter(
const QString &name,
const QString &description,
Qgis::DataType defaultType )
193 int defaultChoice = 0;
195 for (
auto it = sDataTypes.constBegin(); it != sDataTypes.constEnd(); ++it )
197 names.append( it->first );
198 if ( it->second == defaultType )
203 return qgis::make_unique< QgsProcessingParameterEnum >( name, description, names,
false, defaultChoice );
206 Qgis::DataType QgsRasterAnalysisUtils::rasterTypeChoiceToDataType(
int choice )
208 if ( choice < 0 || choice >= sDataTypes.count() )
211 return sDataTypes.value( choice ).second;
A rectangle specified with double values.
Thirty two bit signed integer (qint32)
Iterator for sequentially processing raster cells.
bool isNull() const
Returns true if the geometry is null (ie, contains no underlying geometry accessible via geometry() )...
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)
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
bool isEmpty() const
Returns true if the rectangle is empty.
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.
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).
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 area of the geometry using GEOS.
Eight bit unsigned integer (quint8)