ArcMap має можливість показувати розширений опис кожного елемента в списку символів. Як я можу заповнити цю власність із таблиці? Мета - уникнути необхідності редагування кожного символу по одному, щоб додати опис .
ArcMap має можливість показувати розширений опис кожного елемента в списку символів. Як я можу заповнити цю власність із таблиці? Мета - уникнути необхідності редагування кожного символу по одному, щоб додати опис .
Відповіді:
Замість того, щоб спробувати використовувати програму ArcMap поодинці, я вивів ArcPy на знімок.
Я лише перевірив і досягнув того, що ви описали, використовуючи клас UniqueValuesSymbology (arcpy.mapping), який має властивість для запису classDescriptions, для яких можна встановити:
Список рядків чи чисел, що представляють описи кожного унікального значення, яке необов'язково може відображатися в легенді документа про карту. Ці значення доступні лише в користувальницькому інтерфейсі ArcMap лише клацанням правою кнопкою миші на символі, відображеному на вкладці «Символогія» у діалоговому вікні «Властивості шару» та вибору «Редагувати опис». Список classDescriptions повинен містити таку ж кількість елементів і розташований у тому ж порядку, що і властивість classValues.
Код використовує курсор пошуку для зчитування таблиці пошуку в список , а потім записує цей список у властивість classDescriptions класу символіки шару. Зауважте, що таблиця пошуку ОБОВ'ЯЗКОВО має мати однакову кількість рядків і бути в тому ж порядку, що і значення унікальної класифікації символіки . Мій код потрібно було б покращити, щоб врахувати, що це не так, але переконатися в тому, що це замовлення вручну, було просто в моєму тестовому випадку.
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