Zmieniasz symbolikę wielu warstw za pomocą ArcMap / ArcPy?

10

Czy istnieje sposób zmiany symboliki dla wielu warstw w ArcMap lub ArcCatalog. Chcę zmienić symbolikę wielu warstw jednocześnie.

Ramakrishna Billakanti
źródło
3
Możesz stworzyć naprawdę proste narzędzie skryptowe za pomocą applySymbologyFromLayer . Wystarczy przeciągnąć i upuścić warstwy w oknie dialogowym.
Roy
Jeśli utworzysz plik Lyr złożony z wielu warstw i przeciągniesz go (lub dodasz go za pomocą przycisku Dodaj dane), zastosuje on całą symbolikę i ustawienia etykiet, które są zapisane w pliku Lyr. Należy pamiętać, że nie stosuje się go do istniejących warstw, ale wprowadza się je ponownie za pomocą tej metody.
Brad Nesom
@ BradNesom - Dziękuję za sugestię, ale mówię konkretnie o zmianie symboliki wielu warstw, które są już w spisie treści. Zasadniczo zastosowanie „szablonu” symboliki z jednej (istniejącej) warstwy w spisie treści do wielu innych (istniejących) warstw w spisie treści.
RyanKDalton
2
Zaskakuje mnie, dlaczego ta funkcja nie jest wbudowana w ArcMap ...
jbaums
dlaczego nie połączyć wszystkich warstw w jedną, a następnie zmienić kolor tej jednej warstwy?
Robert

Odpowiedzi:

11

Edycja Możesz użyć tego skryptu dostarczonego przez ESRI, aby wykonać dane zadanie (taki sam pomysł jak poniżej):

import arcpy
arcpy.ApplySymbologyFromLayer_management("in_layer", "in_symbology_layer")

in_layer: warstwa, do której zostanie zastosowana symbolika.
Warstwa obiektów, warstwa rastrowa; Warstwa TIN; Warstwa analizy sieci

in_symbology_layer: Symbolika tej warstwy jest stosowana do warstwy wejściowej.
Warstwa obiektów; Warstwa rastrowa; warstwa TIN; Warstwa analizy sieci

Lub rozszerz to w formie samodzielnego skryptu (pomyśl IDLE):

import arcpy
from arcpy import env

# Set the current workspace
env.workspace = "path/to/workspace"

# Set layer to apply symbology to
inputLayers = ["in_layer_first.lyr","in_layer_second.lyr","in_layer_third.lyr"]

# Set layer that output symbology will be based on
symbologyLayer = "in_symbology_layer.lyr"

# Apply the symbology from the symbology layer to the input layer
for layer in inputLayers:
    arcpy.ApplySymbologyFromLayer_management (layer, symbologyLayer)

Zasadniczo tworzysz warstwę symboliczną (in_symbology_layer), którą zarządzasz w odniesieniu do projektu / stylu. Następnie skopiujesz symbolikę tych warstw na każdą z pozostałych warstw zgodnie z wykazem w spisie treści.


Poprzednia odpowiedź

Możesz użyć stylu z bieżącej warstwy ze spisu treści / listy warstw i zastosować go do innych warstw.

Dla każdej kolejnej warstwy (poniżej planowanej warstwy stylu)> kliknij prawym przyciskiem myszy> właściwości> symbolika> zaimportuj styl z innej warstwy

Michał Markieta
źródło
Cześć Michael, dziękuję za odpowiedź, ale chciałem to zrobić dla wielu warstw jednocześnie.
Ramakrishna Billakanti
Ramakrishna, zredagowałem swoją odpowiedź z nadzieją, że znajdziesz lepsze rozwiązanie za pomocą arcpy.
Michael Markieta
13

Miałem ten sam problem i znalazłem inne rozwiązanie. Jest prosty i bardzo praktyczny, nie wymaga nawet tworzenia pliku * .lyr.

W oknie edytora ArcGIS ModelBuilder zaprojektowałem następujący proces:

  1. Utwórz zmienną, definiując typ danych jako „warstwa”. We właściwościach ustawiony jako „lista wartości” i „parametr modelu”. (Opcjonalnie: Zmień nazwę obiektu na „Warstwy do symbolizacji”, aby ułatwić identyfikację).
  2. Utwórz zmienną, definiując typ danych jako „warstwa”. We właściwościach ustawiono jako „parametr modelu”. (Opcjonalnie: Zmień nazwę na „Warstwa symboli”).
  3. Dodaj narzędzie „Zastosuj symbolikę z warstwy”, zwykle w „C: \ Program Files \ ArcGIS \ Desktop10.2 \ ArcToolbox \ Toolboxes \ Data Management Tools.tbx \ Layers and Table Views”. (Opcjonalnie: Zmień nazwę obiektu wyjściowego na „Warstwy symbolizowane”).
  4. We właściwościach narzędzia „Zastosuj symbolikę z warstwy” zaznacz jako Warunki wstępne: „Warstwy do symbolizacji” i „Warstwa symboliki”.
  5. Połącz „Warstwy, aby symbolizować” z narzędziem, ustawiając je jako Warstwa wejściowa.
  6. Połącz „Warstwę symboli” z narzędziem, ustawiając je jako warstwę wejściową.
  7. Zapisz i zamknij okno edytora modelu.
  8. Po otwarciu modelu pojawi się tabela.
  9. Przeciągnij warstwę, która ma być używana jako szablon symboliki, ze spisu treści (TOC) projektu mapy i upuść ją w odpowiednim polu tabeli. Kliknij przycisk „sprawdź wartości”.
  10. Wybierz wiele warstw spisu treści, przeciągnij i upuść je w odpowiednim polu tabeli. Kliknij przycisk „sprawdź wartości”.
  11. Uruchom.
  12. Kliknij F5, aby odświeżyć widok mapy.

