[Qgis-developer] update plugin to QGIS 2.0

Matthias Kuhn matthias.kuhn at gmx.ch
Fri Aug 2 07:02:23 PDT 2013


On Fre 02 Aug 2013 15:52:19 CEST, Etienne Tourigny wrote:
> On Fri, Aug 2, 2013 at 10:22 AM, Matthias Kuhn <matthias.kuhn at gmx.ch> wrote:
>> On Fre 02 Aug 2013 15:13:04 CEST, Etienne Tourigny wrote:
>>> On Fri, Aug 2, 2013 at 9:37 AM, Matthias Kuhn <matthias.kuhn at gmx.ch> wrote:
>>>> Hi
>>>>
>>>> On Fre 02 Aug 2013 13:50:08 CEST, Etienne Tourigny wrote:
>>>>>
>>>>> for each band, if the point is outside of the raster extent or is
>>>>> nodata, the value will be a null QVariant (i.e. QVariant()) which in
>>>>> python is None.
>>>>
>>>> It will be a QPyNullVariant so doing
>>>>
>>>> value = QPyNullVariant( int )
>>>> if not value:
>>>>     print 'Is NULL'
>>>> else:
>>>>     print 'Is not NULL'
>>>>
>>>> if value is None:
>>>>     print 'Is None'
>>>> else:
>>>>     print 'Is NOT None'
>>>>
>>>> will print:
>>>> Is NULL
>>>> Is NOT None
>>>
>>> Hi,
>>>
>>> I was not referring to the value of QPyNullVariant( int ), but the
>>> value that results() would return in the case of nodata (which is
>>> QVariant() in the c++ code)
>>>
>>> unless mistaken, that would be converted to None by Sip - or am I wrong?
>>>
>>
>> The SIP API v2 for QVariant defines:
>>
>> An Invalid QVariant will be represented as None
>> A Null QVariant will be represented as QPyNullVariant [1]
>>
>> Except for feature attributes (e.g. for a vectorlayer: feature['attr'])
>> which is patched by QGIS to become None in case of a Null value.
>
> thanks for the clarification
>
> Although it seems that testing for None does the trick,,. In the case
> of nodata pixels this test does seem to work:
>
>                   bandvalue = ident[iband]
>                   if bandvalue is None:
>                       bandvalue = "no data"
>

Ah, now I see.

QVariant() constructs an invalid QVariant and not a NULL QVariant. [1]

Glad we could sort this out :-)

Kind Regards
Matthias

[1] http://qt-project.org/doc/qt-4.8/qvariant.html#QVariant

