Задать символьные описания легенды макета ArcMap из таблицы?
9
ArcMap имеет возможность отображать расширенное описание для каждого элемента в списке символов. Как я могу заполнить это свойство из таблицы? Цель состоит в том, чтобы избежать необходимости редактировать каждый символ один за другим, чтобы добавить описание .
Вместо того, чтобы пытаться использовать приложение ArcMap в одиночку, я привел ArcPy в картину.
Я только что протестировал и выполнил то, что вы описали, используя класс UniqueValuesSymbology (arcpy.mapping), который имеет доступное для записи свойство classDescription, которое может быть установлено в:
Список строк или чисел, представляющих описания для каждого уникального значения, которое может дополнительно отображаться в легенде документа карты. Эти значения доступны только в пользовательском интерфейсе ArcMap, если щелкнуть правой кнопкой мыши символ, отображаемый на вкладке Символы в диалоговом окне Свойства слоя, и выбрать Редактировать описание. Список classDescription должен иметь такое же количество элементов и располагаться в том же порядке, что и свойство classValues.
Код использует Курсор Поиска, чтобы прочитать таблицу поиска в список , а затем записать этот список в свойство classDescription класса символов слоя. Обратите внимание, что таблица поиска ДОЛЖНА иметь такое же количество строк и быть в том же порядке, что и значения уникальной классификации символов . Мой код должен быть улучшен, чтобы учесть, что это не так, но в моем тестовом случае было легко убедиться в этом порядке вручную.
Я собрал некоторый тестовый код, чтобы посмотреть, сработает ли он, и хотя ошибки не генерируются, обновленные описания не возвращаются на уровень. Я новичок в arcpy в картографии, так что, вероятно, я что-то не так сделал
Майкл Стимсон
это работает? У меня почти то же самое, за исключением того, что я использую MapDocument ("current") и RefreshActiveView () / RefreshTOC (), но ничего не обновляется.
Майкл Стимсон
1
@ MichaelMiles-Stimson Да - оно обновлено, как и предполагалось - я подозреваю, что вы пропустили то, что это не оглавление, которое показывает значения описания, а элемент разметки легенды. Вставьте один из них и выберите стиль элемента легенды, который отображает описания, и я думаю, станет ясно, что он работает.
PolyGeo
Спасибо @polygeo! Это именно так! Он делал все это время, я просто смотрел не в том месте.
Майкл Стимсон
Я решил проблему соответствия описаний и кодов поиска, см. Мой ответ.
Мэтт Уилки
1
Не могли бы вы классифицировать свои символы как «Уникальные значения, много полей» и выбрать одно поле для кода, а второе - для более подробного описания? Это должно маркировать каждый элемент строкой в форме "[Field1], [Field2]"
Это работает с меньшими полями, я думаю, что это будет с более длинными строками, если нет ограничения, с которым я не знаком.
Единственная раздражающая часть заключается в том, что вам, возможно, придется пройти и удалить значение кода из начала значения метки, но это не будет худшей вещью, которая когда-либо случалась.
Интересная идея, которая может работать в некоторых ситуациях. Это не сработает, потому что таблица описания - это просто таблица, в которой нет геометрии. Можно было бы присоединиться к геометрии и описаниям, но меня не интересует эта дополнительная работа или удар по производительности для этого проекта.
Мэтт Уилки
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 matchesfor symbol in lyr.symbology.classValues:
desclist.append(descriptions[symbol])# assign the descriptions
lyr.symbology.classDescriptions = desclist
mxd.saveACopy(output_map)del mxd
Не могли бы вы классифицировать свои символы как «Уникальные значения, много полей» и выбрать одно поле для кода, а второе - для более подробного описания? Это должно маркировать каждый элемент строкой в форме "[Field1], [Field2]"
Это работает с меньшими полями, я думаю, что это будет с более длинными строками, если нет ограничения, с которым я не знаком.
Единственная раздражающая часть заключается в том, что вам, возможно, придется пройти и удалить значение кода из начала значения метки, но это не будет худшей вещью, которая когда-либо случалась.
источник
Работая на основе кода PolyGeo , вот что я придумал, чтобы обойти проблему наличия точного количества элементов и одинакового порядка соответствия между значениями поиска и описанием. Полный рабочий скрипт здесь .
источник