Erro replaceDataSource do Arcpy

8

Verifiquei as outras respostas aqui e nenhuma delas funcionou para mim ...

É uma questão "simples" de encontrar uma camada pelo nome em um mapa e alterar sua fonte de dados.

Aqui está o meu script:

    #-- New Source
    newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

    #-- Validation
    if arcpy.Exists(newSource):
        print "The new source exists!"
    else:
        print "Not found!"

    #-- Find the layer and change its source            
    for lyr in arcpy.mapping.ListLayers(mxd):
        if lyr.name == lyrZones:
            print "Layer found!"
            print layers.dataSource
            print "  Replacing source..."
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource)
            print lyr.dataSource

Eu o executo a partir de um script python fora do ArcGIS.

insira a descrição da imagem aqui

Você pode ver que a fonte existe, a camada foi encontrada, eu posso acessar sua fonte de dados imprimindo-a, mas o lyr.replaceDataSource causa um erro (erro inesperado ... não ajuda muito ...)

Estou trabalhando há 4-5 horas e estou com poucas soluções para tentar. Alguma idéia do que pode causar o acidente?

fgcartographix
fonte
1
À primeira vista, parece que você tem alguns caracteres estranhos no caminho do diretório. Tente mover o shapefile para um diretório de teste D:\teste veja se isso funciona.
Mintx
Nunca tive nenhum problema com isso antes. O personagem é "#" e é apenas um truque antigo de classificação, para que meus projetos apareçam primeiro. Eu tentei colocar meu projeto no D: / TEMP, mas não funcionou ...
fgcartographix

Respostas:

4

Sei que isso é bastante antigo, mas acabei de encontrar o mesmo problema e fiquei surpreso com a falta de soluções por aí. A solução é muito simples, mas você não teria como saber com base na ajuda praticamente inexistente da ESRI:

Não inclua a extensão shapefile. ...É isso aí.

newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

Deve ler:

newSource = os.path.join(currDir, '{}_Dep{}'.format(lyrZones, dirNum))
Tom
fonte
1
A pergunta e a resposta dizem respeito aos arquivos de forma. No entanto, encontrei um problema semelhante com uma classe de recurso em um banco de dados geográfico corporativo (também conhecido como SDE). Acontece que arcpy.Exists requer um nome totalmente qualificado. No entanto, o layer.replaceDataSource falhará se você usar um nome completo, mas funcionará se você usar apenas o nome do recurso e deixar de fora o banco de dados e o nome do proprietário.
Dvdhns
1

Diversão com depuração! Tente o seguinte:

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name == lyrZones:
        if lyr.supports("DATASOURCE"):
            print lyr.dataSource
            print currDir
            print newSource
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource, TRUE)
            print "Did we crash yet?"
            print lyr.dataSource
        else:
            print "Layer isn't supported!"
Mintx
fonte
Pelo menos eu sei que a fonte de dados é suportada. Recebeu a mesma mensagem de erro. Falha no "lyr.replaceDataSource (currDir," SHAPEFILE_WORKSPACE ", newSource, True)". Não chegou a "Já batemos?". Frustrante ...
fgcartographix
Argh, isso é péssimo. Qual é o objetivo final que você está tentando alcançar? Talvez haja outra maneira de fazer isso.
Mintx
Eu tenho 5 modelos e entre 14 e 50 mapas de cada um (128 mapas no total). Eu tenho duas camadas para atualizar em cada uma. O primeiro é apenas um Def. Consulta que eu lidei como um chefe;) (lyr.definitionQuery = defQueryLines). A outra é uma camada de polígono que possui uma simbologia de cores graduada, mas o arquivo precisa ser alterado. Eu escrevi um script que cria uma saída para cada mapa e preciso atualizar a fonte e alterar o valor da simbologia (mas acho que são 10.1 que fazem isso. Tenho 10.0) para que eu possa manter a simbologia ...
fgcartographix
Por enquanto, eu atualizo o arquivo manualmente (o primeiro lote tem 20 mapas, portanto, não é tão entediante), mas o próximo terá 50 mapas, então ...
fgcartographix
A ferramenta precisa trabalhar com um arquivo .lyr? Talvez eu possa trabalhar diretamente em um .lyr onde eu possa mudar a fonte de dados. Eu não vejo quaisquer propriedades para mudar o valye simbologia (o campo simbolizado embora ...)
fgcartographix
1

Não sei se isso ajuda ou não, mas encontrei este erro ao tentar alternar as fontes de dados SDE para uma camada. O que eu descobri é que, quando eu corria do PyScripter, ele processava um processo python.exe de 64 bits. Eu pegaria o ValueError. Se eu forcei a execução do script usando o python.exe de 32 bits via Prompt de Comando, não recebi o erro. Não sei se isso ajudaria ou não o seu problema, mas vale a pena tentar!

Bryan
fonte
Obrigado. É tudo de 32 bits, por isso não pode ser o problema, mas vou ter isso em mente quando experimentar o geoprocessamento de 64 bits. Por agora, eu deixei essa parte do meu script e substituiu a fonte à mão ... :(
fgcartographix
1

A maioria das informações está aqui . Mas, para resolver isso, entrei na janela python no ArcCatalog para verificar as definições de ESRI de cada parâmetro na função .replaceDataSource.

.replaceDataSource (espaço de trabalho, tipo de espaço de trabalho, nome do conjunto de dados)

espaço de trabalho = espaço de trabalho da nova fonte de dados

workspace_type = o tipo de espaço de trabalho real listado na seção substituir fonte de dados da ajuda vinculada.

dataset_name = nome do arquivo sem o tipo de arquivo (IE: .shp), não o nome do conjunto de dados no índice. Também não é necessário o diretório à sua frente.

littlenerrie86
fonte