Adicionando shapefile ou classe de recurso como camada no ArcGIS Desktop usando Python / ArcPy?

20

Estou tentando automatizar várias tarefas no ArcGIS Desktop (geralmente usando o ArcMap) com o Python, e continuo precisando de uma maneira de adicionar um shapefile ao mapa atual. (E depois faça coisas, mas isso é outra história).

O melhor que posso fazer até agora é adicionar um arquivo de camada ao mapa atual, usando o seguinte ("addLayer" é um objeto de arquivo de camada):

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

No entanto, meus dados brutos sempre serão shapefiles, portanto, preciso poder abri-los. (Equivalentemente: converta um shapefile em um arquivo de camada sem abri-lo, mas prefiro não fazer isso).

Tom W
fonte

Respostas:

30

Aqui está o que eu achei que funcionou:

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

O quadro de dados (variável df) no qual esse código colocará a nova camada é o primeiro quadro de dados no documento de mapa. Observe também que esse código adiciona os dados como uma nova camada na parte inferior do sumário. Você também pode usar as outras opções de arranjo, que são "AUTO_ARRANGE" e "TOP".

Kenton W
fonte
2
Outra opção para especificar o quadro de dados é usar o quadro de dados ativo: df = mxd.activeDataFrame em vez de df = arcpy.mapping.ListDataFrames (mxd) [0] - além disso, você não precisa do "*" na chamada de listdataframe .
jbalk
10

Criar camada de recurso (gerenciamento de dados) http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000006p000000.htm

Eu apenas tentei na janela Python do ArcMap e ela adiciona diretamente ao meu mapa (não precisei pegar meu dataframe e chamar AddLayer).

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

Jay Cummins
fonte
Isso funciona muito bem na janela imediata ... mas quando tento o mesmo código em um arquivo de script e o executo, nada acontece! (O código é executado sem mensagens de erro, mas nada aparece no sumário). Além disso, se eu remover a camada do sumário, tentar executar o código na janela imediata novamente, recebo um erro do tipo "arquivo já existe". Onde o arquivo de camada "teste" é salvo?
Tom W
Você instalou o SP1?
Jason Scheirer
1
@ Tom W: Eu sou praticamente um noob com python e arcpy. Mas não acho que um arquivo de camada seja criado fisicamente. Se você deseja um arquivo de camada, é necessário criá-lo e passar o nome da camada como parâmetro: arcpy.SaveToLayerFile_management('test', 'r:/temp/evilmonkey.lyr', 'ABSOLUTE') Se você não deseja salvar a camada e deseja que ela seja removida arcpy.Delete_management('test'),.
Jay Cummins
@ Tom W: basta reler o seu comentário. Você está tentando adicionar uma camada ao ArcMap a partir de um shell python separado (não a janela imediata)? Não achei que você pudesse fazer isso (mas não tenho autoridade nisso ... talvez possa).
Jay Cummins
1
@ Tom W: Eu sei sobre esse bug de camada, e é por isso que eu estava certificando-me de que o SP1 estava instalado. Para adicionar a camada ao sumário conforme você está descrevendo, você precisa que seu script tenha uma camada de recurso de saída derivada e defina o valor como o nome da camada que você criou. As ferramentas de GP no ArcMap tentam proteger o TOC de camadas espúrias (temp FCs etc.) nas ferramentas GP, assim você precisa definir nos parâmetros da ferramenta de script que sua nova camada de recurso permanecerá no TOC quando terminar. Onde a camada está no disco provavelmente é a fonte de dados do FC, portanto, uma Classe de Recurso tem o mesmo nome da camada no seu espaço de trabalho.
Jason Scheirer