有没有办法在TOC中显示图层要素计数?


10

我正在使用ArcGIS10。在ArcMap的目录(TOC)中,是否可以让“图层名称”自动显示每个图层中要素总数的计数?

我以为TOC看起来像这样:

  • 道路(27)
  • 溪流(100)
  • 包裹(12)

为“唯一值”渲染器找到了此选项,但是:

  1. 我不是ArcObjects的人,并且
  2. 我只想使用单一值渲染器。

“按选择列出”选项卡具有此功能,但仅当存在选定功能时。


您是要对地图中的单个图层(具有名称)执行此操作,还是默认将其应用于地图上的所有图层?
亨德森

默认情况下,TOC中的所有图层(默认情况下)都是优选的,并且在图层计数发生更改时(例如,添加或删除要素时)最好进行更新。
RyanKDalton

2
您可能可以通过侦听编辑会话开始/结束的Python插件来执行此操作。
2013年

1
我认为它可以在ArcGIS 10.1和10.2(但不是10.0)中使用Python加载项(扩展名)来实现,该插件在每一层上运行GetCount并更新每一层的name属性,以便在每次刷新时都包含该带括号的数字。如果您在ArcGIS Professional中找到/提交了一个ArcGIS Idea使其具有OOTB选项,我将投票给它。
PolyGeo

2
我已经使用mxd中的脚本完成了此操作,因此我将代码弹出到python窗口中并运行它以获取具有特征计数的每个图层的打印。正如@PolyGeo所说,如果您希望它自动发生(如前所述,为10.1),则可以将其合并到Python加载项中。
Cindy Jayakumar 2013年

Answers:


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

GetCount将比光标快。是什么使您得出相反的结论?
blah238 2013年

我对小型shapefile的初步测试表明它更快。但是,在较大的RDBMS层上进行测试后,您是正确的,GetCount更快。我已经更新了上面的代码。
RyanKDalton

不错的小工具,您应该在ESRI代码库上分享它吗?
Hornbydd 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.