Estoy utilizando QGIS + pyQGIS + Python. La geometría de la capa es una línea. Cada línea tiene una magnitud y una dirección (del 1er nodo al 2do nodo).
Lo que quiero realizar exactamente es "simbología de marcador de anchura graduada superpuesta a la simbología de línea de anchura graduada"
Ejemplo:
grosor de línea de 5 mm. y símbolo de marcador de 5 mm. de ancho superpuesto. \===(5mm)===
grosor de línea de 3 mm. y símbolo de marcador de 3 mm. de ancho superpuesto. ----- (3mm) -----
Por el momento, puedo realizar lo siguiente: "i) líneas con grosor graduado" o "ii) simbología de línea única superpuesta con símbolo de marcador único (sin grosor graduado)".
¿Puedo realizarlo al mismo tiempo? Marcadores de anchura graduada en líneas de grosor graduado.
El código siguiente hace que todos los marcadores que aparecen iguales se superpongan a todas las líneas que aparecen iguales:
#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': '0', 'penstyle': 'solid', 'use_custom_dash': '0', 'joinstyle': 'bevel', 'capstyle': 'square'})
#Marker layer
markerLayer = markerMeta.createSymbolLayer({'width': '0.26', 'color': '255,0,0', 'rotate': '1', 'placement': 'centralpoint', 'offset': '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': '3', '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)
QgsMapLayerRegistry.instance().addMapLayer( layer )
El código siguiente realiza sólo líneas de ancho graduado (intervalo igual) PERO SIN MARCAS SOBRESALIENTES
def validatedDefaultSymbol(geometryType):
symbol = QgsSymbolV2.defaultSymbol(geometryType)
if symbol is None:
if geometryType == QGis.Point:
symbol = QgsMarkerSymbolV2()
elif geometryType == QGis.Line:
symbol = QgsLineSymbolV2()
elif geometryType == QGis.Polygon:
symbol = QgsFillSymbolV2()
return symbol
def makeSymbologyForRange(layer, min ,max, label ,colour, alpha, width):
symbol = validatedDefaultSymbol(layer.geometryType())
symbol.setColor(colour)
symbol.setAlpha(alpha)
symbol.setWidth(width)
range = QgsRendererRangeV2(min, max, symbol, label)
return range
vlayer = QgsVectorLayer(str(SaveShpName), str(SaveShpName), 'ogr')
myTargetField = 'magnitude'
#For Equal Interval Classes
if dlg.ui.comboBoxSelectSymbology.currentText() == "Equal Interval":
GradSymNoOfClasses = dlg.ui.spinBoxClasses.value()
GradSymInterval = round(((int(GradSymMax) - int(GradSymMin)) / float(GradSymNoOfClasses)),0)
myRangeList = []
for i in range(GradSymNoOfClasses):
if i == 0:
classlabel = str(GradSymMin)+" - "+str(int(GradSymMin)+GradSymInterval)
myRangeList.append(makeSymbologyForRange( vlayer, int(GradSymMin), int(GradSymMin)+GradSymInterval, classlabel , QColor(0, 255-(255*i/GradSymNoOfClasses), 255*i/GradSymNoOfClasses), 1, 0.25 ))
elif i == (GradSymNoOfClasses - 1):
classlabel = str(int(GradSymMin)+(GradSymInterval*i)+0.001)+" - "+str(GradSymMax)
myRangeList.append(makeSymbologyForRange( vlayer, (GradSymInterval*i)+0.001, int(GradSymMax), classlabel , QColor(0, 255-(255*i/GradSymNoOfClasses), 255*i/GradSymNoOfClasses), 1, i/1.25 ))
else:
classlabel = str(int(GradSymMin)+(GradSymInterval*i)+0.001)+" - "+str(int(GradSymMin)+GradSymInterval*(i+1))
myRangeList.append(makeSymbologyForRange( vlayer, int(GradSymMin)+(GradSymInterval*i)+0.001, int(GradSymMin)+GradSymInterval*(i+1), classlabel , QColor(0, 255-(255*i/GradSymNoOfClasses), 255*i/GradSymNoOfClasses), 1, i/1.25 ))
myRenderer = QgsGraduatedSymbolRendererV2( myTargetField, myRangeList )
vlayer.setRendererV2( myRenderer )
QgsMapLayerRegistry.instance().addMapLayer( vlayer )