Ustawianie opisów symboli legend ArcMap z tabeli?


Odpowiedzi:


7

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

Złożyłem trochę kodu testowego, aby sprawdzić, czy to zadziała i chociaż nie są generowane błędy, zaktualizowane opisy nie wracają do warstwy. Jestem nowy w tworzeniu map, więc prawdopodobnie zrobiłem coś źle.
Michael Stimson

Czy to działa? Mam prawie to samo, z wyjątkiem tego, że używam MapDocument („bieżący”) i RefreshActiveView () / RefreshTOC (), ale nic się nie aktualizuje.
Michael Stimson

1
@ MichaelMiles-Stimson Tak - zaktualizowano zgodnie z przeznaczeniem - Podejrzewam, że przegapiłeś to, że to nie spis treści pokazuje wartości opisu, ale element układu legendy. Wstaw jeden z nich i wybierz styl przedmiotu legendy, który wyświetla opisy i myślę, że stanie się jasne, że działa.
PolyGeo

Dziękuję @polygeo! Właśnie o to chodzi! Robił to cały czas, po prostu szukałem w złym miejscu.
Michael Stimson

Rozwiązałem problem z dopasowaniem opisów i kodów wyszukiwania, patrz moja odpowiedź.
matt wilkie

1

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.


Ciekawy pomysł, który może zadziałać w niektórych sytuacjach. To tutaj nie zadziała, ponieważ tabela opisu jest tylko tabelą, nie ma geometrii. Można przyłączyć się do geometrii i opisów, ale nie jestem zainteresowany dodatkowym hitem pracy lub wydajności dla tego projektu.
matt wilkie

1

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.