Existe-t-il un moyen d'afficher le nombre d'entités de couches dans la table des matières?

10

J'utilise ArcGIS 10. Dans la table des matières d'ArcMap (TOC), existe-t-il un moyen pour que le "Nom de la couche" affiche automatiquement un décompte du nombre total d'entités dans chaque couche?

Je pensais que la table des matières ressemblerait à ceci:

  • Routes (27)
  • Flux (100)
  • Colis (12)

J'ai trouvé cette option pour les rendus de valeur unique , mais:

  1. Je ne suis pas un gars d'ArcObjects, et
  2. Je veux travailler uniquement avec le rendu Single Value .

L'onglet "Lister par sélection" possède cette fonction, mais uniquement lorsqu'il existe des entités sélectionnées.

RyanKDalton
la source
Envisagez-vous de le faire pour une seule couche de votre carte (dont vous avez le nom), ou de l'appliquer à toutes les couches de votre carte par défaut?
CHenderson
Toutes les couches de la table des matières, préférables par défaut, et de préférence mises à jour lorsque le nombre de couches change (par exemple, lorsqu'une entité est ajoutée ou supprimée).
RyanKDalton
2
Vous pourriez probablement le faire avec un complément Python qui écoute le début / la fin d'une session d'édition.
Paul
1
Je pense que cela peut être faisable dans ArcGIS 10.1 et 10.2 (mais pas 10.0) en utilisant un complément Python (extension) qui exécute GetCount sur chaque couche et met à jour la propriété de nom de chaque couche pour inclure ce numéro entre crochets à chaque rafraîchissement. Si vous trouvez / soumettez une idée ArcGIS pour avoir cette option OOTB dans ArcGIS Professional, je voterais pour.
PolyGeo
2
J'ai fait cela en utilisant un script dans le mxd, donc j'affiche le code dans la fenêtre python et l'exécute pour obtenir une impression de chaque couche avec le nombre de fonctionnalités. Comme le dit @PolyGeo, cela pourrait être incorporé dans un complément Python si vous voulez que cela se produise automatiquement (à la 10.1 comme mentionné).
Cindy Jayakumar

Réponses:

7

Comme l'a suggéré @Paul & @PolyGeo, je pense qu'essayer d'en faire un complément Python est le plus logique, et je poursuivrai cette idée plus tard.

En attendant, j'ai rassemblé du code qui ajoutera / mettra à jour le nom de la table des matières des couches définies par l'utilisateur dans un MXD avec le nombre de fonctionnalités. Pour mes besoins, je viens de le créer comme un outil GP qui accepterait des couches individuelles via une entrée à valeurs multiples qui accepte les "couches" dans l'outil de script. Cela me permet de mettre à jour plusieurs couches "à la demande", en mettant simplement à jour le nombre de fonctionnalités de ces couches d'intérêt.

Je n'ai pas trouvé de moyen pour que cela s'exécute automatiquement, mais en faisant des tests sur d'anciens MXD, cela peut même ne pas être souhaitable. Si vous avez beaucoup de couches avec beaucoup de fonctionnalités, cela pourrait être un processus lent.

Zone de saisie

import arcpy

LayerInput = arcpy.GetParameterAsText(0)

mxd = arcpy.mapping.MapDocument("CURRENT")
for lyr in arcpy.mapping.ListLayers(mxd):

    #Skip over group layers, as they have no values to count
    if lyr.isGroupLayer:
        continue

    #Determine basename of the layer, without the feature count
    name = str(lyr.name)

    #Determine if the layer is in the user-defined list
    if name not in LayerInput:
        continue

    #Determine if the layer name already includes a COUNT
    if "[" in name and "]" in name:
        lpos = name.find("[")
        basename = name[:lpos-1]
    else:
        basename = name
    print "    Updating feature count in TOC name for layer: " + str(basename)
    arcpy.AddMessage("    Updating feature count in TOC name for layer: " + str(basename) )

    # In 10.1, you may be able to use arcpy.da.SearchCursor to increase the speed.
    #http://gis.stackexchange.com/questions/30140/fastest-way-to-count-the-number-of-features-in-a-feature-class
    #fcount = 0
    #cursor = arcpy.SearchCursor(lyr)
    #for row in cursor:
    #    fcount += 1
    #del cursor

    #Get the feature count
    fcount = int(arcpy.GetCount_management(lyr).getOutput(0))

    #Update the lyr.name property
    lyr.name = basename + " [n=" + str(fcount) + "]"
    del fcount

arcpy.RefreshTOC()

#Garbage collection
del mxd
RyanKDalton
la source
GetCount sera plus rapide qu'un curseur. Qu'est-ce qui vous a fait tirer la conclusion inverse?
blah238
Mes premiers tests de petits fichiers de formes ont montré que c'était plus rapide. cependant, après avoir testé sur des couches RDBMS plus grandes, vous avez raison, GetCount était plus rapide. J'ai mis à jour le code ci-dessus.
RyanKDalton
Joli petit outil, tu devrais le partager sur la galerie de code ESRI?
Hornbydd