[Qgis-developer] How to load a colour table on a raster, programmatically (in python)?

Benoit de Cabissole benoit at exigesa.com
Thu Aug 5 15:08:02 EDT 2010


Hi peter,

Me again, sorry!

I've implemented the code following your suggestions, but it throws the
following error:

==================================================================
Traceback (most recent call last):
  File "C:\Documents and
Settings\Benoit/.qgis/python/plugins\bcccoltbl\cdlgTBL.py", line 373, in
accept
    self.theLayer.rasterShader().setColorRampItemList(theTBL)
AttributeError: 'QgsRasterShader' object has no attribute
'setColorRampItemList'

Python version:
2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)]


QGIS version:
1.5.0-Tethys Tethys, 13923M
==================================================================

The code snippet is as follows:
367    # try to load the selected table directly on the selected raster
368    theTBL = self.ParseTBL(LTBL)
369    if not theTBL:
370        return
371    #
372    self.theLayer.setColorShadingAlgorithm( "ColorRampShader" )
373    self.theLayer.rasterShader().setColorRampItemList(theTBL)
374
self.theLayer.rasterShader().setColorRampType(QgsColorRampShader.ColorRamp_T
YPE.DISCRETE)

Problem is that I don't know the reason for the error!
Can it be that:
- theTBL is not valid? (see below how it is created)
- a typo?

- self.theLayer is truly a rasterLayer because the plugin will not load
otherwise.
- line 373 excecutes with no error
- A look at the C++ code for the raster properties 'Apply' colormap section
seems to indicate the code above is correct.

So I'm at a loss here. Do I miss an object?

Moreover, if I swap line 373 and 374 and run the code I do have the same
error:

==================================================================
Traceback (most recent call last):
  File "C:\Documents and
Settings\Benoit/.qgis/python/plugins\bcccoltbl\cdlgTBL.py", line 373, in
accept
    self.theLayer.rasterShader().setColorRampType(QgsColorRampShader.ColorRa
mp_TYPE.DISCRETE)
AttributeError: 'QgsRasterShader' object has no attribute 'setColorRampType'
==================================================================

Could you sort me out?


Code for reading the color ramp list:

    def ParseTBL(self, LTBL):
        """
        Parse the colour table (QML file) to create a
        QgsColorRampShader::ColorRampItem Struct
        """
        theTBLfile = os.path.join(self.FilePath,str(LTBL))              #
full name to the colour table to load
        if not os.path.exists(theTBLfile):
            QMessageBox.critical(self,MSG_BOX_TITLE,"ERROR: colour table not
found:\n"+str(theTBLfile))
            return False
        else:
            sc = open(theTBLfile,'r')
            ar = sc.readlines()
            sc.close()
            #
            nC = 0
            colorRampEntries = []
            #
            for a in ar:
                if a.find(",") >= 0:
                    #value,r,g,b,alpha
                    #-0.65480690,1,1,1,255,
                    br = a.split(",")
                    red = int(br[1])   #red
                    gre = int(br[2])   #green
                    blu = int(br[3])   #blue
                    alp = int(br[4])   #alpha
                    colorRampEntries.append(QgsColorRampShader.ColorRampItem
())
                    colorRampEntries[nC].label = QString(" ")
                    colorRampEntries[nC].value = float(br[0])
                    colorRampEntries[nC].color = QColor(red, gre, blu, alp)
                    nC += 1
            #
            return colorRampEntries

The above code seems to work because on printing str(colorRampEntries) I've
got:
[<qgis.core.ColorRampItem object at 0x124D8810>, ...,
<qgis.core.ColorRampItem object at 0x12575108>]

Add printing str(theTBL[0].value)+"   "+str(theTBL[0].color)
produces:  1.0   <PyQt4.QtGui.QColor object at 0x125785E0>


Sorry again for the length of this message, and take into consideration that
I'm very new to Python as well!

Thanks,
Benoit


> -----Original Message-----
> From: qgis-developer-bounces at lists.osgeo.org
> [mailto:qgis-developer-bounces at lists.osgeo.org]On Behalf Of Peter Ersts
> Sent: Thursday, 05 August 2010 15:33
> To: qgis-developer at lists.osgeo.org
> Subject: Re: [Qgis-developer] How to load a colour table on a
> raster,programmatically (in python)?
>
>
> On 08/05/2010 05:25 AM, Benoit de Cabissole wrote:
> > Could you please point me to the function(s) that are used to
> match a custom
> > colour table (QgsColorRampShader?) to a raster?
> >
> >
>
> Howdy Benoit,
>
> First you will need to set the color shading algorithm for the raster,
>  >> YourRasterLayer.setColorShadingAlgorithm( "ColorRampShader" )
> This creates a new shader for the raster.
>
> Next you will need to build your color ramp (palette). This is just a
> list of items of type QgsColorRampShader.ColorRampItem, Each item has
> three variables, lable (QString), color (QColor) , and value (double)
>
> Once you have your list you will need to give that list to the shader.
>  >> YourRasterLayer.rasterShader().setColorRampItemList( YourColorRamp )
>
> Then you need to set the color ramp type:
>  >> YourRasterLayer.rasterShader().setColorRampType( TheType )
>
> Where TheType is, INTERPOLATED, DISCRETE or EXACT. If your color ramp
> only had three entries:
> Label1, Red, 0
> Label2, Yellow, 127
> Label3, Green, 255
>
> exact - looks for an exact match at the time of shading, a value of 90
> would not be shaded.
>
> discrete - is a bin type approach, images pixels with values of 50, 70,
> or 90 would all be assigned the same color
>
> interpolated - is as the name says, 90 will be an interpolated color
> between Red and Yellow. In this case, more yellow than red as 90 is
> closer to 127 than 0.
>
>
> Hope that helps.
> -pete
>
> --
> ====================================
> Peter J. Ersts, Software Developer
> American Museum of Natural History
> Center for Biodiversity and Conservation
> Central Park West at 79th Street
> New York, New York 10024
> Web: http://biodiversityinformatics.amnh.org
> Web: http://cbc.amnh.org
>
> Open Source,
> ...evolving through community cooperation to change the world bit by bit
>
> Quantum GIS Raster Development Team.
>
> _______________________________________________
> Qgis-developer mailing list
> Qgis-developer at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-developer



More information about the Qgis-developer mailing list