Festlegen von Symbolbeschreibungen für ArcMap-Layoutlegenden aus der Tabelle?

Antworten:

7

Anstatt zu versuchen, die ArcMap-Anwendung allein zu verwenden, habe ich ArcPy ins Bild gebracht.

Ich habe gerade getestet und erreicht, was Sie beschrieben haben, indem ich die UniqueValuesSymbology- Klasse (arcpy.mapping) verwendet habe , die über eine beschreibbare classDescriptions- Eigenschaft verfügt, die wie folgt festgelegt werden kann:

Eine Liste von Zeichenfolgen oder Zahlen, die die Beschreibungen für jeden eindeutigen Wert darstellen, der optional in der Legende eines Kartendokuments angezeigt werden kann. Auf diese Werte kann nur in der ArcMap-Benutzeroberfläche zugegriffen werden, indem Sie mit der rechten Maustaste auf ein Symbol klicken, das auf der Registerkarte Symbologie im Dialogfeld Ebeneneigenschaften angezeigt wird, und Beschreibung bearbeiten auswählen. Die classDescriptions-Liste muss dieselbe Anzahl von Elementen enthalten und in derselben Reihenfolge wie die classValues-Eigenschaft angeordnet sein.

Der Code verwendet einen Suchcursor , um die Nachschlagetabelle in eine Liste einzulesen , und schreibt diese Liste dann in die classDescriptions-Eigenschaft der Symbologieklasse des Layers. Beachten Sie, dass die Nachschlagetabelle dieselbe Anzahl von Zeilen und dieselbe Reihenfolge wie die Werte der eindeutigen Symbologieklassifizierung haben muss . Mein Code müsste verbessert werden, um zu berücksichtigen, dass dies nicht der Fall ist, aber es war in meinem Testfall einfach, diese Reihenfolge manuell sicherzustellen.

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
PolyGeo
quelle
Ich habe einen Testcode zusammengestellt, um zu sehen, ob dies funktionieren würde, und obwohl keine Fehler generiert werden, schaffen es die aktualisierten Beschreibungen nicht zurück zur Ebene. Ich bin neu in Arcpy im Mapping, also habe ich es wahrscheinlich falsch gemacht.
Michael Stimson
funktioniert es? Ich habe fast das gleiche, außer dass ich MapDocument ("aktuell") und RefreshActiveView () / RefreshTOC () verwende, aber nichts wird aktualisiert.
Michael Stimson
1
@ MichaelMiles-Stimson Ja - es wurde wie beabsichtigt aktualisiert - Ich vermute, dass Sie es verpasst haben, dass nicht das Inhaltsverzeichnis die Beschreibungswerte anzeigt, sondern ein Legendenlayoutelement. Fügen Sie eine davon ein und wählen Sie einen Legendenelementstil, in dem Beschreibungen angezeigt werden. Ich denke, es wird klar, dass dies funktioniert.
PolyGeo
Vielen Dank an @polygeo! Das ist genau das! Es war die ganze Zeit so, dass ich nur am falschen Ort gesucht habe.
Michael Stimson
Ich habe das Problem gelöst, dass Beschreibungen und Suchcodes übereinstimmen müssen, siehe meine Antwort.
Matt Wilkie
1

Könnten Sie Ihre Symbole mit "Eindeutige Werte, viele Felder" klassifizieren und ein Feld für den Code und das zweite für die längere Beschreibung auswählen? Das sollte jedes Element mit einer Zeichenfolge in der Form "[Feld1], [Feld2]" kennzeichnen.

Es funktioniert mit kleineren Feldern, ich stelle mir vor, es würde mit längeren Zeichenfolgen funktionieren, es sei denn, es gibt eine Einschränkung, mit der ich nicht vertraut bin.

Der einzige ärgerliche Teil wäre, dass Sie möglicherweise den Codewert vom Anfang des Etikettenwerts löschen müssen, aber das wäre nicht das Schlimmste, was jemals passiert ist.

Kevin
quelle
Eine interessante Idee, die in manchen Situationen funktionieren könnte. Hier funktioniert es jedoch nicht, da die Beschreibungstabelle nur eine Tabelle ist und keine Geometrie vorhanden ist. Man könnte sich der Geometrie und den Beschreibungen anschließen, aber ich bin nicht an diesem zusätzlichen Arbeits- oder Leistungshit für dieses Projekt interessiert.
Matt Wilkie
1

Ausgehend von PolyGeos Code habe ich mir Folgendes ausgedacht , um das Problem zu umgehen , dass eine genaue Anzahl von Elementen und eine identische Reihenfolge zwischen den Suchwerten und der Beschreibung übereinstimmen müssen. Das vollständige Arbeitsskript finden Sie hier .

# 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
matt wilkie
quelle