Définition des descriptions de symboles des légendes de disposition ArcMap à partir du tableau?

9

ArcMap a la possibilité d'afficher une description étendue de chaque élément de la liste des symboles. Comment puis-je remplir cette propriété à partir d'une table? Le but est d'éviter d'avoir à éditer chaque symbole un par un pour ajouter la description .

entrez la description de l'image ici

Matt Wilkie
la source

Réponses:

7

Plutôt que d'essayer d'utiliser l'application ArcMap seule, j'ai introduit ArcPy dans l'image.

Je viens de tester et de réaliser ce que vous avez décrit en utilisant la classe UniqueValuesSymbology (arcpy.mapping) qui a une propriété classDescriptions accessible en écriture qui peut être définie sur:

Une liste de chaînes ou de nombres qui représentent les descriptions de chaque valeur unique qui peut éventuellement apparaître dans la légende d'un document ArcMap. Ces valeurs sont uniquement accessibles dans l'interface utilisateur d'ArcMap en cliquant avec le bouton droit sur un symbole affiché dans l'onglet Symbologie de la boîte de dialogue Propriétés de la couche et en sélectionnant Modifier la description. La liste classDescriptions doit avoir le même nombre d'éléments et être organisée dans le même ordre que la propriété classValues.

Le code utilise un curseur de recherche pour lire la table de recherche dans une liste , puis écrit cette liste dans la propriété classDescriptions de la classe de symbologie de la couche. Notez que la table de recherche DOIT avoir le même nombre de lignes et être dans le même ordre que les valeurs de la classification de symbologie unique . Mon code devrait être amélioré pour tenir compte du fait que ce n'est pas le cas, mais s'assurer de cette commande manuellement était facile dans mon cas de 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
PolyGeo
la source
J'ai mis en place un code de test pour voir si cela fonctionnerait et bien qu'aucune erreur ne soit générée, les descriptions mises à jour ne reviennent pas à la couche. Je suis nouveau dans arcpy en cartographie, c'est probablement quelque chose que j'ai mal fait.
Michael Stimson
ça marche? J'ai à peu près la même chose sauf que j'utilise MapDocument ("current") et RefreshActiveView () / RefreshTOC () mais rien n'est mis à jour.
Michael Stimson
1
@ MichaelMiles-Stimson Oui - il a été mis à jour comme prévu - je soupçonne que ce que vous avez manqué, c'est que ce n'est pas la table des matières qui affiche les valeurs de description mais un élément de disposition de légende. Insérez-en un et choisissez un style d'élément de légende qui affiche des descriptions et je pense qu'il deviendra clair que cela fonctionne.
PolyGeo
Merci @polygeo! C'est exactement ça! Il le faisait tout au long, je regardais juste au mauvais endroit.
Michael Stimson
J'ai résolu le problème d'avoir à faire correspondre les descriptions et les codes de recherche, voir ma réponse.
matt wilkie
1

Pourriez-vous classer vos symboles avec "Valeurs uniques de nombreux champs" et choisir un champ pour le code et le second pour la description plus longue? Cela devrait étiqueter chaque élément avec une chaîne sous la forme "[Field1], [Field2]"

Cela fonctionne avec des champs plus petits, j'imagine que ce serait avec des chaînes plus longues, sauf s'il y a une limitation que je ne connais pas.

La seule partie ennuyeuse serait que vous devrez peut-être parcourir et supprimer la valeur de code depuis le début de la valeur de l'étiquette, mais ce ne serait pas la pire chose qui soit jamais arrivée.

Kevin
la source
Une idée intéressante qui pourrait fonctionner dans certaines situations. Cela ne fonctionnera pas ici cependant, car la table de description n'est qu'une table, il n'y a pas de géométrie. On pourrait joindre la géométrie et les descriptions, mais je ne suis pas intéressé par le travail supplémentaire ou les performances pour ce projet.
matt wilkie
1

En utilisant le code de PolyGeo , voici ce que j'ai trouvé pour contourner le problème d'avoir à avoir un nombre exact d'articles et une correspondance d'ordre identique entre les valeurs de recherche et la description. Le script de travail complet est ici .

# 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
la source