Impostare le descrizioni dei simboli delle legende del layout ArcMap dalla tabella?


Risposte:


7

Invece di provare a utilizzare l'applicazione ArcMap da solo, ho portato ArcPy in figura.

Ho appena testato e ottenuto quello che hai descritto usando la classe UniqueValuesSymbology (arcpy.mapping) che ha una proprietà classDescriptions scrivibile che può essere impostata su:

Un elenco di stringhe o numeri che rappresentano le descrizioni per ciascun valore univoco che può facoltativamente apparire nella legenda di un documento della mappa. Questi valori sono accessibili solo nell'interfaccia utente di ArcMap facendo clic con il pulsante destro del mouse su un simbolo visualizzato nella scheda Simbologia nella finestra di dialogo Proprietà livello e selezionando Modifica descrizione. L'elenco classDescriptions deve avere lo stesso numero di elementi e disposti nello stesso ordine della proprietà classValues.

Il codice utilizza un cursore di ricerca per leggere la tabella di ricerca in un elenco , quindi scrive tale elenco nella proprietà classDescriptions della classe di simbologia del livello. Si noti che la tabella di ricerca DEVE avere lo stesso numero di righe ed essere nello stesso ordine dei valori della classificazione simbologia univoca . Il mio codice avrebbe bisogno di essere migliorato per tener conto del fatto che non era il caso, ma assicurarsi che quell'ordine manualmente fosse facile nel mio caso di test.

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

Ho messo insieme un po 'di codice di prova per vedere se funzionava e sebbene non vengano generati errori, le descrizioni aggiornate non tornano al livello. Sono nuovo di arcpy nella mappatura, quindi è probabilmente qualcosa che ho fatto di sbagliato.
Michael Stimson,

funziona? Ho più o meno la stessa cosa tranne che sto usando MapDocument ("current") e RefreshActiveView () / RefreshTOC () ma nulla viene aggiornato.
Michael Stimson,

1
@ MichaelMiles-Stimson Sì - aggiornato come previsto - Ho il sospetto che ciò che ti sei perso è che non è il sommario che mostra i valori della descrizione ma un elemento Layout legenda. Inserisci uno di questi e scegli uno stile di oggetto legenda che visualizza le descrizioni e penso che diventerà chiaro che funziona.
PolyGeo

Grazie @polygeo! Questo è esattamente! Lo facevo da sempre, stavo solo cercando nel posto sbagliato.
Michael Stimson,

Ho risolto il problema di dover abbinare descrizioni e codici di ricerca, vedi la mia risposta.
Matt Wilkie,

1

Potresti classificare i tuoi simboli con "Valori univoci molti campi" e scegliere un campo per il codice e il secondo per la descrizione più lunga? Ciò dovrebbe etichettare ogni elemento con una stringa nel formato "[Field1], [Field2]"

Funziona con campi più piccoli, immagino che lo farebbe con stringhe più lunghe, a meno che non ci sia una limitazione che non conosco.

L'unica parte fastidiosa sarebbe che potresti dover passare attraverso ed eliminare il valore del codice dall'inizio del valore dell'etichetta, ma non sarebbe la cosa peggiore che sia mai accaduta.


Un'idea interessante che potrebbe funzionare in alcune situazioni. Non funzionerà qui perché la tabella di descrizione è solo una tabella, non c'è geometria. Si potrebbe unire la geometria e le descrizioni, ma non sono interessato a quel lavoro extra o alle prestazioni di questo progetto.
matt wilkie,

1

Lavorando dal codice PolyGeo , ecco cosa mi è venuto in mente per ovviare al problema di dover avere un numero esatto di articoli e una corrispondenza identica tra i valori di ricerca e la descrizione. L'intero script funzionante è qui .

# 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.