Uwagi: Prawdopodobnie nie zadziała, jeśli użyjesz jednocześnie warstw różnych typów geometrii. Nie działa dobrze, jeśli używasz jednocześnie warstw o ​​tej samej nazwie. Nie próbowałem z warstwami nie wektorowymi.

Kroki w kreatorze modeli.

Kroki podczas uruchamiania modelu.

Wyeksportowany skrypt do python modelu to:

 # Import arcpy module
import arcpy

# Script arguments
Layers_to_symbolize = arcpy.GetParameterAsText(0)

Symbology_Layer = arcpy.GetParameterAsText(1)

# Local variables:
Symbolized_Layers = Layers_to_symbolize

# Process: Apply Symbology From Layer
arcpy.ApplySymbologyFromLayer_management(Layers_to_symbolize, Symbology_Layer)
Danalif
źródło
1
Przynajmniej w przypadku ArcGIS 10.2 krok 6 powinien brzmieć „Połącz„ Warstwę
symbologii
Korzystałem z Pythona i stworzyłem fajną pętlę for, która działała dobrze, jednak nie zaktualizowała mojej symboliki. Odkryłem, że musisz najpierw otworzyć dokument .mdx, ustawić plik df, zaktualizować symbolikę, a następnie zmienić symbolikę. Następnie zobaczyłem odpowiedź 2, używając Model Builder (tak właśnie zbudowałem swój skrypt w języku Python). To było O wiele łatwiejsze i mniej czasochłonne, a ponadto mam zapisane narzędzie, dzięki czemu mogę to zrobić dla innych zestawów danych.
Kościół Heidi
1
Zamiast umieścić narzędzie „Symbology from Layer” w programie Model Builder, wystarczy kliknąć prawym przyciskiem myszy w Przyborniku i uruchomić jako Pakiet
Sir Adelaide
8

Tuż przed wiadomością @Aarona wykorzystałem informacje z @Roy do stworzenia własnego rozwiązania, które mógłbym włączyć do skryptu ArcToolbox. Patrz poniżej:

# Import modules
import arcpy

#Get the current Map Document
mxd = arcpy.mapping.MapDocument("CURRENT")

# Script arguments
Template_Layer = arcpy.GetParameterAsText(0)
LayerList = arcpy.GetParameterAsText(1)
Layers_to_Symbolize = LayerList.split(";")

# Process: Apply Symbology From Layer
for UpdateLayer in Layers_to_Symbolize:
    arcpy.AddMessage("Updating: " + UpdateLayer)
    arcpy.ApplySymbologyFromLayer_management(UpdateLayer,Template_Layer)

# Refresh the Table of Contents to reflect the change
arcpy.RefreshTOC()

#Delete the MXD from memory
del mxd

Widziałem tę koncepcję jako potencjalne narzędzie dla dodatku 10.1 Python na pasku narzędzi.

RyanKDalton
źródło
4

Wymyśliłem dość prosty sposób na włączenie symbologii wielowarstwowej jednocześnie za pomocą przybornika, do którego link znajduje się poniżej. Po dodaniu tego przybornika przeciągnij i upuść pojedynczą warstwę symboliki, a następnie przeciągnij i upuść wszystkie warstwy, do których chcesz zastosować symbolikę (cele). Prawdopodobnie mają tu zastosowanie ogólne zasady dotyczące dopasowywania typu geograficznego (linie, punkty, bieguny). Po uruchomieniu narzędzia pojawi się ono jako nic się nie wydarzyło. Odśwież ekran (F5) - wyświetlacz zaktualizuje się z pasującą symboliką. Kliknij warstwę, aby wyświetlić jej właściwości, a następnie kliknij przycisk „OK”, a symbol spisu treści zostanie zaktualizowany.

Pobierz plik Zip dla przybornika tutaj.

Oto skrypt, jeśli jest to łatwiejsze:

import arcpy

# Script arguments
Target_Layers = arcpy.GetParameterAsText(0)
if Target_Layers == '#' or not Target_Layers:
Target_Layers = "LayersToBeChanged" # provide a default value if unspecified

Symbology_Layer = arcpy.GetParameterAsText(1)
if Symbology_Layer == '#' or not Symbology_Layer:
Symbology_Layer = "SymbologyLayer" # provide a default value if unspecified

# Local variables:
Output_Symbology = Symbology_Layer

# Process: Apply Symbology From Layer (3)
arcpy.ApplySymbologyFromLayer_management(Target_Layers, Symbology_Layer)
użytkownik21466
źródło