Removendo a camada de recurso usando o script ArcPy?

13

Eu tenho um script baseado em ArcPy onde estou tentando cruzar duas camadas, onde uma camada deve ter seu centróide na outra camada.

Como eu preciso saber que uma camada (feature_layer abaixo) inclui o centróide da outra, estou usando a ferramenta arcpy.SelectLayerByLocation_management ().

Como não tenho um documento de mapa (* .mxd) aberto, para fazer isso, tenho que usar a opção Criar camada de recurso para alimentá-lo.

A documentação observa que a camada de recursos desaparecerá quando o programa sair, mas preciso que desapareça mais cedo, pois o tenho em um loop semelhante ao abaixo

for feature_class in large_list_of_feature_classes:
    some_function(feature_class)

def some_function():
    feature = "{path to feature class}"
    feature_layer = "feature_layer"
    HUCs_layer = "all_HUCs" #HUCs being Hydrologic Unit Codes

    arcpy.MakeFeatureLayer_management(feature, feature_layer)
    arcpy.MakeFeatureLayer_management(feature, HUCs_layer)      
    arcpy.SelectLayerByLocation_management(HUCs_layer, "HAVE_THEIR_CENTER_IN", feature_layer, selection_type="NEW_SELECTION")

    arcpy.CopyFeatures_management(HUCs_layer, selection_name)

Estou procurando uma função para remover camadas de recurso e não consegui encontrar uma.

Sei que poderia colocar algum tipo de contagem lá ou algo para tornar cada um exclusivo no escopo do programa, mas isso não é o ideal, a menos que não haja maneira de remover as camadas de recursos.

nicksan
fonte

Respostas:

21

A ferramenta Excluir deve aceitar o nome de uma camada de recurso para removê-la do sumário.

Exclui permanentemente os dados do disco. Todos os tipos de dados geográficos suportados pelo ArcGIS, bem como caixas de ferramentas e áreas de trabalho (pastas, bancos de dados geográficos), podem ser excluídos. Se o item especificado for um espaço de trabalho, todos os itens contidos também serão excluídos.

e na seção Sintaxe, lista os tipos de dados que podem ser excluídos como:

Elemento de dados; Gráfico; Camada ; Vista de mesa

Jason Scheirer
fonte
Eu não sei por que devo usar a ferramenta de exclusão duas vezes para garantir que as camadas de recurso sejam removidas e, às vezes, essa função me dá erros, apesar da camada de recurso não ter sido realmente removida, esse erro ocorre quando tento excluir e criar camadas de recurso com o mesmo nome
geogeek
2
Isso não está realmente relacionado, mas é a maneira como o geoprocessamento funciona - ele espera que cada camada tenha um nome único, porque é assim que se refere a eles.
Jason Scheirer
1
Talvez o uso da ferramenta Excluir para remover uma camada do sumário possa ser melhor documentado em resources.arcgis.com/en/help/main/10.1/index.html#//… - diz que Camada é um tipo de dados que pode ser excluído, mas nenhuma outra referência é feita às camadas e sua frase de abertura "Exclui permanentemente dados do disco" afugentaria muitos usuários de tentar Excluir para remover uma camada.
PolyGeo
7

Você pode invocar arcpy.mapping.RemoveLayer para remover uma camada do sumário.

Fornece a capacidade de remover uma camada dentro de um quadro de dados em um documento de mapa (.mxd).

James Schek
fonte
Obrigado pela sugestão - não esclareci que estava procurando algo para fazer isso fora do contexto do mapeamento - este é apenas um script de análise e não tenho (ou pelo menos não sei) um sumário explícito. A sugestão de Jason abaixo funcionou. Obrigado! Ainda será uma função útil para mim mais tarde.
Nicksan
3

É isso que eu uso para remover camadas.

arcpy.mapping.RemoveLayer ("DataFrame", "Nome da camada")

Ou loop:

mxd = arcpy.mapping.MapDocument("CURRENT")
for df in arcpy.mapping.ListDataFrames(mxd):
    for lyr in arcpy.mapping.ListLayers(mxd, "", df):
        arcpy.mapping.RemoveLayer(df, lyr)
Peludo
fonte
3

Use mxd.save()se você estiver usando um documento de mapa que não é CURRENTpara garantir que a camada permaneça oculta. Além disso, adicione uma declaração de impressão no seu script:

mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]

for i in arcpy.mapping.ListLayers(mxd , "TerraColor_SanFrancisco_US_15m.tif"):
    print "Deleting layer", i
    arcpy.mapping.RemoveLayer(df , i)

arcpy.RefreshActiveView()

Apenas para garantir que ele encontre uma camada para excluir.

Jason Scheirer
fonte
-1

tente isto:

import arcpy
from arcpy import env
env.workspace = r"F:\Projects\ohad\derech_atankim\gis"   
for mxdname in arcpy.ListFiles("*.mxd"):
    print mxdname 
    mxd = arcpy.mapping.MapDocument(r"F:\Projects\ohad\derech_atankim\gis\\" + mxdname)
    df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
    for lyr in arcpy.mapping.ListLayers(mxd, "", df):
        if lyr.dataSource == r"F:\Projects\ohad\derech_atankim\gis\layers\roads.lyr":
            arcpy.mapping.RemoveLayer(df, lyr)
    mxd.save()
del mxd
newGIS
fonte