¿Alterar estilos de etiqueta (fuente, color, tamaño, etc.) usando ArcPy?

9

Estoy tratando de escribir una macro de Python para ArcGIS 10.2 que automatizará el proceso de etiquetar puntos en una capa basada en diferentes tipos de apartamentos. Por ejemplo, un estilo de apartamentos tendría un cuadrado azul con texto en negrita blanco como una etiqueta; otro tendría un cuadrado rosa con texto negro en negrita; otro tendría un cuadrado rojo con un texto en negrita blanco, etc.

¿Qué expresión o función usarías en arcpy para alterar el estilo de estas etiquetas?

Actualmente, el script etiqueta los apartamentos por un código de mapa y cambia su nombre en la tabla de contenido a apartamentos, como debería.

ingrese la descripción de la imagen aquí

Ahora quiero cambiar la fuente, el gráfico y el tamaño de las etiquetas para que se vean, crear una etiqueta única para cada una, y luego hacer un botón para presionar y simplemente automatizar el proceso cada vez que tengamos que hacer una de estas capas.

¿Hay alguna forma de que las fuentes, las etiquetas y los gráficos se puedan cambiar con el uso de secuencias de comandos de Python (ArcPy, IDLE, etc.)?


Decidí editar esta publicación para dar una descripción final de lo que voy a hacer aquí para que no haya confusión. Esencialmente, los puntos en el mapa pasarán de verse como la imagen de arriba a esto:

ingrese la descripción de la imagen aquí


He intentado usar la lblClass.expressionfunción, sin embargo, el código que estoy tratando de usar no funciona. Me imagino que ese es probablemente el paso en la dirección correcta. A continuación se muestra un código que he tratado de usar solo para obtener labelClass.expression para cambiar las fuentes de las etiquetas.

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])
Tyler Spears
fuente

Respuestas:

7

La API arcpy.mapping solo proporciona acceso a un número limitado de propiedades de capa que se pueden modificar directamente, pero todas las propiedades que se encuentran en el cuadro de diálogo Propiedades de capa se pueden modificar mediante la función UpdateLayer. La información se extrae de una capa de origen y se aplica a la capa en un documento de mapa que debe actualizarse. Source_layer puede ser un archivo de capa (.lyr) o una capa dentro de un documento de mapa. UpdateLayer es una función robusta porque se puede usar de varias maneras diferentes para producir resultados diferentes.

Debe crear la simbología / etiquetas como desee y guardarla en un archivo de capa. Luego cargue ese archivo de capa usando arcpy.mapping.UpdateLayer () .

Si varias personas necesitan ejecutar el complemento de Python, entonces debe hacer que el archivo de capa sea accesible para todos, como una unidad de red pública.


Terminé haciendo una caja de herramientas de Propiedades de capa de actualización personalizada . Le permite seleccionar una capa en ArcMap TOC y luego seleccionar un archivo de capa de entrada. Luego actualiza la capa con todas las propiedades dentro del archivo de capa y vuelve a utilizar los recursos en la clase de entidad original. Funcionará con datos que están en gdb, mdb, shp o sde.

Ver el código fuente

Por favor hazme saber si tienes preguntas.

ingrese la descripción de la imagen aquí

ianbroad
fuente
Creé un archivo de capa separado a partir de otra capa de datos basada en puntos con todo todo establecido (simbología y etiquetas), se ejecuta, pero todo lo que parece hacer es reemplazar completamente el archivo de apartamento sin etiqueta y sin simbolizar (el que elija agregar) con el archivo de apartamento sourceLayer. Supongo que esto se debe a Falso en la sección "Actualizar solo simbología". ¿Hay alguna manera de que esto se pueda ejecutar para que solo aplique la simbología y las etiquetas pero no mueva los puntos a una ubicación diferente?
Tyler Spears
¿Qué tipo de funciones buscaría para hacer eso? No estoy muy familiarizado con el reabastecimiento. Aprecio tu ayuda hasta ahora, por cierto.
Tyler Spears
Traté de ajustar esto para que se ajuste a mi código. Funciona a través de la función UpdateLayer, pero en la línea 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]arroja un error que dice que el índice está fuera de rango.
Tyler Spears
Eso significa que el arcpy.mapping.ListLayersmétodo no está encontrando una capa en el mxd actual con el mismo nombre que su input_layer_file(un índice de índice de [0]retorno fuera de rango significa que no hay elementos en la lista).
XIY
Lo hice, y siento que esto está muy cerca, pero el problema es que, después de que finaliza la parte UpdateLayer, arroja el siguiente error: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Tyler Spears
6

Otra opción es establecer una expresión de etiqueta personalizada en la capa (cambiando el tamaño y el color ... etc.) usando python:

p.ej

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

Construir expresiones de etiqueta

Se pueden configurar a través de:

LabelClass (arcpy.mapping)

EDITAR:

Prueba esto:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

Puede eliminar sus otras instrucciones de línea (para loop, labClass y call to function). Además, la función debe llamarse FindLabel.

artwork21
fuente
Traté de utilizar algo similar a una función como esta. Creé una definición llamada def getLabel (Code, Type)y luego, después de configurar las instrucciones if-else para los diferentes códigos de mapa que uso, configuré 'lblClass.expression = getLabel ("[Map_Code]", "[Type]")', que solo devuelve un error TypeError: unsupported operand type(s) for &: 'str' and 'str'que básicamente estoy siguiendo los ejemplos del sitio web de Esri. Si simplemente puedo demostrar que puedo cambiar la fuente, puedo pasar a ajustar los aspectos más difíciles (como la forma, el fondo y el color de las etiquetas).
Tyler Spears
@Tyler Spears, intente eliminar las comillas dobles alrededor de los nombres de campo.
artwork21
Cuando hago eso, dice que los parámetros no están definidos.
Tyler Spears
@Tyler Spears, ¿puede publicar su código en su pregunta? Tiene una comilla simple fuera de los paréntesis de la función.
artwork21
Absolutamente, he actualizado mi pregunta para mostrar mi código.
Tyler Spears