Zmieniasz style etykiet (czcionka, kolor, rozmiar itp.) Za pomocą ArcPy?

9

Próbuję napisać makro Pythona dla ArcGIS 10.2, które zautomatyzuje proces oznaczania punktów w warstwie w oparciu o różne typy mieszkań. Na przykład jeden styl mieszkań miałby niebieski kwadrat z białym pogrubionym tekstem jako jedną etykietą; inny miałby różowy kwadrat z czarnym pogrubionym tekstem; inny miałby czerwony kwadrat z białym pogrubionym tekstem itp.

Jakiego wyrażenia lub funkcji użyłbyś w Arcpy, aby zmienić styl tych etykiet?

Obecnie skrypt etykietuje mieszkania kodem mapy i zmienia swoją nazwę w spisie treści na apartamenty, tak jak powinno.

wprowadź opis zdjęcia tutaj

Teraz chcę zmienić czcionkę, grafikę i rozmiar etykiet, aby wyglądały jak dla każdego, tworząc niepowtarzalną etykietę, a następnie uaktywnij przycisk i zautomatyzuj proces za każdym razem, gdy musimy wykonać jedną z tych warstw.

Czy istnieje sposób zmiany czcionek, etykiet i grafiki za pomocą skryptów Python (ArcPy, IDLE itp.)?


Postanowiłem zredagować ten post, aby podać ostateczny opis tego, co tu zamierzam, aby nie było zamieszania. Zasadniczo punkty na mapie przejdą od wyglądającego jak na powyższym obrazku do tego:

wprowadź opis zdjęcia tutaj


Próbowałem użyć tej lblClass.expressionfunkcji, ale kod, którego próbuję użyć, nie działa. Myślę, że to prawdopodobnie krok we właściwym kierunku. Poniżej znajduje się kod, którego próbowałem użyć, aby uzyskać wyrażenie labelClass.expression w celu zmiany czcionek etykiet.

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])
Tyler Spears
źródło

Odpowiedzi:

7

Interfejs API arcpy.mapping zapewnia dostęp tylko do ograniczonej liczby właściwości warstw, które można bezpośrednio modyfikować, ale wszystkie właściwości znalezione w oknie dialogowym Właściwości warstwy można modyfikować za pomocą funkcji UpdateLayer. Informacje są pobierane z warstwy źródłowej i stosowane do warstwy w dokumencie mapy, który wymaga aktualizacji. Source_layer może być plikiem warstwy (.lyr) lub warstwą w dokumencie mapy. UpdateLayer to solidna funkcja, ponieważ może być używana na kilka różnych sposobów w celu uzyskania różnych wyników.

Musisz utworzyć symbolikę / etykiety tak, jak chcesz i zapisać ją w pliku warstw. Następnie załaduj ten plik warstwy za pomocą arcpy.mapping.UpdateLayer () .

Jeśli wiele osób musi uruchomić dodatek do Pythona, musisz udostępnić plik warstwy wszystkim, na przykład dysk sieci publicznej.


Skończyłem tworzenie niestandardowego zestawu narzędzi Update Layer Properties . Pozwala wybrać warstwę w ArcMap TOC, a następnie wybrać plik warstwy wejściowej. Następnie aktualizuje warstwę ze wszystkimi właściwościami w pliku warstw i powraca do pierwotnej klasy elementów. Będzie działał z danymi w gdb, mdb, shp lub sde.

Wyświetl kod źródłowy

Daj mi znać, jeśli masz jakieś pytania.

wprowadź opis zdjęcia tutaj

ianbroad
źródło
Utworzyłem osobny plik warstwy z innej opartej na punktach warstwy danych ze wszystkimi ustawieniami (symbolika i etykiety), wykonuje, ale wydaje się, że wszystko, co robi, to całkowicie zastąpić nieoznaczony, niesymbolizowany plik mieszkania (którykolwiek, który chcę dodać) plik apartamentu sourceLayer. Zakładam, że dzieje się tak z powodu False w sekcji „tylko aktualizuj symbolikę”. Czy istnieje sposób, aby można to wykonać, aby po prostu zastosował symbolikę i etykiety, ale nie przesunął punktów w inne miejsce?
Tyler Spears
Jakich funkcji szukałbym, aby to zrobić? Nie jestem zbyt zaznajomiony z zaopatrzeniem. Nawiasem mówiąc, doceniam twoją pomoc do tej pory.
Tyler Spears
Próbowałem dostosować to do mojego kodu. Działa poprzez funkcję UpdateLayer, ale w linii 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]zgłasza błąd informujący, że indeks jest poza zakresem.
Tyler Spears
Oznacza to, że arcpy.mapping.ListLayersmetoda nie znajduje warstwy w bieżącym pliku mxd o takiej samej nazwie jak twoja input_layer_file(indeks [0]zwracania indeksu poza zakresem oznacza, że ​​na liście nie ma żadnych elementów).
XIY
Zrobiłem to i wydaje mi się, że to bardzo blisko, ale problem polega na tym, że po zakończeniu części UpdateLayer generuje następujący błąd: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Tyler Spears
6

Inną opcją jest ustawienie niestandardowego wyrażenia etykiety na warstwie (zmiana rozmiaru i koloru..etc) za pomocą python:

na przykład

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

Budowanie wyrażeń etykiet

Można je ustawić za pomocą:

LabelClass (arcpy.mapping)

EDYTOWAĆ:

Spróbuj tego:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

Możesz usunąć inne instrukcje liniowe (dla pętli, labClass i wywołania funkcji). Ponadto funkcja musi mieć nazwę FindLabel.

grafika 21
źródło
Próbowałem użyć czegoś podobnego do takiej funkcji. Utworzyłem definicję o nazwie, def getLabel (Code, Type)a następnie po skonfigurowaniu instrukcji if-else dla różnych kodów map, których używam, ustawiłem „lblClass.expression = getLabel („ [Map_Code] ”,„ [Type] ”)”, który po prostu zwraca błąd TypeError: unsupported operand type(s) for &: 'str' and 'str'Zasadniczo podążam za przykładami witryny Esri. Jeśli mogę po prostu udowodnić, że mogę zmienić czcionkę, mogę przejść do dostosowywania trudniejszych aspektów (takich jak kształt, tło i kolor etykiet).
Tyler Spears
@Tyler Spears, spróbuj usunąć podwójne cudzysłowy wokół nazw pól.
grafika 21
Kiedy to robię, mówi, że parametry nie są zdefiniowane.
Tyler Spears
@Tyler Spears, czy możesz opublikować swój kod w swoim pytaniu? Masz pojedynczy cytat poza nawiasami funkcji.
grafika 21
Oczywiście zaktualizowałem swoje pytanie, aby wyświetlić mój kod.
Tyler Spears