Skip to content

Instantly share code, notes, and snippets.

@jorgeluisyh
Last active March 10, 2023 16:37
Show Gist options
  • Save jorgeluisyh/24d866b63031d5ea5f49e658f7643107 to your computer and use it in GitHub Desktop.
Save jorgeluisyh/24d866b63031d5ea5f49e658f7643107 to your computer and use it in GitHub Desktop.
modificar simbologia
import json
import xmltodict
def show_only_styled_values(featurelayer, layerfile, fieldname):
"""show_only_styled_values(featurelayer, layerfile, fieldname)
Funcion que permite actualizar la simbologia de una capa y solo mostrar las clases que contienen valores
INPUTS:
featurelayer (Feature Layer) : nombre de layer presente en el mxd.
layerfile (String): Ruta de archivo de tipo .lyr || O nombre de layer presente en el mxd.
fieldname (String): Nombre de campo que se usa para la simbologia tipo texto
"""
# Convertimos la ruta a un archivo tipo layer
mxd = arcpy.mapping.MapDocument("current")
flayer = arcpy.mapping.ListLayers(mxd,featurelayer)[0]
lyr = arcpy.mapping.Layer(layerfile)
# Creamos una lista de las clasese existentes en el featurelayer
classes_present = list(set([f[0] for f in arcpy.da.SearchCursor(featurelayer, fieldname)]))
# Creamos una lista de simbologias vacias
simbologias = []
idxs =[]
# obtenemos el diccionario de simbologias del lyr
sym_dict = json.loads(lyr._arc_object.getsymbology())
sym_xml = lyr._arc_object.renderer
xpars = xmltodict.parse(sym_xml)
symbols = []
values = xpars["Renderer"]["UniqueValueInfos"]["UniqueValueInfo"]
for value in values:
if value['Value'] in classes_present:
symbols.append(value)
xpars["Renderer"]["UniqueValueInfos"]["UniqueValueInfo"] = symbols
sym_xml_final = xmltodict.unparse(xpars)
flayer._arc_object.renderer = sym_xml_final
arcpy.RefreshActiveView()
def modify_field_class(new_field, old_field, lyr):
lyr = # Layer object, typically from arcpy.mapping.ListLayers (arcpy._mapping.Layer)
# Example 1a: Modifying single-field renderer using undocumented _arc_object.renderer
new_field = # New field name for symbolizing layer
old_field = # Old field name for symbolizing layer
sym_xml = lyr._arc_object.renderer
lyr._arc_object.renderer = sym_xml.replace(old_field, new_field)
arcpy.RefreshActiveView()
# Example 1b: Modifying single-field renderer using updateLayerFromJSON
new_field = # New field name for symbolizing layer (string)
sym_dict = json.loads(lyr._arc_object.getsymbology())
sym_dict["renderer"]["field1"] = new_field
lyr.updateLayerFromJSON(json.dumps({"drawingInfo": sym_dict}))
arcpy.RefreshActiveView()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment