Beispiel #1
0
def apply_style(layer, style, is_new, name):
    """Apply the style to a new or existing layer

    :param layer: QGIS layer instance
    :type layer: QgsVectorLayer
    :param style: optional, dictionary with style properties: example {'color': [100, 50, 123], 'transparency': 0.5, 'stroke_width: 3 }
    :type style: dict
    :param is_new: True is the layer is a new layer
    :type is_new: bool
    :param name: name of the isochrone, if blank/None create a timestamp for the name if the layer is not new
    :type name: str
    """

    if style is None:
        return

    def _set_labeling():
        pal_layer = QgsPalLayerSettings()
        pal_layer.fieldName = 'value'
        pal_layer.enabled = True
        pal_layer.placementFlags = QgsLabeling.OnLine
        pal_layer.placement = QgsPalLayerSettings.PerimeterCurved
        text_format = pal_layer.format()
        buffer = text_format.buffer()
        buffer.setColor(QColor(255, 255, 255))
        buffer.setOpacity(0.5)
        buffer.setEnabled(True)
        text_format.setBuffer(buffer)
        pal_layer.setFormat(text_format)
        labels = QgsVectorLayerSimpleLabeling(pal_layer)
        return labels

    def _set_rule(renderer):
        root_rule = renderer.rootRule()
        if is_new:
            rule = root_rule.children()[0]
        else:
            rule = root_rule.children()[0].clone()
        rule.setLabel(name)
        expression = '"name" = {}'.format(QgsExpression.quotedString(name))
        rule.setFilterExpression(expression)
        rule.symbol().setColor(QColor(*style['color'], 255))
        rule.symbol().setOpacity(1 - style['transparency'])
        rule.symbol().symbolLayers()[0].setStrokeWidth(style['stroke_width'])
        rule.symbol().symbolLayers()[0].setStrokeColor(QColor(255, 255, 255))
        if not is_new:
            root_rule.appendChild(rule)

    if is_new:  # Create the new style
        symbol = QgsSymbol.defaultSymbol(layer.geometryType())
        renderer = QgsRuleBasedRenderer(symbol)
        req = QgsFeatureRequest()
        req.addOrderBy('"value"', False, False)
        renderer.setOrderBy(req.orderBy())
        renderer.setOrderByEnabled(True)
        _set_rule(renderer)
        # Delete first rule
        layer.setRenderer(renderer)
        labels = _set_labeling()
        layer.setLabeling(labels)
        layer.setCustomProperty("labeling/bufferDraw", True)
        layer.setLabelsEnabled(True)

    else:
        # Check for rule based renderer, pass if not present
        renderer = layer.renderer()
        if isinstance(renderer, QgsRuleBasedRenderer):
            _set_rule(renderer)