O ArcMap tem a capacidade de mostrar uma descrição estendida para cada item na lista de símbolos. Como posso preencher essa propriedade de uma tabela? O objetivo é evitar a edição de cada símbolo, um por um, para adicionar a descrição .
O ArcMap tem a capacidade de mostrar uma descrição estendida para cada item na lista de símbolos. Como posso preencher essa propriedade de uma tabela? O objetivo é evitar a edição de cada símbolo, um por um, para adicionar a descrição .
Respostas:
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
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.
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