8

I'm in the process of developing a plugin which highlights/changes the color of a set of features in a vector layer, depending on some calculation.

I found a nice article about QGIS – Rule based styling and i need to do the same thing but using python code.

What is the best way of doing this? Are there any examples out there?

1 Answer 1

6

This page has a good example of doing rule based renderer via python:

Rule-based renderer

The rule-based renderer styles features using a list of rules, defined by expressions. The rules are processed sequentially, with the first matching rule used to render a feature.

The example below defines a new rule-based renderer for different kinds of road features. Major roads are shown in orange, minor roads are shown in black at scales larger than 1:2,500 and residential roads are shown in grey at scales between 1:100 and 1:1,000.

# define some rules: label, expression, color name, (min scale, max scale)
road_rules = (
    ('Major road', '"type" LIKE \'major\'', 'orange', None),
    ('Minor road', '"type" LIKE \'minor\'', 'black', (0.0, 2500.0,)),
    ('Residential road', '"type" LIKE \'residential\'', 'grey', (100.0, 1000.0,)),
)

# create a new rule-based renderer
symbol = QgsSymbolV2.defaultSymbol(layer.geometryType())
renderer = QgsRuleBasedRendererV2(symbol)

# get the "root" rule
root_rule = renderer.rootRule()

for label, expression, color_name, scale in road_rules:
    # create a clone (i.e. a copy) of the default rule
    rule = root_rule.children()[0].clone()
    # set the label, expression and color
    rule.setLabel(label)
    rule.setFilterExpression(expression)
    rule.symbol().setColor(QColor(color_name))
    # set the scale limits if they have been specified
    if scale is not None:
        rule.setScaleMinDenom(scale[0])
        rule.setScaleMaxDenom(scale[1])
    # append the rule to the list of rules
    root_rule.appendChild(rule)

# delete the default rule
root_rule.removeChildAt(0)

# apply the renderer to the layer
layer.setRendererV2(renderer)
1
  • How would I set the label to a field variable in the shape with a RuleBasedRenderer?
    – FredFury
    Apr 18, 2016 at 9:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.