diff --git a/src/analysis/raster/qgsrastercalculator.cpp b/src/analysis/raster/qgsrastercalculator.cpp index 99a67a7..81d7e46 100644 --- a/src/analysis/raster/qgsrastercalculator.cpp +++ b/src/analysis/raster/qgsrastercalculator.cpp @@ -31,8 +31,8 @@ #define TO8(x) (x).toLocal8Bit().constData() #endif -QgsRasterCalculator::QgsRasterCalculator( const QString& formulaString, const QString& outputFile, const QString& outputFormat, - const QgsRectangle& outputExtent, int nOutputColumns, int nOutputRows, const QVector& rasterEntries ): mFormulaString( formulaString ), mOutputFile( outputFile ), mOutputFormat( outputFormat ), +QgsRasterCalculator::QgsRasterCalculator( const QString& formulaString, const QString& outputFile, const QString& outputFormat, const QString& outputPixelFormat, + const QgsRectangle& outputExtent, int nOutputColumns, int nOutputRows, const QVector& rasterEntries ): mFormulaString( formulaString ), mOutputFile( outputFile ), mOutputFormat( outputFormat ), mOutputPixelFormat( outputPixelFormat ), mOutputRectangle( outputExtent ), mNumOutputColumns( nOutputColumns ), mNumOutputRows( nOutputRows ), mRasterEntries( rasterEntries ) { } @@ -201,7 +201,8 @@ int QgsRasterCalculator::processCalculation( QProgressDialog* p ) } //write scanline to the dataset - if ( GDALRasterIO( outputRasterBand, GF_Write, 0, i, mNumOutputColumns, 1, calcData, mNumOutputColumns, 1, GDT_Float32, 0, 0 ) != CE_None ) + GDALDataType pixelFormatDGT = GDALGetDataTypeByName( mOutputPixelFormat.toLocal8Bit().data() ); + if ( GDALRasterIO( outputRasterBand, GF_Write, 0, i, mNumOutputColumns, 1, calcData, mNumOutputColumns, 1, pixelFormatDGT, 0, 0 ) != CE_None ) { qWarning( "RasterIO error!" ); } @@ -272,9 +273,12 @@ GDALDriverH QgsRasterCalculator::openOutputDriver() GDALDatasetH QgsRasterCalculator::openOutputFile( GDALDriverH outputDriver ) { + GDALDataType pixelFormatDGT = GDALGetDataTypeByName( mOutputPixelFormat.toLocal8Bit().data() ); + //open output file char **papszOptions = NULL; - GDALDatasetH outputDataset = GDALCreate( outputDriver, mOutputFile.toLocal8Bit().data(), mNumOutputColumns, mNumOutputRows, 1, GDT_Float32, papszOptions ); + GDALDatasetH outputDataset = GDALCreate( outputDriver, mOutputFile.toLocal8Bit().data(), mNumOutputColumns, mNumOutputRows, 1, pixelFormatDGT, papszOptions ); + if ( outputDataset == NULL ) { return outputDataset; diff --git a/src/analysis/raster/qgsrastercalculator.h b/src/analysis/raster/qgsrastercalculator.h index 3972f60..5f0940e 100644 --- a/src/analysis/raster/qgsrastercalculator.h +++ b/src/analysis/raster/qgsrastercalculator.h @@ -39,7 +39,7 @@ struct ANALYSIS_EXPORT QgsRasterCalculatorEntry class ANALYSIS_EXPORT QgsRasterCalculator { public: - QgsRasterCalculator( const QString& formulaString, const QString& outputFile, const QString& outputFormat, + QgsRasterCalculator( const QString& formulaString, const QString& outputFile, const QString& outputFormat, const QString& outputPixelFormat, const QgsRectangle& outputExtent, int nOutputColumns, int nOutputRows, const QVector& rasterEntries ); ~QgsRasterCalculator(); @@ -88,6 +88,7 @@ class ANALYSIS_EXPORT QgsRasterCalculator QString mFormulaString; QString mOutputFile; QString mOutputFormat; + QString mOutputPixelFormat; /**Output raster extent*/ QgsRectangle mOutputRectangle; diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 58b4437..78ae0ff 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -2615,7 +2615,7 @@ void QgisApp::showRasterCalculator() { //invoke analysis library //extent and output resolution will come later... - QgsRasterCalculator rc( d.formulaString(), d.outputFile(), d.outputFormat(), d.outputRectangle(), d.numberOfColumns(), d.numberOfRows(), d.rasterEntries() ); + QgsRasterCalculator rc( d.formulaString(), d.outputFile(), d.outputFormat(), d.outputPixelFormat(), d.outputRectangle(), d.numberOfColumns(), d.numberOfRows(), d.rasterEntries() ); QProgressDialog p( tr( "Calculating..." ), tr( "Abort..." ), 0, 0 ); p.setWindowModality( Qt::WindowModal ); diff --git a/src/app/qgsrastercalcdialog.cpp b/src/app/qgsrastercalcdialog.cpp index 875ca34..3df088b 100644 --- a/src/app/qgsrastercalcdialog.cpp +++ b/src/app/qgsrastercalcdialog.cpp @@ -80,6 +80,11 @@ QString QgsRasterCalcDialog::outputFormat() const return mOutputFormatComboBox->itemData( index ).toString(); } +QString QgsRasterCalcDialog::outputPixelFormat() const +{ + return mOutputPixelFormatComboBox->currentText(); +} + bool QgsRasterCalcDialog::addLayerToProject() const { return mAddResultToProjectCheckBox->isChecked(); @@ -190,6 +195,20 @@ void QgsRasterCalcDialog::insertAvailableOutputFormats() } } +// insert available pixel formats +void QgsRasterCalcDialog::insertPixelFormats() +{ + int ii = 0; + while ( GDALGetDataTypeName( GDALDataType( ii ) ) ) + { + mOutputPixelFormatComboBox->addItem( GDALGetDataTypeName( GDALDataType( ii ) ), QVariant( GDALGetDataTypeName( GDALDataType( ii ) ) ) ); + ii++; + } + + mOutputPixelFormatComboBox->setCurrentIndex( mOutputPixelFormatComboBox->findText( "Float32" ) ); + +} + QgsRectangle QgsRasterCalcDialog::outputRectangle() const { return QgsRectangle( mXMinSpinBox->value(), mYMinSpinBox->value(), mXMaxSpinBox->value(), mYMaxSpinBox->value() ); @@ -273,6 +292,32 @@ void QgsRasterCalcDialog::on_mExpressionTextEdit_textChanged() mButtonBox->button( QDialogButtonBox::Ok )->setEnabled( false ); } +void QgsRasterCalcDialog::on_mOutputFormatComboBox_currentIndexChanged(int index) +{ + // clean items(pixels format) from ComboBox + mOutputPixelFormatComboBox->clear( ); + + // set pixel format according to the driver from GDALMetadata + // if metadata GDAL_DMD_CREATIONDATATYPES are not available for the driver, add all available from GDAL + const char * qq = mOutputFormatComboBox->itemData( index ).toString( ).toStdString( ).c_str( ); + GDALDriverH driver = GDALGetDriverByName( qq ); + QString driverCreationDataTypes = QString( GDALGetMetadataItem( driver, GDAL_DMD_CREATIONDATATYPES, NULL ) ); + + if ( driverCreationDataTypes.isEmpty( ) ) + { + insertPixelFormats(); + } + else + { + QStringList driverCreationDataTypesList = driverCreationDataTypes.split( " " ); + mOutputPixelFormatComboBox->addItems( driverCreationDataTypesList ); + if( mOutputPixelFormatComboBox->findText( "Float32" ) != -1 ) + { + mOutputPixelFormatComboBox->setCurrentIndex( mOutputPixelFormatComboBox->findText( "Float32" ) ); + } + } +} + void QgsRasterCalcDialog::on_mOutputLayerLineEdit_textChanged( const QString &text ) { Q_UNUSED( text ); diff --git a/src/app/qgsrastercalcdialog.h b/src/app/qgsrastercalcdialog.h index 852d5b0..e4691df 100644 --- a/src/app/qgsrastercalcdialog.h +++ b/src/app/qgsrastercalcdialog.h @@ -32,6 +32,7 @@ class QgsRasterCalcDialog: public QDialog, private Ui::QgsRasterCalcDialogBase QString formulaString() const; QString outputFile() const; QString outputFormat() const; + QString outputPixelFormat() const; bool addLayerToProject() const; /**Bounding box for output raster*/ @@ -52,6 +53,7 @@ class QgsRasterCalcDialog: public QDialog, private Ui::QgsRasterCalcDialogBase void on_mOutputLayerLineEdit_textChanged( const QString& text ); /**Enables ok button if calculator expression is valid and output file path exists*/ void setAcceptButtonState(); + void on_mOutputFormatComboBox_currentIndexChanged(int index); //calculator buttons void on_mPlusPushButton_clicked(); @@ -81,6 +83,8 @@ class QgsRasterCalcDialog: public QDialog, private Ui::QgsRasterCalcDialogBase void insertAvailableOutputFormats(); /**Accesses the available raster layers/bands from the layer registry*/ void insertAvailableRasterBands(); + // insert output pixel formats + void insertPixelFormats(); /**Returns true if raster calculator expression has valid syntax*/ bool expressionValid() const; diff --git a/src/ui/qgsrastercalcdialogbase.ui b/src/ui/qgsrastercalcdialogbase.ui index d29567c..8dc8d87 100644 --- a/src/ui/qgsrastercalcdialogbase.ui +++ b/src/ui/qgsrastercalcdialogbase.ui @@ -6,8 +6,8 @@ 0 0 - 651 - 518 + 675 + 551 @@ -26,6 +26,192 @@ + + + + Operators + + + + + + + + + + + + + + * + + + + + + + sqrt + + + + + + + sin + + + + + + + ^ + + + + + + + acos + + + + + + + ( + + + + + + + - + + + + + + + / + + + + + + + cos + + + + + + + asin + + + + + + + tan + + + + + + + atan + + + + + + + ) + + + + + + + < + + + + + + + > + + + + + + + = + + + + + + + OR + + + + + + + AND + + + + + + + <= + + + + + + + >= + + + + + + + + + + Raster calculator expression + + + mExpressionTextEdit + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + @@ -42,10 +228,10 @@ - + - + @@ -71,7 +257,7 @@ - + Qt::Horizontal @@ -84,7 +270,7 @@ - + @@ -203,10 +389,7 @@ - - - - + Add result to project @@ -216,195 +399,35 @@ - - - - - - - Operators - - - - - - + - - - - - - - * - - - - - - - sqrt - - - - - - - sin - - - - - - - ^ - - - - - - - acos - - - - - - - ( - - - - - - - - - - - - - - - / - - - - - - - cos - - - - - - - asin - - - - - - - tan - - - - - - - atan - - - - - - - ) - - - - - - - < - - - - - - - > - - - - - - - = + + + + Qt::Horizontal - - - - - - OR + + + 40 + 20 + - + - - - - AND - - + + - - + + - <= + Pixel format - - - - >= - - + + - - - - Raster calculator expression - - - mExpressionTextEdit - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - -