1 votos

Recibir "ValueError: Number of label classes don't match number of class breaks" al intentar actualizar la simbología raster con arcpy.

Estoy trabajando en un script arcpy que establecerá automáticamente valores excluidos, valores de ruptura de clase y etiquetas de ruptura de clase en una serie de capas raster. Una versión simplificada de parte de mi código se puede ver a continuación:

mxd = arcpy.mapping.MapDocument(r'C:\Users\djh\Desktop\GIS Temp\test.mxd')
df = arcpy.mapping.ListDataFrames(mxd)[0]

symbology_lyr = (r'C:\Users\djh\Desktop\GIS Temp\test.lyr')
raster_name = (r'C:\Users\djh\Desktop\GIS Temp\test.gdb\test')

levels = [31.0, 32.0, 33.0, 34.0, 35.0]
class_break_labels = ['31.0 - 32.0', '32.0 - 33.0', '33.0 - 34.0', '> 34.0']

layers = arcpy.mapping.ListLayers(mxd, data_frame=df)

for lyr in layers:
    if lyr.isGroupLayer:
        for sublyr in lyr:
            if sublyr.name == raster_name:
                arcpy.ApplySymbologyFromLayer_management(sublyr, symbology_layer)
                if sublyr.symbologyType == "RASTER_CLASSIFIED":
                    sublyr.symbology.excludedValues = '0 - ' + str(levels[0])
                    sublyr.symbology.classBreakValues = levels[1:]
                    sublyr.symbology.classBreakLabels = class_break_labels

Cuando llego a la línea Aplicar simbología desde capa, funciona bien y actualiza la simbología en consecuencia, pero cuando incluyo el último bucle 'if', obtengo el siguiente error en la última línea del fragmento anterior:

ValueError: El número de clases de etiquetas no coincide con el número de saltos de clase

Incluí una sentencia print para obtener la diferencia entre las longitudes de levels[1:] y class_break_labels (ambas listas), y para cada iteración era 0, así que no veo cómo es posible que los números no coincidan.

Me he apropiado del último bucle 'if' de esta página de ayuda de Esri .

¿Alguien se ha encontrado con esto antes?

1voto

Gavin Schulz Puntos 592

levels = [31.0, 32.0, 33.0, 34.0, 35.0] tiene 5 valores, e irá con los 4 de class_break_labels = ['31.0 - 32.0', '32.0 - 33.0', '33.0 - 34.0', '> 34.0'] según el ejemplo de código de la página de ayuda de Esri.

Sin embargo, en su fragmento de código levels[1:] sólo devoluciones 4 valores, por lo que no es suficiente para que coincida con las etiquetas.

Pruébelo sin el [1:] en levels :

if sublyr.symbologyType == "RASTER_CLASSIFIED":
    sublyr.symbology.excludedValues = '0 - ' + str(levels[0])
    sublyr.symbology.classBreakValues = levels
    sublyr.symbology.classBreakLabels = class_break_labels

Si desea utilizar el primer valor como exclusión solamente, y luego la clase se rompe a partir de ahí, tendrá que eliminar su primera etiqueta también.

La razón por la que tiene un valor más en sus rupturas de clase sobre sus etiquetas se debe al hecho de que sus etiquetas son rangos entre cada nivel de ruptura.

Breaks    Labels
31.0
          31.0 - 32.0
32.0
          32.0 - 33.0
33.0
          33.0 - 34.0
34.0
          > 34.0
35.0

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