4 votos

QGIS reglamento de pruebas con python

En QGIS 2.14 uno puede comprobar si una regla da resultados:

enter image description here

Es posible hacer esto de la programación con consola de python? Me gustaría ver de una forma de iterar a través de todas las capas y las reglas (reglas anidadas!) y la impresión de los (nombre de capa:rule_name), que no tienen resultados.

3voto

Chris Kloberdanz Puntos 1871

Se trata de una simple selección:

for layer in layers:
    expression = QgsExpression("your expression goes here")
    features = layer.getFeatures(QgsFeatureRequest(expression))
    number_of_features = sum(1 for _ in features) # you should count this in that way beacuse this object is an iterator
    print "Number of features found: " + str(number_of_features)

Editar:

Si usted tiene muchas reglas (el mismo conjunto de reglas para cada capa) añadir otra iteración:

for layer in layers:
    for rule in rules: # assumed that rules = ["rule 1", "rule 2", ...]
        expression = QgsExpression("your expression goes here")
        features = layer.getFeatures(QgsFeatureRequest(expression))
        number_of_features = sum(1 for _ in features)
        if not number_of_features:
            print rule

Si usted tiene muchas reglas diferentes para cada capa, tal vez organizar en un diccionario:

rules = {"layer1": ["rule 1", "rule 2"], "layer2": ["rule 3", "rule 4"]}

for layer in layers:
    r = rules[layer.name()]
    for rule in r: 
        expression = QgsExpression("your expression goes here")
        features = layer.getFeatures(QgsFeatureRequest(expression))
        number_of_features = sum(1 for _ in features)
        if not number_of_features:
            print rule

3voto

Elliott Maynard Puntos 11

Tal vez esta respuesta puede resolver tu pregunta.

Ejecutar este fragmento de código en el QGIS Consola de Python:

for layer in QgsMapLayerRegistry.instance().mapLayers().values(): # Iterate layers
    if type(layer) == QgsVectorLayer and layer.hasGeometryType():
        r = layer.rendererV2()
        if r.type() == 'RuleRenderer':
            for rule in r.rootRule().children(): # Iterate rules
                if rule.filter(): # Filter out empty rules
                    request = QgsFeatureRequest( rule.filter() )
                    count = len( [f for f in layer.getFeatures( request )] )
                    print layer.name() + ' : ' + rule.label() + ' : ' + rule.filterExpression() + ' : ' + str(count)

El primer for bucle itera capas, la segunda iteración de la capa de reglas. Primera if cláusula asegura que utilice capas vectoriales, el segundo asegura que sólo utilice capas vectoriales con una regla basada en el estilo, y la última en los filtros de vacío reglas.

El resultado es una lista con los nombres de capa, la regla de las etiquetas, la regla de expresiones, y la correspondiente cuenta, como este:

my_point_layer : My Rule :  "my_code" = '1': 6
my_point_layer : My 2nd Rule :  "my_code" IS NULL : 0
my_polygon_layer : My Polygon Rule :  "area" > 100 : 2
my_polygon_layer : My 2nd Polygon Rule :  "area <= 100 : 28

Usted puede utilizar a la count variable para filtrar sólo aquellos con 0 características, que era su propósito original.

Espero que esto aclare tu pregunta.

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