Skip to content

Commit a62a2bc

Browse files
committedJun 13, 2018
Expose choice of raster data type for reclassify algs
1 parent b26957e commit a62a2bc

File tree

5 files changed

+76
-3
lines changed

5 files changed

+76
-3
lines changed
 

‎src/analysis/processing/qgsalgorithmreclassifybylayer.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgsalgorithmreclassifybylayer.h"
1919
#include "qgsrasterfilewriter.h"
2020
#include "qgsreclassifyutils.h"
21+
#include "qgsrasteranalysisutils.h"
2122
#include "qgis.h"
2223

2324
///@cond PRIVATE
@@ -65,11 +66,16 @@ void QgsReclassifyAlgorithmBase::initAlgorithm( const QVariantMap & )
6566
missingValuesParam->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
6667
addParameter( missingValuesParam.release() );
6768

69+
std::unique_ptr< QgsProcessingParameterDefinition > typeChoice = QgsRasterAnalysisUtils::createRasterTypeParameter( QStringLiteral( "DATA_TYPE" ), QObject::tr( "Output data type" ), Qgis::Float32 );
70+
typeChoice->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
71+
addParameter( typeChoice.release() );
72+
6873
addParameter( new QgsProcessingParameterRasterDestination( QStringLiteral( "OUTPUT" ), QObject::tr( "Reclassified raster" ) ) );
6974
}
7075

