Skip to content

Commit

Permalink
Pseudocolor RAT support
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso authored and nyalldawson committed Nov 8, 2022
1 parent fc8cb92 commit 0e58c3d
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 3 deletions.
49 changes: 46 additions & 3 deletions src/core/raster/qgsrasterattributetable.cpp
Expand Up @@ -20,6 +20,8 @@
#include "qgsrasterlayer.h"
#include "qgspalettedrasterrenderer.h"
#include "qgssinglebandpseudocolorrenderer.h"
#include "qgsrastershader.h"
#include "qgsrastershaderfunction.h"

Qgis::RasterAttributeTableType QgsRasterAttributeTable::type() const
{
Expand Down Expand Up @@ -945,9 +947,50 @@ QgsRasterAttributeTable *QgsRasterAttributeTable::createFromRaster( QgsRasterLay
}
else if ( const QgsSingleBandPseudoColorRenderer *pseudoColorRenderer = dynamic_cast<const QgsSingleBandPseudoColorRenderer *>( renderer ) )
{
QgsRasterAttributeTable *rat = new QgsRasterAttributeTable();
// TODO !
return rat;
if ( const QgsRasterShader *shader = pseudoColorRenderer->shader() )
{
if ( const QgsColorRampShader *shaderFunction = dynamic_cast<const QgsColorRampShader *>( shader->rasterShaderFunction() ) )
{
QgsRasterAttributeTable *rat = new QgsRasterAttributeTable();
rat->setType( Qgis::RasterAttributeTableType::Athematic );
rat->appendField( QStringLiteral( "Min" ), Qgis::RasterAttributeTableFieldUsage::Min, QVariant::Type::Double );
rat->appendField( QStringLiteral( "Max" ), Qgis::RasterAttributeTableFieldUsage::Max, QVariant::Type::Double );
rat->appendField( QStringLiteral( "Class" ), Qgis::RasterAttributeTableFieldUsage::Name, QVariant::Type::String );
rat->appendField( QStringLiteral( "RedMin" ), Qgis::RasterAttributeTableFieldUsage::RedMin, QVariant::Type::Int );
rat->appendField( QStringLiteral( "GreenMin" ), Qgis::RasterAttributeTableFieldUsage::GreenMin, QVariant::Type::Int );
rat->appendField( QStringLiteral( "BlueMin" ), Qgis::RasterAttributeTableFieldUsage::BlueMin, QVariant::Type::Int );
rat->appendField( QStringLiteral( "AlphaMin" ), Qgis::RasterAttributeTableFieldUsage::AlphaMin, QVariant::Type::Int );
rat->appendField( QStringLiteral( "RedMax" ), Qgis::RasterAttributeTableFieldUsage::RedMax, QVariant::Type::Int );
rat->appendField( QStringLiteral( "GreenMax" ), Qgis::RasterAttributeTableFieldUsage::GreenMax, QVariant::Type::Int );
rat->appendField( QStringLiteral( "BlueMax" ), Qgis::RasterAttributeTableFieldUsage::BlueMax, QVariant::Type::Int );
rat->appendField( QStringLiteral( "AlphaMax" ), Qgis::RasterAttributeTableFieldUsage::AlphaMax, QVariant::Type::Int );
const QList<QgsColorRampShader::ColorRampItem> rampItems { shaderFunction->colorRampItemList() };
if ( rampItems.count( ) > 1 )
{
QColor color1 { rampItems.at( 0 ).color };
QString label1 { rampItems.at( 0 ).label };
QVariant value1( rampItems.at( 0 ).value );
for ( int i = 1; i < rampItems.count( ); ++i )
{
const QgsColorRampShader::ColorRampItem &rampItem { rampItems.at( i )};
rat->appendRow( QVariantList() << value1 << rampItem.value << QStringLiteral( "%1 - %2" ).arg( label1, rampItem.label ) << 0 << 0 << 0 << 255 << 0 << 0 << 0 << 255 );
rat->setRamp( rat->data().length() - 1, color1, rampItem.color );
label1 = rampItem.label;
value1 = rampItem.value;
color1 = rampItem.color;
}
}
return rat;
}
else
{
return nullptr;
}
}
else
{
return nullptr;
}
}
else
{
Expand Down
24 changes: 24 additions & 0 deletions tests/src/python/test_qgsrasterattributetable.py
Expand Up @@ -31,6 +31,8 @@
QgsRasterLayer,
QgsRasterAttributeTable,
QgsPalettedRasterRenderer,
QgsSingleBandPseudoColorRenderer,
QgsPresetSchemeColorRamp,
)

from qgis.testing import start_app, unittest
Expand Down Expand Up @@ -588,6 +590,28 @@ def testCreateFromPalettedRaster(self):
usages = rat.usages()
self.assertEqual(usages, [Qgis.RasterAttributeTableFieldUsage.MinMax, Qgis.RasterAttributeTableFieldUsage.Name, Qgis.RasterAttributeTableFieldUsage.Red, Qgis.RasterAttributeTableFieldUsage.Green, Qgis.RasterAttributeTableFieldUsage.Blue, Qgis.RasterAttributeTableFieldUsage.Alpha])

def testCreateFromPseudoColorRaster(self):

raster = QgsRasterLayer(self.uri_2x2_1_BAND_INT16)
renderer = QgsSingleBandPseudoColorRenderer(raster.dataProvider(), 1)
ramp = QgsPresetSchemeColorRamp([QColor('#00000'), QColor('#0F0F0F'), QColor('#CFCFCF'), QColor('#FFFFFF')])
renderer.setClassificationMin(0)
renderer.setClassificationMax(4)
renderer.createShader(ramp)
raster.setRenderer(renderer)

self.assertEqual([(i.color.name(), i.value) for i in raster.renderer().shader().rasterShaderFunction().colorRampItemList()],
[('#000000', 0.0),
('#0f0f0f', 1.3333333333333333),
('#cfcfcf', 2.6666666666666665),
('#ffffff', 4.0)])

rat = QgsRasterAttributeTable.createFromRaster(raster)
self.assertEqual(rat.data(), [
[0.0, 1.3333333333333333, '0 - 1.33', 0, 0, 0, 255, 15, 15, 15, 255],
[1.3333333333333333, 2.6666666666666665, '1.33 - 2.67', 15, 15, 15, 255, 207, 207, 207, 255],
[2.6666666666666665, 4.0, '2.67 - 4', 207, 207, 207, 255, 255, 255, 255, 255]])


if __name__ == '__main__':
unittest.main()

0 comments on commit 0e58c3d

Please sign in to comment.