คำตอบ:
แทนที่จะลองใช้แอปพลิเคชั่น ArcMap เพียงอย่างเดียวฉันได้นำ ArcPy มาไว้ในรูปภาพแล้ว
ฉันเพิ่งทดสอบและบรรลุสิ่งที่คุณอธิบายโดยใช้คลาสUniqueValuesSymbology (arcpy.mapping)ซึ่งมีคุณสมบัติclassDescriptions ที่เขียนได้ซึ่งสามารถตั้งค่าเป็น:
รายการสตริงหรือตัวเลขที่แสดงถึงคำอธิบายสำหรับแต่ละค่าที่ไม่ซ้ำกันซึ่งอาจปรากฏขึ้นในคำอธิบายแผนภูมิของเอกสารทางเลือก ค่าเหล่านี้สามารถเข้าถึงได้ในส่วนติดต่อผู้ใช้ ArcMap โดยคลิกขวาที่สัญลักษณ์ที่แสดงภายในแท็บ Symbology ในกล่องโต้ตอบคุณสมบัติเลเยอร์และเลือกแก้ไขคำอธิบาย รายการ classDescriptions ต้องมีองค์ประกอบจำนวนเท่ากันและจัดเรียงตามลำดับเดียวกับคุณสมบัติ classValues
รหัสใช้Search Cursorเพื่ออ่านตารางการค้นหาลงในรายการแล้วเขียนรายการนั้นไปยังคุณสมบัติ classDescriptions ของคลาส symbology ของเลเยอร์ โปรดทราบว่าตารางการค้นหาต้องมีหมายเลขเดียวกันของแถวและอยู่ในลำดับเดียวกับค่านิยมของการจัดหมวดหมู่สัญลักษณ์ที่ไม่ซ้ำกัน รหัสของฉันจะต้องได้รับการปรับปรุงสำหรับบัญชีที่ไม่ใช่กรณี แต่การทำให้แน่ใจว่าการสั่งซื้อด้วยตนเองนั้นง่ายในกรณีทดสอบของฉัน
import arcpy
vegDescList = []
vegCodes = arcpy.SearchCursor(r"C:\temp\test.gdb\LookupTable")
for vegCode in vegCodes:
vegDescList.append(vegCode.Description)
mxd = arcpy.mapping.MapDocument(r"C:\temp\test.mxd")
lyr = arcpy.mapping.ListLayers(mxd,"testFC")[0]
if lyr.symbologyType == "UNIQUE_VALUES":
lyr.symbology.classDescriptions = vegDescList
mxd.save()
del mxd
คุณสามารถจำแนกสัญลักษณ์ของคุณด้วย "ค่าที่ไม่ซ้ำหลายฟิลด์" และเลือกหนึ่งฟิลด์สำหรับรหัสและที่สองสำหรับคำอธิบายที่ยาวขึ้นได้หรือไม่? ที่ควรติดป้ายกำกับแต่ละรายการด้วยสตริงในแบบฟอร์ม "[Field1], [Field2]"
มันใช้งานได้กับเขตข้อมูลขนาดเล็กฉันคิดว่ามันจะมีเงื่อนไขที่ยาวกว่าเว้นแต่มีข้อ จำกัด ที่ฉันไม่คุ้นเคย
ส่วนที่น่ารำคาญเพียงอย่างเดียวคือคุณอาจต้องผ่านและลบค่ารหัสจากจุดเริ่มต้นของค่าป้ายกำกับ แต่นั่นไม่ใช่สิ่งที่แย่ที่สุดที่เคยเกิดขึ้น
ทำงานจากรหัสของ PolyGeoนี่คือสิ่งที่ฉันคิดขึ้นเพื่อแก้ไขปัญหาที่ต้องมีจำนวนรายการที่แน่นอนและการจับคู่คำสั่งเหมือนกันระหว่างค่าการค้นหาและคำอธิบาย สคริปต์การทำงานเต็มรูปแบบที่นี่
# name and path of the lookup table
lookup_table = r"..\default.gdb\vegMajorComm_Lookup"
# change these to match the relevant field names in the lookup table
code = 'VegCode'
description = 'Description'
##...snip...
# build the descriptions dictionary
descriptions = {}
rows = arcpy.SearchCursor(lookup_table)
for item in rows:
#print item.getValue(code), item.getValue(description)
descriptions[item.getValue(code)] = item.getValue(description)
# lyr.symbology requires the classValues and classDescriptions to have
# same number of rows and be in same order. So extract only matching
# elements from the description dictionary
desclist = []
if lyr.symbologyType == "UNIQUE_VALUES":
#extract matches
for symbol in lyr.symbology.classValues:
desclist.append(descriptions[symbol])
# assign the descriptions
lyr.symbology.classDescriptions = desclist
mxd.saveACopy(output_map)
del mxd