ArcMap ma możliwość wyświetlania rozszerzonego opisu każdego elementu na liście symboli. Jak wypełnić tę właściwość ze stołu? Celem jest uniknięcie konieczności edycji każdego symbolu jeden po drugim, aby dodać opis .
ArcMap ma możliwość wyświetlania rozszerzonego opisu każdego elementu na liście symboli. Jak wypełnić tę właściwość ze stołu? Celem jest uniknięcie konieczności edycji każdego symbolu jeden po drugim, aby dodać opis .
Odpowiedzi:
Zamiast próbować używać samej aplikacji ArcMap, umieściłem ArcPy na zdjęciu.
Właśnie przetestowałem i osiągnąłem to, co opisałeś za pomocą klasy UniqueValuesSymbology (arcpy.mapping), która ma zapisywalną właściwość classDescriptions, którą można ustawić na:
Lista ciągów lub liczb reprezentujących opisy każdej unikalnej wartości, która opcjonalnie może pojawić się w legendzie dokumentu mapy. Te wartości są dostępne tylko w interfejsie użytkownika ArcMap, klikając prawym przyciskiem myszy symbol wyświetlany na karcie Symbology w oknie dialogowym Właściwości warstwy i wybierając Edytuj opis. Lista classDescriptions musi mieć tę samą liczbę elementów i ułożoną w tej samej kolejności co właściwość classValues.
Kod korzysta z kursora wyszukiwania, aby wczytać tabelę wyszukiwania do listy , a następnie zapisuje tę listę we właściwości classDescriptions klasy symbology warstwy. Zauważ, że tablica przeglądowa MUSI mieć taką samą liczbę wierszy i być w tej samej kolejności, co wartości unikalnej klasyfikacji symboli . Mój kod musiałby zostać ulepszony, aby uwzględnić to, że tak nie jest, ale upewnienie się, że zamówienie to było łatwe w moim przypadku testowym.
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
Czy możesz sklasyfikować swoje symbole za pomocą „Unikatowych wartości, wielu pól” i wybrać jedno pole dla kodu, a drugie dla dłuższego opisu? Powinno to oznaczać każdy element ciągiem w postaci „[Field1], [Field2]”
Działa z mniejszymi polami, wyobrażam sobie, że działałoby z dłuższymi łańcuchami, chyba że istnieją ograniczenia, których nie znam.
Jedyną irytującą częścią byłoby to, że będziesz musiał przejść i usunąć wartość kodu z początku wartości etykiety, ale nie byłoby to najgorsze, co się kiedykolwiek wydarzyło.
Pracując na podstawie kodu PolyGeo , oto, co wymyśliłem, aby obejść problem związany z koniecznością posiadania dokładnej liczby elementów i identycznej kolejności dopasowania między wartościami wyszukiwania a opisem. Pełny działający skrypt jest tutaj .
# 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