การตั้งค่าคำอธิบายสัญลักษณ์ของตำนานเค้าโครง ArcMap จากตาราง?


9

ArcMap มีความสามารถในการแสดงคำอธิบายเพิ่มเติมสำหรับแต่ละรายการในรายการสัญลักษณ์ ฉันจะเติมคุณสมบัตินั้นจากตารางได้อย่างไร เป้าหมายคือการหลีกเลี่ยงการแก้ไขแต่ละสัญลักษณ์หนึ่งโดยหนึ่งในการสั่งซื้อเพื่อเพิ่มคำอธิบาย

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


7

แทนที่จะลองใช้แอปพลิเคชั่น 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

ฉันรวบรวมรหัสทดสอบบางอย่างเพื่อดูว่าสิ่งนี้จะใช้ได้หรือไม่และแม้ว่าจะไม่มีข้อผิดพลาดเกิดขึ้นคำอธิบายที่อัปเดตจะไม่ทำให้เลเยอร์กลับมา ฉันใหม่กับ arcpy ในการทำแผนที่ดังนั้นอาจเป็นสิ่งที่ฉันทำผิด
Michael Stimson

มันทำงานอย่างไร ฉันเหมือนกันมากยกเว้นฉันใช้ MapDocument ("current") และ RefreshActiveView () / RefreshTOC () แต่ไม่มีการอัพเดทใด ๆ
Michael Stimson

1
@ MichaelMiles-Stimson ใช่ - อัปเดตตามที่ตั้งใจไว้ - ฉันสงสัยว่าสิ่งที่คุณพลาดคือไม่ใช่ TOC ซึ่งแสดงค่าคำอธิบาย แต่เป็นองค์ประกอบเลย์เอาต์ตำนาน แทรกหนึ่งในนั้นและเลือกรูปแบบรายการตำนานที่แสดงคำอธิบายและฉันคิดว่ามันชัดเจนว่าใช้งานได้
PolyGeo

ขอบคุณ @polygeo! นั่นคือมัน! มันกำลังทำอยู่ตลอดเวลาที่ฉันมองดูผิดที่
Michael Stimson

ฉันแก้ไขปัญหาในการทำให้คำอธิบายและรหัสการค้นหาตรงกันดูคำตอบของฉัน
matt wilkie

1

คุณสามารถจำแนกสัญลักษณ์ของคุณด้วย "ค่าที่ไม่ซ้ำหลายฟิลด์" และเลือกหนึ่งฟิลด์สำหรับรหัสและที่สองสำหรับคำอธิบายที่ยาวขึ้นได้หรือไม่? ที่ควรติดป้ายกำกับแต่ละรายการด้วยสตริงในแบบฟอร์ม "[Field1], [Field2]"

มันใช้งานได้กับเขตข้อมูลขนาดเล็กฉันคิดว่ามันจะมีเงื่อนไขที่ยาวกว่าเว้นแต่มีข้อ จำกัด ที่ฉันไม่คุ้นเคย

ส่วนที่น่ารำคาญเพียงอย่างเดียวคือคุณอาจต้องผ่านและลบค่ารหัสจากจุดเริ่มต้นของค่าป้ายกำกับ แต่นั่นไม่ใช่สิ่งที่แย่ที่สุดที่เคยเกิดขึ้น


แนวคิดที่น่าสนใจที่อาจใช้ได้ในบางสถานการณ์ มันจะไม่ทำงานที่นี่เพราะตารางคำอธิบายเป็นเพียงตารางจึงไม่มีรูปทรงเรขาคณิต หนึ่งสามารถเข้าร่วมเรขาคณิตและคำอธิบาย แต่ฉันไม่สนใจงานพิเศษหรือผลการดำเนินงานที่ยอดเยี่ยมสำหรับโครงการนี้
matt wilkie

1

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