Встановлення описів символів легенд макета ArcMap з таблиці?


9

ArcMap має можливість показувати розширений опис кожного елемента в списку символів. Як я можу заповнити цю власність із таблиці? Мета - уникнути необхідності редагування кожного символу по одному, щоб додати опис .

введіть тут опис зображення

Відповіді:


7

Замість того, щоб спробувати використовувати програму 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

Я зібрав декілька тестових кодів, щоб побачити, чи це спрацює, і хоча помилок не створюється, оновлені описи не повертають його до шару. Я новачок в архпі в картографуванні, тому, мабуть, я щось зробив неправильно.
Майкл Стімсон

це працює? У мене стільки ж, за винятком того, що я використовую MapDocument ("поточний") і RefreshActiveView () / RefreshTOC (), але нічого не оновлюється.
Майкл Стімсон

1
@ MichaelMiles-Stimson Так - оновлено за призначенням - я підозрюю, що те, що ви пропустили, це те, що не TOC показує значення Опис, а Елемент макета легенди. Вставте один із них і оберіть Стиль предмета легенди, який відображає Описи, і я думаю, що стане зрозуміло, що він справді працює.
PolyGeo

Дякую @polygeo! Це саме воно! Це робили це весь час, я просто дивився в неправильному місці.
Майкл Стімсон

Я вирішив проблему, щоб зрівняти описи та коди пошуку, дивіться мою відповідь.
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.