> and in c++ nodata pixels are defined as QVariant() (i.e. a null QVariant)
>
>>
>> Matthias
>>
>> [1]
>> http://pyqt.sourceforge.net/Docs/PyQt4/python_v3.html#qvariant
>>
>>>>
>>>> Sorry for the smart-arsing ;)
>>>>
>>>> -- Matthias
>>>>
>>>>>
>>>>>
>>>>> cheers
>>>>> Etienne
>>>>>
>>>>> On Fri, Aug 2, 2013 at 7:13 AM, Otto Dassau <dassau at gbd-consult.de> wrote:
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> thanks for your hints, I think I am on the right track now. I had a look at
>>>>>> the value tool plugin and tried to adapt the method accordingly:
>>>>>>
>>>>>> def sampleRaster20(self, layer, x, y):
>>>>>>    #success, data = layer.dataProvider().identify(QgsPoint(x,y))
>>>>>>    success, data = layer.dataProvider().identify(QgsPoint(x,y),QgsRaster.IdentifyFormatValue).results()
>>>>>>    for band, value in data.items():
>>>>>>       return value
>>>>>>
>>>>>> But now I get another error message
>>>>>>
>>>>>>  File
>>>>>>  "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>  line 448, in printValue self.showValues() File
>>>>>>  "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>  line 454, in showValues self.plot() File
>>>>>>  "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>  line 526, in plot w = float(self.sampleRaster(self.InRastW.currentText(),
>>>>>>  self.xCoord, self.yCoord))/10 File
>>>>>>  "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>  line 300, in sampleRaster return self.sampleRaster20(layer, x, y) File
>>>>>>  "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>  line 285, in sampleRaster20 success, data =
>>>>>>  layer.dataProvider().identify(QgsPoint(x,y), QgsRaster.IdentifyFormatValue
>>>>>>  ).results() ValueError: need more than 1 value to unpack
>>>>>>
>>>>>> Do you have an idea for this, too?
>>>>>>
>>>>>> Thanks
>>>>>> Otto
>>>>>>
>>>>>> Am Thu, 1 Aug 2013 16:00:08 -0300
>>>>>> schrieb Etienne Tourigny <etourigny.dev at gmail.com>:
>>>>>>
>>>>>>> Have a look at the source of the value tool plugin, it calls the identify()
>>>>>>> method and has been updated to 2.0 api.
>>>>>>>
>>>>>>> Etienne
>>>>>>>
>>>>>>> On Thu, Aug 1, 2013 at 1:58 PM, Otto Dassau <dassau at gbd-consult.de> wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I want to update a plugin from 1.8 to QGIS 2.0 and it throws following
>>>>>>>> error:
>>>>>>>>
>>>>>>>> Traceback (most recent call last):
>>>>>>>> File
>>>>>>>>
>>>>>>>>
>>>>>>>> "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>>> line 447, in printValue self.showValues() File
>>>>>>>>
>>>>>>>>
>>>>>>>> "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>>> line 453, in showValues self.plot() File
>>>>>>>>
>>>>>>>>
>>>>>>>> "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>>> line 514, in plot w = float(self.sampleRaster(self.InRastW.currentText(),
>>>>>>>> self.xCoord, self.yCoord))/10 File
>>>>>>>>
>>>>>>>>
>>>>>>>> "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>>> line 299, in sampleRaster return self.sampleRaster20(layer, x, y) File
>>>>>>>>
>>>>>>>>
>>>>>>>> "/home/dassau/.qgis2/python/plugins/weibullanalyse/weibullanalysedialog.py",
>>>>>>>> line 284, in sampleRaster20 success, data =
>>>>>>>> layer.dataProvider().identify(QgsPoint(x,y))
>>>>>>>>
>>>>>>>> TypeError:
>>>>>>>> QgsRasterDataProvider.identify(QgsPoint, QgsRaster.IdentifyFormat,
>>>>>>>> QgsRectangle theExtent=QgsRectangle(), int theWidth=0, int theHeight=0):
>>>>>>>> not enough arguments
>>>>>>>>
>>>>>>>> I found at
>>>>>>>> http://hub.qgis.org/wiki/quantum-gis/API_changes_for_version_20 the
>>>>>>>> section QgsRasterDataProvider which should fit. And the Method, where I
>>>>>>>> assume the error occurs should be this
>>>>>>>>
>>>>>>>> # get value at mouse position QGIS <= 1.8 (working for 1.8)
>>>>>>>> def sampleRaster18(self, layer, x, y):
>>>>>>>>    success, data = layer.identify(QgsPoint(x,y))
>>>>>>>>    for band, value in data.items():
>>>>>>>>      return value
>>>>>>>>
>>>>>>>> now what I tried but doesn't work (see error above)
>>>>>>>>
>>>>>>>> # get value at mouse position QGIS >= 2.0 (not working yet :()
>>>>>>>> def sampleRaster20(self, layer, x, y):
>>>>>>>>    success, data = layer.dataProvider().identify(QgsPoint(x,y))
>>>>>>>>    for band, value in data.items():
>>>>>>>>      return value
>>>>>>>>
>>>>>>>> my problem is, that I don't understand how to implement in sampleRaster20
>>>>>>>> the new method from the API_changes_for_version_20 website which says:
>>>>>>>>
>>>>>>>> QMap<int, QVariant> identify( const QgsPoint & thePoint, IdentifyFormat
>>>>>>>> theFormat, const QgsRectangle &theExtent = QgsRectangle(), int theWidth =
>>>>>>>> 0, int theHeight = 0 )
>>>>>>>>
>>>>>>>> can anybody help?
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>>
>>>>>>>> Otto
>>>>>>>> _______________________________________________
>>>>>>>> Qgis-developer mailing list
>>>>>>>> Qgis-developer at lists.osgeo.org
>>>>>>>> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Geoinformatik Büro Dassau - http://www.gbd-consult.de
>>>>>> FOSSGIS consulting , training , support  and analysis
>>>>>> Ackerstrasse 144c  ,  D - 40233 Düsseldorf  , Germany
>>>>>> Tel: +49-(0)211-47468178 , Mobil: +49-(0)171-4687540
>>>>>>
>>>>>> --
>>>>>> Community Advisor - QGIS Project Steering Committee
>>>>> _______________________________________________
>>>>> 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