Ok, I figured this out. It was as simple as:
*resultsLayer.setContrastEnhancementAlgorithm(QgsContrastEnhancement.StretchToMinimumMaximum)*
That computes the min and max, and stretches the grayscale (to
black and white for boolean rasters).
In the mean time I was futzing around with:
* band = resultsLayer.bandNumber(resultsLayer.grayBandName()) *
* minVal = resultsLayer.minimumValue(band)*
* maxVal = resultsLayer.maximumValue(band)*
and
* resultsLayer.setMinimumValue(band, minVal,
generateLookupTableFlag)*
* resultsLayer.setMaximumValue(band, maxVal,
generateLookupTableFlag)*
but it turns out that *resultsLayer.**setMaximumValue(band)
*returns the theoretical maximum (255) rather than the real
maximum (1), which is not what I wanted. You can get the correct
value with
* maxVal = resultsLayer.bandStatistics(band).maximumValue*
However, it says that calling bandStatistics is very CPU
intensive, since it also calculates a lot of other stuff. As it
turns out, the StretchToMinimumMaximum algorithm seems to
calculate the minmax anyway, so none of that is needed.
My big mistake, as I was rushing through this, was to confuse
extent and values, as I was trying to copy from a tutorial and
wasn't paying close attention. Once I figured that out, it was easy.
On the other hand,
*resultsLayer.setColorShadingAlgorithm("PseudoColorShader")*
Doesn't seem to do anything at all. Strange.
Cheers,
JP
On Sat, Sep 4, 2010 at 6:35 PM, Benoit de Cabissole
<[email protected] <mailto:[email protected]>> wrote:
Hi JP,
I would suggest asking your question on the Qgis-developer
list instead of this one.
Below is what I've done to display a custom colormap on a
raster. Could it be adapted to your problem?
# Display the raster with the selected colour table:
#
# - tell the layer to use a QgsColorRampShader function
theLayer.setColorShadingAlgorithm(
QgsRasterLayer.ColorRampShader )
# - get a pointer to the raster shader function
(QgsColorRampShader)
myColorRampShader =
theLayer.rasterShader().rasterShaderFunction()
# - set parameters for the QgsColorRampShader function
myColorRampShader.setColorRampType(
QgsColorRampShader.DISCRETE )
myColorRampShader.setColorRampItemList( theTBL )
theLayer.setDrawingStyle(
QgsRasterLayer.SingleBandPseudoColor )
# - refresh map & legend
if hasattr(theLayer, "setCacheImage"):
theLayer.setCacheImage( None )
theLayer.triggerRepaint()
self.iface.legendInterface().refreshLayerSymbology(
theLayer )
# - tell QGIS that it needs to ask user to save changes
self.iface.mapCanvas().setDirty( True )
Cheers,
Benoit
-----Original Message-----
*From:* [email protected]
<mailto:[email protected]>
[mailto:[email protected]
<mailto:[email protected]>]*On Behalf Of
*JP Glutting
*Sent:* Saturday, 04 September 2010 17:47
*To:* [email protected]
<mailto:[email protected]>
*Subject:* [Qgis-user] Re: Raster layer display control
from Plugin
No takers? No hints? I have been looking all over the
place, and I am stuck. If it is something absurdly
simple, just point me in the right direction.
Any ideas?
Thanks,
JP
On Fri, Sep 3, 2010 at 7:50 AM, JP Glutting
<[email protected] <mailto:[email protected]>> wrote:
Although here (http://blog.qgis.org/node/94) it seems
to indicate that SingleBandPseudoColor is a constant:
mypLayer->setColorRampingType(QgsRasterLayer::BLUE_GREEN_RED);
mypLayer->setDrawingStyle(QgsRasterLayer::SINGLE_BAND_PSEUDO_COLOR);
std::deque myLayerSet;
which is what I was thinking in the first place, and
here (
http://doc.qgis.org/stable/classQgsRasterLayer.html#36796f1a303dac9848ba3dce3e5527dc7b7c9814c053986846b579119d2e5be9
)
DrawingStyle is described as an enumerator, which
seems coherent. I am not sure how to do this from Python.
Cheers,
JP
On Fri, Sep 3, 2010 at 7:43 AM, JP Glutting
<[email protected] <mailto:[email protected]>>
wrote:
Actually, I am not even sure that first part is
the way to do it. I tried this:
resultsLayer.setDrawingStyle(QtCore.QString('SingleBandPseudoColor'))
resultsLayer.setCacheImage(None)
resultsLayer.triggerRepaint()
(passing the 'SingleBandPseudoColor' style as a
string) and it makes the raster invisible. It
still shows up black in the Layers Panel, but it
doesn't show in the main window until you change
the properties manually (and it is Grayscale when
you do). It feels like I am pretty close, but I
am not sure how to interpret this code from the
QGIS documentation:
myRasterLayer->setDrawingStyle
<http://classQgsRasterLayer.html#3a923f732bedd87d0b920c5552215434>(QgsRasterLayer::SingleBandPseudoColor
<http://classQgsRasterLayer.html#36796f1a303dac9848ba3dce3e5527dc7b7c9814c053986846b579119d2e5be9>);
(I never learned more than the basics of C++, and
that was a long time ago). The source code seems
to indicate that the format needs to be passed as
a string (of course, when the layer is generated):
00204QgsRasterLayer <http://classQgsRasterLayer.html>(int
dummy,
00205const QString& baseName = QString(),
00206const QString& path = QString(),
00207const QString& providerLib = QString(),
00208const QStringList& layers = QStringList(),
00209const QStringList& styles = QStringList(),
00210const QString& format = QString(),
00211 const QString & crs = QString() );
Thanks,
JP
On Fri, Sep 3, 2010 at 3:04 AM, JP Glutting
<[email protected]
<mailto:[email protected]>> wrote:
Hello,
I am working on a plugin (I mentioned it on
the list earlier, but it isn't relevant to
the question I have now). I have the results
written to a raster file, and I need to
display it. I am using this code:
resultsLayer =
qgis.core.QgsRasterLayer(self.query.results_file,
QtCore.QFileInfo(self.query.results_file).baseName())
qgis.core.QgsMapLayerRegistry.instance().addMapLayer(resultsLayer)
which works fine for opening the file, but I
would like to fine-tune the display so the
user doesn't have to reset the properties (in
my test exaple the values are 0 and 1 and the
display is essentially all black). I would
like to either display the results in
pseudocolor directly, or in grayscale with
the scale stretched to the min and max extent
of the raster.
I tried the psuedocolor with this code:
resultsLayer.setDrawingStyle(qgis.core.QgsRasterLayer.SingleBandPseudoColor)
resultsLayer.setCacheImage(None)
resultsLayer.triggerRepaint()
which doesn't seem to do anything at all, and
I am just guessing, really.
I found a nice tutorial about how to
calculate the min and max extent of a raster
and adjust the display here:
http://linfiniti.com/2010/08/a-simple-qgis-python-tutorial/
and I tried the following code:
band =
resultsLayer.bandNumber(resultsLayer.grayBandName())
extentMin = 0.0
extentMax = 0.0
generateLookupTableFlag = False
extentMin, extentMax =
resultsLayer.computeMinimumMaximumFromLastExtent(band)
resultsLayer.setMinimumValue(band,
extentMin, generateLookupTableFlag)
resultsLayer.setMaximumValue(band,
extentMax, generateLookupTableFlag)
resultsLayer.setStandardDeviations(0.0)
resultsLayer.setUserDefinedGrayMinimumMaximum(
True )
resultsLayer.setCacheImage(None)
resultsLayer.triggerRepaint()
but that fails with the following error:
Traceback (most recent call last):
File
"/Users//.qgis/python/plugins/mcelite/MCELiteDialog.py",
line 361, in accept
extentMin, extentMax =
resultsLayer.computeMinimumMaximumFromLastExtent(band)
TypeError: 'float' object is not iterable
and I don't understand what the float object
is, exactly.
Any help or suggestions much appreciated.
Cheers,
JP