Establecer descripciones de símbolos de las leyendas de diseño de ArcMap de la tabla


Respuestas:


7

En lugar de intentar usar solo la aplicación ArcMap, he incorporado ArcPy a la imagen.

Acabo de probar y lograr lo que describiste usando la clase UniqueValuesSymbology (arcpy.mapping) que tiene una propiedad de escritura de ClassDescriptions que se puede establecer en:

Una lista de cadenas o números que representan las descripciones de cada valor único que opcionalmente puede aparecer en la leyenda de un documento de mapa. Solo se puede acceder a estos valores en la interfaz de usuario de ArcMap haciendo clic con el botón derecho en un símbolo que se muestra dentro de la pestaña Simbología en el cuadro de diálogo Propiedades de capa y seleccionando Editar descripción. La lista classDescriptions debe tener el mismo número de elementos y estar organizados en el mismo orden que la propiedad classValues.

El código usa un cursor de búsqueda para leer la tabla de búsqueda en una lista y luego escribe esa lista en la propiedad classDescriptions de la clase de simbología de la capa. Tenga en cuenta que la tabla de búsqueda DEBE tener el mismo número de filas y estar en el mismo orden que los valores de la clasificación de simbología única . Debería mejorar mi código para tener en cuenta que ese no es el caso, pero asegurar mi orden manualmente fue fácil en mi caso de prueba.

import arcpy

vegDescList = []
vegCodes = arcpy.SearchCursor(r"C:\temp\test.gdb\LookupTable")
for vegCode in vegCodes:
    vegDescList.append(vegCode.Description)

mxd = arcpy.mapping.MapDocument(r"C:\temp\test.mxd")
lyr = arcpy.mapping.ListLayers(mxd,"testFC")[0]
if lyr.symbologyType == "UNIQUE_VALUES":
    lyr.symbology.classDescriptions = vegDescList
mxd.save()

del mxd

Reuní un código de prueba para ver si esto funcionaría y, aunque no se generan errores, las descripciones actualizadas no vuelven a la capa. Soy nuevo en arcpy en el mapeo, por lo que probablemente sea algo que he hecho mal.
Michael Stimson

¿Eso funciona? Tengo casi lo mismo, excepto que estoy usando MapDocument ("current") y RefreshActiveView () / RefreshTOC () pero nada se actualiza.
Michael Stimson

1
@ MichaelMiles-Stimson Sí, se actualizó según lo previsto, sospecho que lo que se ha perdido es que no es el TOC el que muestra los valores de Descripción, sino un Elemento de diseño de leyenda. Inserte uno de esos y elija un Estilo de elemento de leyenda que muestre Descripciones y creo que quedará claro que funciona.
PolyGeo

Gracias @polygeo! Eso es exactamente! Lo hacía todo el tiempo, solo buscaba en el lugar equivocado.
Michael Stimson

Resolví el problema de tener que hacer que las descripciones y los códigos de búsqueda coincidan, vea mi respuesta.
Matt Wilkie

1

¿Podría clasificar sus símbolos con "Valores únicos de muchos campos" y elegir un campo para el código y el segundo para la descripción más larga? Eso debería etiquetar cada elemento con una cadena en la forma "[Campo1], [Campo2]"

Funciona con campos más pequeños, imagino que lo haría con cadenas más largas, a menos que haya una limitación con la que no estoy familiarizado.

La única parte molesta sería que es posible que tenga que revisar y eliminar el valor del código desde el principio del valor de la etiqueta, pero eso no sería lo peor que jamás haya sucedido.


Una idea interesante que podría funcionar en algunas situaciones. Sin embargo, no funcionará aquí porque la tabla de descripción es solo una tabla, no hay geometría. Uno podría unir la geometría y las descripciones, pero no estoy interesado en ese trabajo adicional o éxito de rendimiento para este proyecto.
Matt Wilkie

1

Trabajando a partir del código de PolyGeo , esto es lo que se me ocurrió para solucionar el problema de tener que tener un número exacto de elementos y una coincidencia de orden idéntica entre los valores de búsqueda y la descripción. El guión de trabajo completo está aquí .

# name and path of the lookup table
lookup_table = r"..\default.gdb\vegMajorComm_Lookup"

# change these to match the relevant field names in the lookup table
code = 'VegCode'
description = 'Description'

##...snip...

# build the descriptions dictionary
descriptions = {}
rows = arcpy.SearchCursor(lookup_table)
for item in rows:
    #print item.getValue(code), item.getValue(description)
    descriptions[item.getValue(code)] = item.getValue(description)

# lyr.symbology requires the classValues and classDescriptions to have
# same number of rows and be in same order. So extract only matching 
# elements from the description dictionary
desclist = []
if lyr.symbologyType == "UNIQUE_VALUES":

    #extract matches
    for symbol in lyr.symbology.classValues:
      desclist.append(descriptions[symbol])    

    # assign the descriptions
    lyr.symbology.classDescriptions = desclist

mxd.saveACopy(output_map)
del mxd
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.