มีวิธีในการแสดงจำนวนเลเยอร์ใน TOC หรือไม่


10

ฉันกำลังใช้ ArcGIS 10 ในสารบัญ (TOC) ของ ArcMap มีวิธีให้ "ชื่อเลเยอร์" แสดงจำนวนคุณลักษณะทั้งหมดในแต่ละเลเยอร์โดยอัตโนมัติหรือไม่

ฉันคิดว่า TOC จะมีหน้าตาแบบนี้:

  • ถนน (27)
  • สตรีม (100)
  • พัสดุภัณฑ์ (12)

ฉันพบตัวเลือกนี้สำหรับการสร้างมูลค่าที่ไม่ซ้ำแต่:

  1. ฉันไม่ใช่คน ArcObjects และ
  2. ฉันต้องการทำงานร่วมกับตัวแสดงผลแบบค่าเดียวเท่านั้น

การเรียงลำดับแท็บ "รายการตามการเลือก" ของมีความสามารถนี้ แต่เฉพาะเมื่อมีคุณสมบัติที่เลือก


คุณต้องการทำเช่นนี้สำหรับเลเยอร์เดียวในแผนที่ของคุณ (ที่คุณมีชื่อ) หรือมีการนำไปใช้กับเลเยอร์ทั้งหมดบนแผนที่โดยค่าเริ่มต้นหรือไม่
CHenderson

เลเยอร์ทั้งหมดใน TOC เป็นที่นิยมโดยค่าเริ่มต้นและอัปเดตให้ดียิ่งขึ้นเมื่อจำนวนของเลเยอร์เปลี่ยนไป (ตัวอย่างเช่นเมื่อมีการเพิ่มหรือลบสถานที่)
RyanKDalton

2
คุณสามารถทำได้ด้วยการเพิ่ม Python ซึ่งฟังเพื่อเริ่มต้น / สิ้นสุดเซสชันการแก้ไข
พอล

1
ฉันคิดว่ามันอาจเป็นไปได้ใน ArcGIS 10.1 และ 10.2 (แต่ไม่ใช่ 10.0) โดยใช้ Python Add-In (ส่วนขยาย) ที่เรียกใช้ GetCount ในแต่ละชั้นและอัปเดตคุณสมบัติชื่อของแต่ละชั้นเพื่อรวมหมายเลขวงเล็บในการรีเฟรชแต่ละครั้ง หากคุณค้นหา / ส่งแนวคิด ArcGIS เพื่อให้มีตัวเลือก OOTB ใน ArcGIS Professional ฉันจะลงคะแนนให้
PolyGeo

2
ฉันทำสิ่งนี้โดยใช้สคริปต์ใน mxd ดังนั้นฉันจึงป๊อปโค้ดลงในหน้าต่างหลามและเรียกใช้มันเพื่อรับการพิมพ์ของแต่ละเลเยอร์ที่มีการนับจำนวนคุณสมบัติ ดังที่ @PolyGeo บอกว่าอาจรวมอยู่ใน Python Add-In ได้หากคุณต้องการให้มันเกิดขึ้นโดยอัตโนมัติ (ที่ 10.1 ตามที่กล่าวไว้)
Cindy Jayakumar

คำตอบ:


7

ตามที่ @Paul & @PolyGeo แนะนำฉันคิดว่าการพยายามทำให้เป็น Python Add-in นี้สมเหตุสมผลที่สุดและฉันจะติดตามความคิดนั้นในภายหลัง

ในระหว่างนี้ฉันรวบรวมรหัสที่จะเพิ่ม / อัปเดตชื่อ TOC ของเลเยอร์ที่ผู้ใช้กำหนดใน MXD ที่มีการนับคุณสมบัติ เพื่อจุดประสงค์ของฉันฉันเพิ่งสร้างสิ่งนี้เป็นเครื่องมือ GP ที่จะยอมรับแต่ละเลเยอร์ผ่านอินพุตหลายค่าที่ยอมรับ "เลเยอร์" ในเครื่องมือสคริปต์ นั่นทำให้ฉันสามารถอัปเดต "ตามความต้องการ" หลายเลเยอร์เพียงแค่อัปเดตจำนวนคุณสมบัติของเลเยอร์ที่น่าสนใจเหล่านั้น

ฉันไม่ได้คิดวิธีที่จะทำให้การทดสอบนี้เป็นไปโดยอัตโนมัติอย่างไรก็ตามในการทำการทดสอบ MXD เก่าบางอย่างซึ่งอาจไม่เป็นที่ต้องการ หากคุณมีเลเยอร์จำนวนมากที่มีคุณสมบัติมากมายอาจเป็นกระบวนการที่ช้า

InputBox

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

การทดสอบไฟล์รูปร่างขนาดเล็กครั้งแรกของฉันแสดงว่าเร็วขึ้น อย่างไรก็ตามหลังจากการทดสอบเลเยอร์ RDBMS ที่มีขนาดใหญ่ขึ้นคุณจะถูกต้อง GetCount เร็วขึ้น ฉันได้อัปเดตโค้ดด้านบนแล้ว
RyanKDalton

เครื่องมือเล็ก ๆ น้อย ๆ ที่ดีคุณควรแบ่งปันสิ่งนั้นในคลังรหัส ESRI หรือไม่
Hornbydd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.