Есть ли способ показать количество элементов слоев в оглавлении?

10

Я использую ArcGIS 10. В таблице содержания ArcMap (TOC) есть ли способ, чтобы «Имя слоя» автоматически показывало общее количество объектов в каждом слое?

Я думал, что оглавление будет выглядеть примерно так:

  • Дороги (27)
  • Потоки (100)
  • Посылки (12)

Я нашел эту опцию для рендеров с уникальным значением , но:

  1. Я не парень ArcObjects, и
  2. Я хочу работать только с рендерером Single Value .

Вкладка «Список по выбору» имеет такую ​​возможность, но только при наличии выбранных функций.

RyanKDalton
источник
Вы хотите сделать это для одного слоя на вашей карте (у которого вы его называете) или он применяется по умолчанию ко всем слоям на вашей карте?
Чендерсон
Все слои в оглавлении предпочтительнее по умолчанию и предпочтительно обновляются при изменении количества слоев (например, при добавлении или удалении объекта).
RyanKDalton
2
Возможно, вы могли бы сделать это с помощью надстройки Python, которая прослушивает начало / конец сеанса редактирования.
Пол
1
Я думаю, что это может быть выполнимо в ArcGIS 10.1 и 10.2 (но не 10.0) с использованием Python Add-In (Extension), который запускает GetCount на каждом слое и обновляет свойство name каждого слоя, чтобы включать это число в скобках при каждом обновлении. Если вы найдете / отправили ArcGIS Idea, чтобы иметь эту опцию OOTB в ArcGIS Professional, я бы проголосовал за нее.
PolyGeo
2
Я сделал это, используя скрипт в mxd, поэтому я вставил код в окно python и запустил его, чтобы получить отпечаток каждого слоя с количеством объектов. Как говорит @PolyGeo, это может быть включено в Python Add-In, если вы хотите, чтобы это происходило автоматически (в 10.1, как упоминалось).
Синди Джаякумар

Ответы:

7

Как предложили @Paul & @PolyGeo, я думаю, что попытка сделать эту надстройку Python имеет больше смысла, и я буду реализовывать эту идею позже.

Тем временем я собрал код, который будет добавлять / обновлять имя оглавления определяемых пользователем слоев в MXD с количеством функций. Для моих целей я просто создал это как инструмент GP, который будет принимать отдельные слои через многозначный ввод, который принимает «Слои» в инструменте сценария. Это позволяет мне обновлять несколько слоев «по требованию», просто обновляя количество функций этих слоев, представляющих интерес.

Я не придумал, как запустить этот процесс автоматически, однако при тестировании старых MXD это может оказаться нежелательным. Если у вас много слоев с множеством функций, это может быть медленным процессом.

Поле ввода

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
источник
GetCount будет быстрее, чем курсор. Что заставило вас сделать противоположный вывод?
blah238
Мое первоначальное тестирование небольших шейп-файлов показало, что это было быстрее. однако, после тестирования на больших слоях RDBMS, вы правы, GetCount был быстрее. Я обновил код выше.
RyanKDalton
Хороший маленький инструмент, вы должны поделиться этим в галерее кода ESRI?
Хорнбидд