4

QgsVectorLayer Right click->Properties->Style->Single symbol->click on simple line in tree node ->symbol layer type -> Marker line

Kindly help me to set marker line symbol programmatically by using Python.

7

The only documentation I found is here, but it doesn't help much in practice.

Here is an example I used to set the renderer of the current layer to a symbol with two layers: one 'Simple Line' and one 'Marker Line'. The marker line is tricky, because you need to work with a subSymbol.

# Use the currently selected layer
layer = qgis.utils.iface.mapCanvas().currentLayer()

registry = QgsSymbolLayerV2Registry.instance()
lineMeta = registry.symbolLayerMetadata("SimpleLine")
markerMeta = registry.symbolLayerMetadata("MarkerLine")

symbol = QgsSymbolV2.defaultSymbol(layer.geometryType())

# Line layer
lineLayer = lineMeta.createSymbolLayer({'width': '0.26', 'color': '255,0,0', 'offset': '-1.0', 'penstyle': 'solid', 'use_custom_dash': '0', 'joinstyle': 'bevel', 'capstyle': 'square'})

# Marker layer
markerLayer = markerMeta.createSymbolLayer({'width': '0.26', 'color': '255,0,0', 'interval': '3', 'rotate': '1', 'placement': 'interval', 'offset': '-1.0'})
subSymbol = markerLayer.subSymbol()
# Replace the default layer with our own SimpleMarker
subSymbol.deleteSymbolLayer(0)
triangle = registry.symbolLayerMetadata("SimpleMarker").createSymbolLayer({'name': 'filled_arrowhead', 'color': '255,0,0', 'color_border': '0,0,0', 'offset': '0,0', 'size': '1.5', 'angle': '0'})
subSymbol.appendSymbolLayer(triangle)

# Replace the default layer with our two custom layers
symbol.deleteSymbolLayer(0)
symbol.appendSymbolLayer(lineLayer)
symbol.appendSymbolLayer(markerLayer)

# Replace the renderer of the current layer
renderer = QgsSingleSymbolRendererV2(symbol)
layer.setRendererV2(renderer)

You can also inspect (and probably modify) the symbols for a layer, for example:

layer.rendererV2().symbol().symbolLayer(0).properties()
2

I did it this way mimicking the way I see QGIS Desktop doing it:

enter image description here

Using the same names as in the image the python code looks like this:

# Base style.    
line = QgsLineSymbolV2()    

# Create an marker line.
marker_line = QgsMarkerLineSymbolLayerV2()
marker_line.setInterval(10)

# Configure the marker.
simple_marker = QgsSimpleMarkerSymbolLayerV2()
simple_marker.setShape(QgsSimpleMarkerSymbolLayerBase.ArrowHeadFilled)
simple_marker.setSize(3)
simple_marker.setAngle(180)
simple_marker.setColor(QColor(255,255,255))
simple_marker.setOutlineColor(QColor(255,255,255))

# The marker has its own symbol layer.
marker = QgsMarkerSymbolV2()
marker.changeSymbolLayer(0, simple_marker)

# Add the layer to the marker layer.
marker_line.setSubSymbol(marker)

# Finally replace the symbol layer in the base style.
line.changeSymbolLayer(0, marker_line)

# Add the style to the line layer.        
renderer = QgsSingleSymbolRendererV2(line)
layer.setRendererV2(renderer)
0

A solution with QGIS 3 python classes:

## Create the marker symbol
marker_symb = QgsSimpleMarkerSymbolLayer.create()   

## Change marker attributes
marker_symb.setSize(symbol_size)       
## more attributes....

## Create the marker line symbol
main_symbol = QgsMarkerLineSymbolLayer.create()

## Replace the sub symbol with the new marker symbol
main_symbol.subSymbol().changeSymbolLayer(0, marker_symb)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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