[QGIS-Developer] Returning whether feature is rendered (feature visibility) using pyqgis

Ben Wirf ben.wirf at gmail.com
Sat Feb 15 20:41:08 PST 2020


  Hi all,

I am having trouble working out how to use the willRenderFeature() method
of QgsFeatureRenderer classes. There have been a couple of questions
related to this on gis,stackexchange.com recently, and I thought I would
try to find an answer- but I've hit a dead end!
The latest documentation contains a snippet specifically around dealing
only with visible features:
https://qgis.org/api/classQgsFeatureRenderer.html#a981b574dd6813bcc3cd849822af8929b


◆
<https://qgis.org/api/classQgsFeatureRenderer.html#a981b574dd6813bcc3cd849822af8929b>
capabilities()
virtual QgsFeatureRenderer::Capabilities QgsFeatureRenderer::capabilities (
) inlinevirtual

Returns details about internals of this renderer.

E.g. if you only want to deal with visible features:
if not renderer.capabilities().testFlag(QgsFeatureRenderer.Filter) or
renderer.willRenderFeature(feature, context):
deal_with_my_feature()
else:
skip_the_curren_feature()

Reimplemented in QgsRuleBasedRenderer
<https://qgis.org/api/classQgsRuleBasedRenderer.html#a1576aa5317eb1d9276f403313db68823>
, QgsCategorizedSymbolRenderer
<https://qgis.org/api/classQgsCategorizedSymbolRenderer.html#aed3ba97c9757f065e74f15d9aaa6cae7>
, QgsPointDistanceRenderer
<https://qgis.org/api/classQgsPointDistanceRenderer.html#a8ae8d6e2151b3ebb4038fec2d2bccc35>
, QgsInvertedPolygonRenderer
<https://qgis.org/api/classQgsInvertedPolygonRenderer.html#a389777639662b9e3e03fa5245bc802de>
, QgsSingleSymbolRenderer
<https://qgis.org/api/classQgsSingleSymbolRenderer.html#a6bdbfdee8d84d92168ffd2a45d2c81d8>,
and QgsGraduatedSymbolRenderer
<https://qgis.org/api/classQgsGraduatedSymbolRenderer.html#a7e3e3c9e1ce38d984503de720ce94297>
.

Definition at line 274
<https://qgis.org/api/qgsrenderer_8h_source.html#l00274> of file
qgsrenderer.h <https://qgis.org/api/qgsrenderer_8h_source.html>.
But I cannot work out how to implement this logic.
E.g. I have a vector layer which is symbolized with a
QgsCategorizedSymbolRenderer and I would like to exclude features belonging
to categories which are unchecked in the TOC from, for example, an
intersection test against a QgsRectangle. If I run the following in the
Python console, QGIS crashes when passing a QgsRenderContext object as the
second argument of the renderer.willRenderFeature() method.
Firstly passing an empty instance:

layer = iface.activeLayer()
feat = layer.getFeature(3)
renderer = layer.renderer()
test = renderer.willRenderFeature(feat, QgsRenderContext())
# LINE BELOW CRASHES QGIS
test = renderer.willRenderFeature(feat, QgsRenderContext())

And secondly, I tried constructing a QgsRenderContext object with the
fromMapSettings() method and passing the canvas.mapSettings() to its
constructor:

layer = iface.activeLayer()
feat = layer.getFeature(3)
renderer = layer.renderer()
settings = iface.mapCanvas().mapSettings()
context = QgsRenderContext().fromMapSettings(settings)
# LINE BELOW CRASHES QGIS
test = renderer.willRenderFeature(feat, context)

I'm sure I am doing something wrong because I don't have a thorough
understanding of how to properly construct or use this context object.

Incidentally, if I run the following line:

renderer.capabilities().testFlag(QgsFeatureRenderer.Filter)

I get an attribute error that Capabilities object has no attribute
'testFlag'

So at this point I'm a bit stumped. Any help or guidance would be greatly
appreciated.

Best regards,

Ben

Related GIS Stack Exchange questions:
https://gis.stackexchange.com/questions/350807/checking-if-feature-visible-using-pyqgis

https://gis.stackexchange.com/questions/347951/selecting-only-visible-features-from-different-layers-using-pyqgis
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20200216/01399528/attachment-0001.html>


More information about the QGIS-Developer mailing list