549 changes: 529 additions & 20 deletions src/app/qgsrasterlayerproperties.cpp

Large diffs are not rendered by default.

27 changes: 27 additions & 0 deletions src/app/qgsrasterlayerproperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class QgsRasterLayer;
class QgsMapToolEmitPoint;
class QgsRasterRenderer;
class QgsRasterRendererWidget;
class QwtPlotPicker;
class QwtPlotMarker;

/**Property sheet for a raster map layer
*@author Tim Sutton
Expand Down Expand Up @@ -100,6 +102,23 @@ class QgsRasterLayerProperties : public QDialog, private Ui::QgsRasterLayerPrope
/**Enable or disable Build pyramids button depending on selection in pyramids list*/
void toggleBuildPyramidsButton();

// histogram

/** Used when the histogram band selector changes, or when tab is loaded. */
void on_cboHistoBand_currentIndexChanged( int );
/** Applies the selected min/max values to the renderer widget. */
void applyHistoMin( );
void applyHistoMax( );
/** Button to activate picking of the min/max value on the graph. */
void on_btnHistoMin_toggled();
void on_btnHistoMax_toggled();
/** Called when a selection has been made using the plot picker. */
void histoPickerSelected( const QwtDoublePoint & );
/** Various actions that are stored in btnHistoActions. */
void histoActionTriggered( QAction* );
/** Draw the min/max markers on the histogram plot. */
void updateHistoMarkers();

signals:
/** emitted when changes to layer were saved to update legend */
void refreshLegend( QString layerID, bool expandItem );
Expand Down Expand Up @@ -154,5 +173,13 @@ class QgsRasterLayerProperties : public QDialog, private Ui::QgsRasterLayerPrope

QgsMapCanvas* mMapCanvas;
QgsMapToolEmitPoint* mPixelSelectorTool;

// histogram
QwtPlotPicker* mHistoPicker;
QwtPlotMarker* mHistoMarkerMin;
QwtPlotMarker* mHistoMarkerMax;
double mHistoMin;
double mHistoMax;
QVector<QColor> mHistoColors;
};
#endif
133 changes: 108 additions & 25 deletions src/gui/raster/qgsmultibandcolorrendererwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,38 +204,20 @@ void QgsMultiBandColorRendererWidget::loadMinMaxValueForBand( int band, QLineEdi
return;
}

QgsRasterDataProvider* provider = mRasterLayer->dataProvider();
if ( !provider )
{
return;
}

if ( band < 0 )
{
minEdit->clear();
maxEdit->clear();
return;
}
double minMaxValues[2];
bool ok = false;

double minVal = 0;
double maxVal = 0;
if ( mEstimateRadioButton->isChecked() )
{
minVal = provider->minimumValue( band );
maxVal = provider->maximumValue( band );
ok = bandMinMax( Estimate, band, minMaxValues );
}
else if ( mActualRadioButton->isChecked() )
{
QgsRasterBandStats rasterBandStats = mRasterLayer->bandStatistics( band );
minVal = rasterBandStats.minimumValue;
maxVal = rasterBandStats.maximumValue;
ok = bandMinMax( Actual, band, minMaxValues );
}
else if ( mCurrentExtentRadioButton->isChecked() )
{
double minMax[2];
mRasterLayer->computeMinimumMaximumFromLastExtent( band, minMax );
minVal = minMax[0];
maxVal = minMax[1];
ok = bandMinMax( CurrentExtent, band, minMaxValues );
}
else if ( mUseStdDevRadioButton->isChecked() )
{
Expand All @@ -245,8 +227,16 @@ void QgsMultiBandColorRendererWidget::loadMinMaxValueForBand( int band, QLineEdi
maxVal = rasterBandStats.mean + diff;
}

minEdit->setText( QString::number( minVal ) );
maxEdit->setText( QString::number( maxVal ) );
if ( ok )
{
minEdit->setText( QString::number( minMaxValues[0] ) );
maxEdit->setText( QString::number( minMaxValues[1] ) );
}
else
{
minEdit->clear();
maxEdit->clear();
}
}

void QgsMultiBandColorRendererWidget::setFromRenderer( const QgsRasterRenderer* r )
Expand All @@ -269,3 +259,96 @@ void QgsMultiBandColorRendererWidget::setFromRenderer( const QgsRasterRenderer*
mBlueBandComboBox->setCurrentIndex( mBlueBandComboBox->findText( tr( "Blue" ) ) );
}
}

QString QgsMultiBandColorRendererWidget::min( int index )
{
switch ( index )
{
case 0:
return mRedMinLineEdit->text();
break;
case 1:
return mGreenMinLineEdit->text();
break;
case 2:
return mBlueMinLineEdit->text();
break;
default:
break;
}
return QString( );
}

