Gibt es eine Möglichkeit, die Anzahl der Ebenen-Features im Inhaltsverzeichnis anzuzeigen?

10

Ich verwende ArcGIS 10. Gibt es im Inhaltsverzeichnis (Inhaltsverzeichnis) von ArcMap eine Möglichkeit, dass der "Ebenenname" automatisch die Gesamtzahl der Features in jeder Ebene anzeigt?

Ich dachte, das Inhaltsverzeichnis würde ungefähr so ​​aussehen:

  • Straßen (27)
  • Streams (100)
  • Pakete (12)

Ich habe diese Option für Unique Value-Renderings gefunden , aber:

  1. Ich bin kein ArcObjects-Typ und
  2. Ich möchte nur mit dem Single Value Renderer arbeiten.

Die Registerkarte "Liste nach Auswahl" verfügt über diese Funktion, jedoch nur, wenn ausgewählte Funktionen vorhanden sind.

RyanKDalton
quelle
Möchten Sie dies für einen einzelnen Layer in Ihrer Karte tun (dessen Namen Sie haben) oder der standardmäßig auf alle Layer auf Ihrer Karte angewendet wird?
Chenderson
Alle Ebenen im Inhaltsverzeichnis, standardmäßig vorzuziehen und vorzugsweise aktualisiert, wenn sich die Anzahl der Ebenen ändert (z. B. wenn ein Feature hinzugefügt oder gelöscht wird).
RyanKDalton
2
Sie könnten dies wahrscheinlich mit einem Python-Add-In tun, das auf den Start / das Ende einer Bearbeitungssitzung wartet.
Paul
1
Ich denke, dass dies in ArcGIS 10.1 und 10.2 (aber nicht in 10.0) mit einem Python-Add-In (Erweiterung) möglich ist, das GetCount auf jeder Ebene ausführt und die Namenseigenschaft jeder Ebene aktualisiert, um diese in Klammern gesetzte Nummer bei jeder Aktualisierung einzuschließen. Wenn Sie eine ArcGIS-Idee für diese Option OOTB in ArcGIS Professional finden / einreichen, würde ich dafür stimmen.
PolyGeo
2
Ich habe dies mit einem Skript im mxd getan, also füge ich den Code in das Python-Fenster ein und führe ihn aus, um einen Ausdruck jeder Ebene mit Feature-Anzahl zu erhalten. Wie @PolyGeo sagt, könnte dies in ein Python-Add-In integriert werden, wenn dies automatisch geschehen soll (wie erwähnt bei 10.1).
Cindy Jayakumar

Antworten:

7

Wie @Paul & @PolyGeo vorgeschlagen haben, halte ich es für am sinnvollsten, dies zu einem Python-Add-In zu machen, und ich werde diese Idee später weiterverfolgen.

In der Zwischenzeit habe ich Code zusammengestellt, der den Inhaltsverzeichnisnamen von benutzerdefinierten Ebenen in einer MXD mit Funktionsanzahl hinzufügt / aktualisiert. Für meine Zwecke habe ich dies gerade als GP-Tool erstellt, das einzelne Layer über eine mehrwertige Eingabe akzeptiert, die "Layer" im Skript-Tool akzeptiert. Dadurch kann ich mehrere Ebenen "on-demand" aktualisieren, indem ich nur die Funktionsanzahl dieser interessierenden Ebenen aktualisiere.

Ich habe mir keine Möglichkeit ausgedacht, dies automatisch ausführen zu lassen, aber beim Testen alter MXDs ist dies möglicherweise nicht einmal wünschenswert. Wenn Sie viele Ebenen mit vielen Funktionen haben, kann dies ein langsamer Prozess sein.

Eingabefeld

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
quelle
GetCount ist schneller als ein Cursor. Warum haben Sie die gegenteilige Schlussfolgerung gezogen?
blah238
Meine ersten Tests mit kleinen Shapefiles zeigten, dass es schneller war. Nach dem Testen auf größeren RDBMS-Ebenen war GetCount jedoch schneller. Ich habe den obigen Code aktualisiert.
RyanKDalton
Nettes kleines Tool, sollten Sie das in der ESRI-Code-Galerie teilen?
Hornbydd