7176
bool QgsReclassifyAlgorithmBase::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
7277
{
78+
mDataType = QgsRasterAnalysisUtils::rasterTypeChoiceToDataType( parameterAsEnum( parameters, QStringLiteral( "DATA_TYPE" ), context ) );
7379
QgsRasterLayer *layer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT_RASTER" ), context );
7480

7581
if ( !layer )
@@ -125,7 +131,7 @@ QVariantMap QgsReclassifyAlgorithmBase::processAlgorithm( const QVariantMap &par
125131
std::unique_ptr< QgsRasterFileWriter > writer = qgis::make_unique< QgsRasterFileWriter >( outputFile );
126132
writer->setOutputProviderKey( QStringLiteral( "gdal" ) );
127133
writer->setOutputFormat( outputFormat );
128-
std::unique_ptr<QgsRasterDataProvider > provider( writer->createOneBandRaster( Qgis::Float32, mNbCellsXProvider, mNbCellsYProvider, mExtent, mCrs ) );
134+
std::unique_ptr<QgsRasterDataProvider > provider( writer->createOneBandRaster( mDataType, mNbCellsXProvider, mNbCellsYProvider, mExtent, mCrs ) );
129135
if ( !provider )
130136
throw QgsProcessingException( QObject::tr( "Could not create raster output: %1" ).arg( outputFile ) );
131137
if ( !provider->isValid() )

‎src/analysis/processing/qgsalgorithmreclassifybylayer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class QgsReclassifyAlgorithmBase : public QgsProcessingAlgorithm
6464

6565
std::unique_ptr< QgsRasterInterface > mInterface;
6666

67+
Qgis::DataType mDataType = Qgis::Float32;
6768
double mNoDataValue = -9999;
6869
int mBand = 1;
6970
QgsRectangle mExtent;

‎src/analysis/processing/qgsrasteranalysisutils.cpp

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
#include "qgsrasterblock.h"
2020
#include "qgsrasteriterator.h"
2121
#include "qgsgeos.h"
22-
22+
#include "qgsprocessingparameters.h"
23+
#include <map>
2324
///@cond PRIVATE
2425

2526
void QgsRasterAnalysisUtils::cellInfoForBBox( const QgsRectangle &rasterBBox, const QgsRectangle &featureBBox, double cellSizeX, double cellSizeY,
@@ -171,4 +172,51 @@ bool QgsRasterAnalysisUtils::validPixel( double value )
171172
return !std::isnan( value );
172173
}
173174

175+
static QVector< QPair< QString, Qgis::DataType > > sDataTypes;
176+
177+
void populateDataTypes()
178+
{
179+
if ( sDataTypes.empty() )
180+
{
181+
sDataTypes.append( qMakePair( QStringLiteral( "Byte" ), Qgis::Byte ) );
182+
sDataTypes.append( qMakePair( QStringLiteral( "Int16" ), Qgis::Int16 ) );
183+
sDataTypes.append( qMakePair( QStringLiteral( "UInt16" ), Qgis::UInt16 ) );
184+
sDataTypes.append( qMakePair( QStringLiteral( "Int32" ), Qgis::Int32 ) );
185+
sDataTypes.append( qMakePair( QStringLiteral( "UInt32" ), Qgis::UInt32 ) );
186+
sDataTypes.append( qMakePair( QStringLiteral( "Float32" ), Qgis::Float32 ) );
187+
sDataTypes.append( qMakePair( QStringLiteral( "Float64" ), Qgis::Float64 ) );
188+
sDataTypes.append( qMakePair( QStringLiteral( "CInt16" ), Qgis::CInt16 ) );
189+
sDataTypes.append( qMakePair( QStringLiteral( "CInt32" ), Qgis::CInt32 ) );
190+
sDataTypes.append( qMakePair( QStringLiteral( "CFloat32" ), Qgis::CFloat32 ) );
191+
sDataTypes.append( qMakePair( QStringLiteral( "CFloat64" ), Qgis::CFloat64 ) );
192+
}
193+
}
194+
195+
std::unique_ptr<QgsProcessingParameterDefinition> QgsRasterAnalysisUtils::createRasterTypeParameter( const QString &name, const QString &description, Qgis::DataType defaultType )
196+
{
197+
populateDataTypes();
198+
199+
QStringList names;
200+
int defaultChoice = 0;
201+
int i = 0;
202+
for ( auto it = sDataTypes.constBegin(); it != sDataTypes.constEnd(); ++it )
203+
{
204+
names.append( it->first );
205+
if ( it->second == defaultType )
206+
defaultChoice = i;
207+
i++;
208+
}
209+
210+
return qgis::make_unique< QgsProcessingParameterEnum >( name, description, names, false, defaultChoice );
211+
}
212+
213+
Qgis::DataType QgsRasterAnalysisUtils::rasterTypeChoiceToDataType( int choice )
214+
{
215+
if ( choice < 0 || choice >= sDataTypes.count() )
216+
return Qgis::Float32;
217+
218+
return sDataTypes.value( choice ).second;
219+
}
220+
174221
///@endcond PRIVATE
222+

‎src/analysis/processing/qgsrasteranalysisutils.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
#define QGSRASTERANALYSISUTILS_H
1818

1919
#include "qgis_analysis.h"
20+
#include "qgis.h"
2021

2122
#include <functional>
23+
#include <memory>
2224

2325
#define SIP_NO_FILE
2426

@@ -27,6 +29,7 @@
2729
class QgsRasterInterface;
2830
class QgsGeometry;
2931
class QgsRectangle;
32+
class QgsProcessingParameterDefinition;
3033

3134
namespace QgsRasterAnalysisUtils
3235
{
@@ -48,8 +51,23 @@ namespace QgsRasterAnalysisUtils
4851

4952
//! Tests whether a pixel's value should be included in the result
5053
bool validPixel( double value );
54+
55+
/**
56+
* Returns a new processing enum parameter for choice of raster data types.
57+
* \see rasterTypeChoiceToDataType()
58+
*/
59+
std::unique_ptr< QgsProcessingParameterDefinition > createRasterTypeParameter( const QString &name,
60+
const QString &description,
61+
Qgis::DataType defaultType = Qgis::Float32 );
62+
63+
/**
64+
* Converts the value of a raster type parameter to the corresponding data type.
65+
* \see createRasterTypeParameter()
66+
*/
67+
Qgis::DataType rasterTypeChoiceToDataType( int choice );
5168
}
5269

70+
5371
///@endcond PRIVATE
5472

5573
#endif // QGSRASTERANALYSISUTILS_H

‎src/analysis/processing/qgsreclassifyutils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void QgsReclassifyUtils::reclassify( const QVector<QgsReclassifyUtils::RasterCla
5656
feedback->setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
5757
if ( feedback && feedback->isCanceled() )
5858
break;
59-
std::unique_ptr< QgsRasterBlock > reclassifiedBlock = qgis::make_unique< QgsRasterBlock >( Qgis::Float32, iterCols, iterRows );
59+
std::unique_ptr< QgsRasterBlock > reclassifiedBlock = qgis::make_unique< QgsRasterBlock >( destinationRaster->dataType( 1 ), iterCols, iterRows );
6060

6161
for ( int row = 0; row < iterRows; row++ )
6262
{

0 commit comments

Comments
 (0)