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

9

ArcMap имеет возможность отображать расширенное описание для каждого элемента в списке символов. Как я могу заполнить это свойство из таблицы? Цель состоит в том, чтобы избежать необходимости редактировать каждый символ один за другим, чтобы добавить описание .

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

Мэтт Уилки
источник

Ответы:

7

Вместо того, чтобы пытаться использовать приложение ArcMap в одиночку, я привел ArcPy в картину.

Я только что протестировал и выполнил то, что вы описали, используя класс UniqueValuesSymbology (arcpy.mapping), который имеет доступное для записи свойство classDescription, которое может быть установлено в:

Список строк или чисел, представляющих описания для каждого уникального значения, которое может дополнительно отображаться в легенде документа карты. Эти значения доступны только в пользовательском интерфейсе ArcMap, если щелкнуть правой кнопкой мыши символ, отображаемый на вкладке Символы в диалоговом окне Свойства слоя, и выбрать Редактировать описание. Список classDescription должен иметь такое же количество элементов и располагаться в том же порядке, что и свойство classValues.

Код использует Курсор Поиска, чтобы прочитать таблицу поиска в список , а затем записать этот список в свойство classDescription класса символов слоя. Обратите внимание, что таблица поиска ДОЛЖНА иметь такое же количество строк и быть в том же порядке, что и значения уникальной классификации символов . Мой код должен быть улучшен, чтобы учесть, что это не так, но в моем тестовом случае было легко убедиться в этом порядке вручную.

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
PolyGeo
источник
Я собрал некоторый тестовый код, чтобы посмотреть, сработает ли он, и хотя ошибки не генерируются, обновленные описания не возвращаются на уровень. Я новичок в arcpy в картографии, так что, вероятно, я что-то не так сделал
Майкл Стимсон
это работает? У меня почти то же самое, за исключением того, что я использую MapDocument ("current") и RefreshActiveView () / RefreshTOC (), но ничего не обновляется.
Майкл Стимсон
1
@ MichaelMiles-Stimson Да - оно обновлено, как и предполагалось - я подозреваю, что вы пропустили то, что это не оглавление, которое показывает значения описания, а элемент разметки легенды. Вставьте один из них и выберите стиль элемента легенды, который отображает описания, и я думаю, станет ясно, что он работает.
PolyGeo
Спасибо @polygeo! Это именно так! Он делал все это время, я просто смотрел не в том месте.
Майкл Стимсон
Я решил проблему соответствия описаний и кодов поиска, см. Мой ответ.
Мэтт Уилки
1

Не могли бы вы классифицировать свои символы как «Уникальные значения, много полей» и выбрать одно поле для кода, а второе - для более подробного описания? Это должно маркировать каждый элемент строкой в ​​форме "[Field1], [Field2]"

Это работает с меньшими полями, я думаю, что это будет с более длинными строками, если нет ограничения, с которым я не знаком.

Единственная раздражающая часть заключается в том, что вам, возможно, придется пройти и удалить значение кода из начала значения метки, но это не будет худшей вещью, которая когда-либо случалась.

Kevin
источник
Интересная идея, которая может работать в некоторых ситуациях. Это не сработает, потому что таблица описания - это просто таблица, в которой нет геометрии. Можно было бы присоединиться к геометрии и описаниям, но меня не интересует эта дополнительная работа или удар по производительности для этого проекта.
Мэтт Уилки
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
Мэтт Уилки
источник