Dodanie pliku kształtu lub klasy obiektów jako warstwy w ArcGIS Desktop przy użyciu Python / ArcPy?

20

Próbuję zautomatyzować różne zadania w ArcGIS Desktop (ogólnie używając ArcMap) za pomocą Pythona i ciągle potrzebuję sposobu, aby dodać plik kształtu do bieżącej mapy. (A potem zrób z tym różne rzeczy, ale to już inna historia).

Do tej pory najlepsze, co mogę zrobić, to dodać plik warstwy do bieżącej mapy, używając następującego polecenia („addLayer” to obiekt pliku warstwy):

def AddLayerFromLayerFile(addLayer):
 import arcpy
 mxd = arcpy.mapping.MapDocument("CURRENT")
 df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
 arcpy.mapping.AddLayer(df, addLayer, "AUTO_ARRANGE")
 arcpy.RefreshActiveView()
 arcpy.RefreshTOC()
 del mxd, df, addLayer

Jednak moje nieprzetworzone dane zawsze będą plikami kształtowymi, więc muszę być w stanie je otworzyć. (Równoważnie: przekonwertuj plik kształtu do pliku warstwy bez otwierania go, ale wolałbym tego nie robić).

Tom W.
źródło

Odpowiedzi:

30

Oto, co według mnie zadziałało:

import arcpy
from arcpy import env

# get the map document
mxd = arcpy.mapping.MapDocument("CURRENT")

# get the data frame
df = arcpy.mapping.ListDataFrames(mxd,"*")[0]

# create a new layer
newlayer = arcpy.mapping.Layer(path_to_shapefile_or_feature_class)

# add the layer to the map at the bottom of the TOC in data frame 0
arcpy.mapping.AddLayer(df, newlayer,"BOTTOM")

Ramka danych (zmienna df), w której ten kod umieści nową warstwę, jest pierwszą ramką danych w dokumencie mapy. Należy również pamiętać, że ten kod dodaje dane jako nową warstwę na dole spisu treści. Możesz także użyć innych opcji aranżacji, którymi są „AUTO_ARRANGE” i „TOP”.

Kenton W.
źródło
2
Inną opcją określania ramki danych jest użycie aktywnej ramki danych: df = mxd.activeDataFrame zamiast df = arcpy.mapping.ListDataFrames (mxd) [0] - również nie potrzebujesz „*” w wywołaniu listdataframe .
jbalk,
10

Utwórz warstwę funkcji (zarządzanie danymi) http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000006p000000.htm

Właśnie wypróbowałem to w oknie ArcMap w Pythonie i dodaje się ono bezpośrednio do mojej mapy (nie musiałem pobierać ramki danych i wywoływać AddLayer).

arcpy.MakeFeatureLayer_management('r:/temp/a.shp','test') alternatywny tekst

Jay Cummins
źródło
Działa to świetnie w bezpośrednim oknie ... ale kiedy próbuję tego samego kodu w pliku skryptu i uruchamiam go, nic się nie dzieje! (Kod działa bez komunikatów o błędach, ale w ToC nie pojawia się nic). Ponadto, jeśli usunę warstwę z ToC, a następnie spróbuję ponownie uruchomić kod w bezpośrednim oknie, pojawi się błąd typu „plik już istnieje”. Gdzie jest zapisywany plik warstwy „testowej”?
Tom W
Czy zainstalowałeś dodatek SP1?
Jason Scheirer
1
@Tom W: Jestem prawie noobem z pythonem i arcpy. Ale nie sądzę, że plik warstwy jest tworzony fizycznie. Jeśli chcesz plik warstwy, trzeba to zrobić i przekazać nazwę warstwy jako parametr: arcpy.SaveToLayerFile_management('test', 'r:/temp/evilmonkey.lyr', 'ABSOLUTE') Jeśli nie chcesz zapisywać warstwy i po prostu chcesz go nie ma, arcpy.Delete_management('test').
Jay Cummins
@Tom W: ponownie przeczytaj swój komentarz. Czy próbujesz dodać warstwę do ArcMap z oddzielnej powłoki Pythona (nie z bezpośredniego okna)? Nie sądziłem, że możesz to zrobić (ale nie mam autorytetu w tym ... może możesz).
Jay Cummins
1
@Tom W: Wiem o tym błędzie warstwy, dlatego upewniłem się, że dodatek SP1 został zainstalowany. Aby dodać warstwę do spisu treści podczas opisywania, potrzebujesz, aby skrypt miał pochodną warstwę wynikową i ustaw wartość na nazwę utworzonej warstwy. Narzędzia GP w ArcMap próbują chronić TOC przed fałszywymi warstwami (temp FC) itp. W narzędziach GP, więc musisz zdefiniować w parametrach narzędzia skryptowego, że nowa warstwa funkcji pozostanie w TOC po zakończeniu. Miejsce, w którym warstwa znajduje się na dysku, prawdopodobnie jest źródłem danych FC, więc klasa obiektów ma taką samą nazwę jak warstwa w obszarze roboczym.
Jason Scheirer,