QString QgsMultiBandColorRendererWidget::max( int index )
{
switch ( index )
{
case 0:
return mRedMaxLineEdit->text();
break;
case 1:
return mGreenMaxLineEdit->text();
break;
case 2:
return mBlueMaxLineEdit->text();
break;
default:
break;
}
return QString( );
}

void QgsMultiBandColorRendererWidget::setMin( QString value, int index )
{
switch ( index )
{
case 0:
mRedMinLineEdit->setText( value );
break;
case 1:
mGreenMinLineEdit->setText( value );
break;
case 2:
mBlueMinLineEdit->setText( value );
break;
default:
break;
}
}

void QgsMultiBandColorRendererWidget::setMax( QString value, int index )
{
switch ( index )
{
case 0:
mRedMaxLineEdit->setText( value );
break;
case 1:
mGreenMaxLineEdit->setText( value );
break;
case 2:
mBlueMaxLineEdit->setText( value );
break;
default:
break;
}
}

int QgsMultiBandColorRendererWidget::selectedBand( int index )
{
switch ( index )
{
case 0:
return mRedBandComboBox->currentIndex();
break;
case 1:
return mGreenBandComboBox->currentIndex();
break;
case 2:
return mBlueBandComboBox->currentIndex();
break;
default:
break;
}
return -1;
}
6 changes: 6 additions & 0 deletions src/gui/raster/qgsmultibandcolorrendererwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ class GUI_EXPORT QgsMultiBandColorRendererWidget: public QgsRasterRendererWidget

void setFromRenderer( const QgsRasterRenderer* r );

QString min( int index = 0 );
QString max( int index = 0 );
void setMin( QString value, int index = 0 );
void setMax( QString value, int index = 0 );
int selectedBand( int index = 0 );

private slots:
void on_mLoadPushButton_clicked();

Expand Down
61 changes: 61 additions & 0 deletions src/gui/raster/qgsrasterrendererwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,64 @@ QString QgsRasterRendererWidget::displayBandName( int band ) const
}
return name;
}

bool QgsRasterRendererWidget::bandMinMax( LoadMinMaxAlgo loadAlgo, int band, double* minMaxValues )
{
if ( !mRasterLayer )
{
return false;
}
QgsRasterDataProvider* provider = mRasterLayer->dataProvider();
if ( !provider )
{
return false;
}
if ( band < 0 )
{
return false;
}

if ( loadAlgo == Estimate )
{
minMaxValues[0] = provider->minimumValue( band );
minMaxValues[1] = provider->maximumValue( band );
}
else if ( loadAlgo == Actual )
{
QgsRasterBandStats rasterBandStats = mRasterLayer->bandStatistics( band );
minMaxValues[0] = rasterBandStats.minimumValue;
minMaxValues[1] = rasterBandStats.maximumValue;
}
else if ( loadAlgo == CurrentExtent )
{
mRasterLayer->computeMinimumMaximumFromLastExtent( band, minMaxValues );
}
else
{
return false;
}
return true;
}

bool QgsRasterRendererWidget::bandMinMaxFromStdDev( double stdDev, int band, double* minMaxValues )
{
if ( !mRasterLayer )
{
return false;
}
QgsRasterDataProvider* provider = mRasterLayer->dataProvider();
if ( !provider )
{
return false;
}
if ( band < 0 )
{
return false;
}

QgsRasterBandStats myRasterBandStats = mRasterLayer->bandStatistics( band );
minMaxValues[0] = myRasterBandStats.mean - ( stdDev * myRasterBandStats.stdDev );
minMaxValues[1] = myRasterBandStats.mean + ( stdDev * myRasterBandStats.stdDev );

return true;
}
16 changes: 16 additions & 0 deletions src/gui/raster/qgsrasterrendererwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,27 @@ class GUI_EXPORT QgsRasterRendererWidget: public QWidget
QgsRasterRendererWidget( QgsRasterLayer* layer ) { mRasterLayer = layer; }
virtual ~QgsRasterRendererWidget() {}

enum LoadMinMaxAlgo
{
Estimate,
Actual,
CurrentExtent
};

virtual QgsRasterRenderer* renderer() = 0;

void setRasterLayer( QgsRasterLayer* layer ) { mRasterLayer = layer; }
const QgsRasterLayer* rasterLayer() const { return mRasterLayer; }

virtual QString min( int index = 0 ) { Q_UNUSED( index ); return QString( ); }
virtual QString max( int index = 0 ) { Q_UNUSED( index ); return QString( ); }
virtual void setMin( QString value, int index = 0 ) { Q_UNUSED( index ); Q_UNUSED( value ); }
virtual void setMax( QString value, int index = 0 ) { Q_UNUSED( index ); Q_UNUSED( value ); }
virtual int selectedBand( int index = 0 ) { Q_UNUSED( index ); return -1; }

