Aggiunta di shapefile o feature class come layer in ArcGIS Desktop usando Python / ArcPy?


20

Sto cercando di automatizzare varie attività in ArcGIS Desktop (usando ArcMap in generale) con Python, e continuo a aver bisogno di un modo per aggiungere un file di forma alla mappa corrente. (E poi fare cose per esso, ma questa è un'altra storia).

Il meglio che posso fare finora è aggiungere un file di livello alla mappa corrente, usando quanto segue ("addLayer" è un oggetto file di livello):

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

Tuttavia, i miei dati non elaborati saranno sempre shapefile, quindi devo essere in grado di aprirli. (Equivalentemente: converti un file di forma in un file di livello senza aprirlo, ma preferirei non farlo).

Risposte:


30

Ecco cosa ho trovato funzionante:

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")

Il frame di dati (variabile df) in cui questo codice inserirà il nuovo layer è il primo frame di dati nel documento della mappa. Si noti inoltre che questo codice aggiunge i dati come nuovo livello nella parte inferiore del sommario. Puoi anche utilizzare le altre opzioni di disposizione, che sono "AUTO_ARRANGE" e "TOP".


2
Un'altra opzione per specificare il frame di dati è utilizzare il frame di dati attivo: df = mxd.activeDataFrame anziché df = arcpy.mapping.ListDataFrames (mxd) [0] - inoltre, non è necessario il "*" nella chiamata listdataframe .
jbalk,

10

Crea feature layer (gestione dati) http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000006p000000.htm

L'ho appena provato nella finestra Python di ArcMap e si aggiunge direttamente alla mia mappa (non ho dovuto recuperare il mio frame di dati e chiamare AddLayer).

arcpy.MakeFeatureLayer_management('r:/temp/a.shp','test') testo alternativo


Funziona benissimo nella finestra immediata ... ma quando provo lo stesso codice in un file di script ed eseguo, non succede nulla! (Il codice viene eseguito senza messaggi di errore, ma non viene visualizzato nulla nel ToC) Inoltre, se rimuovo il layer dal ToC, quindi provo a eseguire nuovamente il codice nella finestra immediata, viene visualizzato un errore di tipo "file già esistente". Dove viene salvato il file di livello "test"?
Tom W,

Hai installato SP1?
Jason Scheirer,

1
@Tom W: Sono praticamente un noob con pitone e arcpy. Ma non penso che un file di livello sia stato creato fisicamente. Se si desidera un file di livello, è necessario farlo e passare il nome del livello come parametro: arcpy.SaveToLayerFile_management('test', 'r:/temp/evilmonkey.lyr', 'ABSOLUTE') Se non si desidera salvare il livello e si desidera solo se ne è andato, arcpy.Delete_management('test').
Jay Cummins,

@ Tom W: rileggi il tuo commento. Stai cercando di aggiungere un livello ad ArcMap da una shell python separata (non dalla finestra immediata)? Non pensavo che potessi farlo (ma non ho l'autorità su questo ... forse puoi farlo).
Jay Cummins,

1
@ Tom W: conosco quel bug di livello, motivo per cui mi stavo assicurando che SP1 fosse installato. Per aggiungere il livello al sommario come descritto, è necessario che lo script abbia un livello di funzionalità di output derivato e imposta il valore sul nome del livello creato. Gli strumenti GP in ArcMap cercano di proteggere il sommario da livelli spuri (temp FC, ecc.) Negli strumenti GP, quindi è necessario definire nei parametri dello strumento di script che il nuovo livello funzionale rimarrà nel sommario al termine. Il livello in cui il layer risiede sul disco è probabilmente l'origine dati dell'FC, quindi una classe caratteristica ha lo stesso nome del layer nell'area di lavoro.
Jason Scheirer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.