2 votos

¿Cómo crear un símbolo con tamaño de marcador y ancho de línea graduados en pyQGIS?

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 )

3voto

Kris Puntos 3748

Después de trabajar un día entero en ambos códigos; por fin pude modificar el código para crear una simbología graduada superpuesta con flechas de dirección proporcionales.

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())

    #Line layer
    lineLayer = lineMeta.createSymbolLayer({'width': '1', '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': '255,255,255', 'offset': '0,0', 'size': '3', 'outline_width': '0.5', 'angle': '0'})
    subSymbol.appendSymbolLayer(triangle)
    #Replace the default layer with our two custom layers
    symbol.deleteSymbolLayer(0)
    symbol.appendSymbolLayer(lineLayer)
    symbol.appendSymbolLayer(markerLayer)

    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'
#Equal Interval
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, 1 ))
        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*3 ))
        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*3 ))

    myRenderer = QgsGraduatedSymbolRendererV2( myTargetField, myRangeList )
    vlayer.setRendererV2( myRenderer )
    QgsMapLayerRegistry.instance().addMapLayer( vlayer )

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X