Definindo descrições de símbolos das legendas do layout do ArcMap da tabela?


Respostas:


7

Em vez de tentar usar o aplicativo ArcMap sozinho, eu trouxe o ArcPy para a imagem.

Acabei de testar e alcançar o que você descreveu usando a classe UniqueValuesSymbology (arcpy.mapping), que possui uma propriedade classDescriptions gravável que pode ser configurada para:

Uma lista de cadeias ou números que representam as descrições para cada valor exclusivo que pode opcionalmente aparecer na legenda de um documento de mapa. Esses valores são acessíveis apenas na interface do usuário do ArcMap clicando com o botão direito do mouse em um símbolo exibido na guia Symbology na caixa de diálogo Layer Properties e selecionando Edit Description. A lista classDescriptions precisa ter o mesmo número de elementos e organizados na mesma ordem que a propriedade classValues.

O código usa um Cursor de Pesquisa para ler a tabela de pesquisa em uma lista e, em seguida, grava essa lista na propriedade classDescriptions da classe de simbologia da camada. Observe que a tabela de pesquisa DEVE ter o mesmo número de linhas e estar na mesma ordem que os valores da classificação de simbologia exclusiva . Meu código precisaria ser aprimorado para que isso não acontecesse, mas garantir que esse pedido fosse fácil manualmente no meu caso de teste.

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

Eu montei algum código de teste para ver se isso funcionaria e, embora nenhum erro seja gerado, as descrições atualizadas não retornam à camada. Eu sou novo no arcpy no mapeamento, então provavelmente é algo que eu fiz de errado.
Michael Stimson

isso funciona? Eu tenho a mesma coisa, exceto que estou usando MapDocument ("current") e RefreshActiveView () / RefreshTOC (), mas nada é atualizado.
Michael Stimson

11
@ MichaelMiles-Stimson Sim - ele foi atualizado conforme o esperado - suspeito que o que você perdeu foi que não é o sumário que mostra os valores de descrição, mas um elemento de layout de legenda. Insira um deles e escolha um estilo de item de legenda que exiba descrições e acho que ficará claro que funciona.
PolyGeo

Obrigado @polygeo! É exatamente isso! Estava fazendo isso o tempo todo, eu estava apenas olhando no lugar errado.
precisa

Resolvi o problema de fazer com que as descrições e os códigos de pesquisa correspondessem, veja minha resposta.
214168 #

1

Você poderia classificar seus símbolos com "Unique Values ​​Many Fields" e escolher um campo para o código e o segundo para a descrição mais longa? Isso deve rotular cada item com uma sequência no formato "[Campo1], [Campo2]"

Funciona com campos menores, imagino que funcionaria com seqüências mais longas, a menos que haja uma limitação com a qual não estou familiarizado.

A única parte irritante seria que você pode ter que passar e excluir o valor do código desde o início do valor do rótulo, mas isso não seria a pior coisa que já aconteceu.


Uma ideia interessante que pode funcionar em algumas situações. Porém, não funcionará aqui porque a tabela de descrição é apenas uma tabela, não há geometria. Pode-se juntar a geometria e as descrições, mas não estou interessado nesse trabalho extra ou desempenho atingido para este projeto.
Matt Wilkie

1

Trabalhando no código da PolyGeo , aqui está o que eu criei para solucionar o problema de ter que ter um número exato de itens e uma correspondência de ordem idêntica entre os valores de pesquisa e a descrição. O script de trabalho completo está aqui .

# 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.