Alterando estilos de etiqueta (fonte, cor, tamanho etc.) usando o ArcPy?

9

Estou tentando escrever uma macro python para o ArcGIS 10.2 que automatizará o processo de rotular pontos em uma camada com base em diferentes tipos de apartamentos. Por exemplo, um estilo de apartamento teria um quadrado azul com texto em negrito branco como um rótulo; outro teria um quadrado rosa com texto em negrito preto; outro teria um quadrado vermelho com um texto em negrito branco etc.

Que expressão ou função você usaria no arcpy para alterar o estilo desses rótulos?

Atualmente, o script rotula os apartamentos por um código de mapa e altera seu nome no sumário para apartamentos, como deveria.

insira a descrição da imagem aqui

Agora, quero alterar a fonte, o gráfico e o tamanho dos rótulos para criar um rótulo exclusivo para cada um deles e, em seguida, pressionar um botão e simplesmente automatizar o processo sempre que precisarmos executar uma dessas camadas.

Existe alguma maneira de alterar as fontes, rótulos e gráficos com o uso de scripts Python (ArcPy, IDLE etc.)?


Decidi editar este post para dar uma descrição final do que vou fazer aqui, para que não haja confusão. Essencialmente, os pontos no mapa passarão da aparência da imagem acima para esta:

insira a descrição da imagem aqui


Eu tentei usar a lblClass.expressionfunção, no entanto, o código que estou tentando usar não funciona. Eu acho que é provavelmente o passo na direção certa. Abaixo está um código que tentei usar apenas para obter o labelClass.expression para alterar as fontes dos rótulos.

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
fonte

Respostas:

7

A API arcpy.mapping fornece acesso apenas a um número limitado de propriedades da camada que podem ser modificadas diretamente, mas todas as propriedades encontradas na caixa de diálogo Propriedades da camada podem ser modificadas usando a função UpdateLayer. As informações são extraídas de uma camada de origem e aplicadas à camada em um documento de mapa que precisa ser atualizado. O source_layer pode ser um arquivo de camada (.lyr) ou uma camada dentro de um documento de mapa. O UpdateLayer é uma função robusta porque pode ser usada de várias maneiras diferentes para produzir resultados diferentes.

Você precisa criar a simbologia / etiquetas como desejar e salvá-la em um arquivo de camada. Em seguida, carregue esse arquivo de camada usando arcpy.mapping.UpdateLayer () .

Se várias pessoas precisarem executar o suplemento python, será necessário tornar o arquivo de camada acessível a todos, como uma unidade de rede pública.


Acabei criando uma caixa de ferramentas personalizada Atualizar propriedades da camada . Permite selecionar uma camada no ArcMap TOC e, em seguida, selecionar um arquivo de camada de entrada. Em seguida, atualiza a camada com todas as propriedades do arquivo da camada e volta a originar a classe de recurso original. Ele funcionará com dados contidos em gdb, mdb, shp ou sde.

Ver o código fonte

Por favor, deixe-me saber se você tem alguma dúvida.

insira a descrição da imagem aqui

ianbroad
fonte
Criei um arquivo de camada separado a partir de outra camada de dados baseada em pontos com tudo pronto (simbologia e rótulos), ele é executado, mas tudo o que parece fazer é substituir completamente o arquivo de apartamento sem rótulo e sem símbolo (o que eu escolher adicionar) pelo arquivo de apartamento sourceLayer. Estou assumindo que isso se deve ao Falso na seção "Atualizar apenas simbologia". Existe uma maneira de isso ser executado, para que apenas aplique a simbologia e os rótulos, mas não mova os pontos para um local diferente?
Tyler Spears
Que tipo de funções eu procuraria para fazer isso? Não estou muito familiarizado com o reaproveitamento. A propósito, agradeço sua ajuda até agora.
Tyler Spears
Tentei ajustar isso para caber no meu código. Ele funciona através da função UpdateLayer, mas na linha 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]gera um erro dizendo que o índice está fora do intervalo.
Tyler Spears
Isso significa que o arcpy.mapping.ListLayersmétodo não está encontrando uma camada no mxd atual com o mesmo nome que o seu input_layer_file(um índice de [0]retorno de índice fora do intervalo significa que não há itens na lista).
XIY
Eu fiz, e eu sinto que este é muito perto, mas o problema é, após os UpdateLayer parte acabamentos, ele lança o seguinte erro: 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

Outra opção é definir a expressão de etiqueta personalizada na camada (alterando tamanho e cor .. etc) usando python:

por exemplo

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

Construindo expressões de rótulo

Eles podem ser configurados via:

LabelClass (arcpy.mapping)

EDITAR:

Tente o seguinte:

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>"

Você pode remover suas outras instruções de linha (para loop, labClass e chamar a função). Além disso, a função precisa ser chamada FindLabel.

artwork21
fonte
Eu tentei utilizar algo semelhante a uma função como esta. Criei uma definição chamada def getLabel (Code, Type)e, depois de configurar as instruções if-else para os diferentes códigos de mapa que uso, defino 'lblClass.expression = getLabel ("[Map_Code]", "[Type]")', que retorna um erro TypeError: unsupported operand type(s) for &: 'str' and 'str'Estou basicamente seguindo os exemplos do site da Esri. Se eu puder provar que posso alterar a fonte, posso então ajustar os aspectos mais difíceis (como forma, plano de fundo e cor dos rótulos).
Tyler Spears #
@ Tyler Spears, Tente remover as aspas duplas ao redor dos nomes dos campos.
artwork21
Quando faço isso, diz que os parâmetros não estão definidos.
Tyler Spears
@ Tyler Spears, você pode postar seu código em sua pergunta? Você tem uma aspas simples fora dos parênteses da função.
artwork21
Absolutamente, atualizei minha pergunta para mostrar meu código.
Tyler Spears