bool bandMinMax( LoadMinMaxAlgo loadAlgo, int band, double *values );
bool bandMinMaxFromStdDev( double stdDev, int band, double *values );

protected:
QgsRasterLayer* mRasterLayer;
/**Returns a band name for display. First choice is color name, otherwise band number*/
Expand Down
39 changes: 14 additions & 25 deletions src/gui/raster/qgssinglebandgrayrendererwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,36 +82,27 @@ QgsRasterRenderer* QgsSingleBandGrayRendererWidget::renderer()

void QgsSingleBandGrayRendererWidget::on_mLoadPushButton_clicked()
{
if ( !mRasterLayer )
{
return;
}
QgsRasterDataProvider* provider = mRasterLayer->dataProvider();
if ( !provider )
{
return;
}

int band = mGrayBandComboBox->itemData( mGrayBandComboBox->currentIndex() ).toInt();
double minVal = 0;
double maxVal = 0;
double minMaxValues[2];
bool ok = false;

if ( mEstimateRadioButton->isChecked() )
{
minVal = provider->minimumValue( band );
maxVal = provider->maximumValue( band );
ok = bandMinMax( Estimate, band, minMaxValues );
}
else if ( mActualRadioButton->isChecked() )
{
QgsRasterBandStats rasterBandStats = mRasterLayer->bandStatistics( band );
minVal = rasterBandStats.minimumValue;
maxVal = rasterBandStats.maximumValue;
ok = bandMinMax( Actual, band, minMaxValues );
}
else if ( mCurrentExtentRadioButton->isChecked() )
{
double minMax[2];
mRasterLayer->computeMinimumMaximumFromLastExtent( band, minMax );
minVal = minMax[0];
maxVal = minMax[1];
ok = bandMinMax( CurrentExtent, band, minMaxValues );
}

if ( ok )
{
mMinLineEdit->setText( QString::number( minMaxValues[0] ) );
mMaxLineEdit->setText( QString::number( minMaxValues[1] ) );
}
else if ( mUseStdDevRadioButton->isChecked() )
{
Expand All @@ -122,11 +113,9 @@ void QgsSingleBandGrayRendererWidget::on_mLoadPushButton_clicked()
}
else
{
return;
mMinLineEdit->clear();
mMaxLineEdit->clear();
}

mMinLineEdit->setText( QString::number( minVal ) );
mMaxLineEdit->setText( QString::number( maxVal ) );
}

void QgsSingleBandGrayRendererWidget::setFromRenderer( const QgsRasterRenderer* r )
Expand Down
6 changes: 6 additions & 0 deletions src/gui/raster/qgssinglebandgrayrendererwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ class GUI_EXPORT QgsSingleBandGrayRendererWidget: public QgsRasterRendererWidget

void setFromRenderer( const QgsRasterRenderer* r );

QString min( int index = 0 ) { Q_UNUSED( index ); return mMinLineEdit->text(); }
QString max( int index = 0 ) { Q_UNUSED( index ); return mMaxLineEdit->text(); }
void setMin( QString value, int index = 0 ) { Q_UNUSED( index ); mMinLineEdit->setText( value ); }
void setMax( QString value, int index = 0 ) { Q_UNUSED( index ); mMaxLineEdit->setText( value ); }
int selectedBand( int index = 0 ) { Q_UNUSED( index ); return mGrayBandComboBox->currentIndex() + 1; }

private slots:
void on_mLoadPushButton_clicked();
};
Expand Down
4 changes: 2 additions & 2 deletions src/providers/gdal/qgsgdalprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1467,12 +1467,12 @@ void QgsGdalProvider::populateHistogram( int theBandNo, QgsRasterBandStats & t
if ( myHistogramArray[myBin] < 0 ) //can't have less than 0 pixels of any value
{
theBandStats.histogramVector->push_back( 0 );
QgsDebugMsg( "Added 0 to histogram vector as freq was negative!" );
// QgsDebugMsg( "Added 0 to histogram vector as freq was negative!" );
}
else
{
theBandStats.histogramVector->push_back( myHistogramArray[myBin] );
QgsDebugMsg( "Added " + QString::number( myHistogramArray[myBin] ) + " to histogram vector" );
// QgsDebugMsg( "Added " + QString::number( myHistogramArray[myBin] ) + " to histogram vector" );
}
}

Expand Down
371 changes: 356 additions & 15 deletions src/ui/qgsrasterlayerpropertiesbase.ui

Large diffs are not rendered by default.