Como alterar os caminhos de dados de origem para cada arquivo de camada na pasta X usando o arcpy?
Eu segui Atualizando e corrigindo fontes de dados com o arcpy.mapping da melhor maneira possível, mas tudo o que recebo é inútil, o Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected error
que não me diz o suficiente para solucionar o que está errado ou faltando.
Aqui está o código (simplificado para testar um arquivo de camada única):
import arcpy, os
fname = r'K:\Layers\xxx.lyr'
lyr = arcpy.mapping.Layer(fname)
oldpath = lyr.workspacePath
print 'oldpath: ', oldpath
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
print 'newpath: ', lyr.workspacePath
e os resultados:
oldpath: K:\Canvec_Utility\Temp.gdb
Traceback (most recent call last):
File "x10x.py", line 12, in <module>
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\utils.py", line 181, in fn_
return fn(*args, **kw)
File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\_mapping.py", line 601, in findAndReplaceWorkspacePath
return convertArcObjectToPythonObject(self._arc_object.findAndReplaceWorkspacePath(*gp_fixargs((find_workspace_path, replace_workspace_path, validate), True
)))
ValueError: Layer: Unexpected error
((seção 'atualização' movida para uma resposta))
arcpy
arcgis-10.0
layers
Matt Wilson
fonte
fonte
Runtime error...
citado acima é do shell python interativo no Arccatalog, que não fornece retorno. Os resultados com traceback são copiados de um shell de comando.Respostas:
Parece que o método correto a ser usado ao alternar áreas de trabalho E conjuntos de dados de recursos é lyr.replaceDataSource () . Aqui está o meu script de trabalho:
Nos testes, parece que validar neste método é diferente novamente: verifica se o novo espaço de trabalho é válido, mas ignora a classe de recurso e os conjuntos de dados do recurso - o que significa que não retornará um erro se o FC de destino não estiver lá.
Por outro lado, se o FC de destino estiver presente, mesmo dentro de um conjunto de dados de recurso diferente, o novo caminho da fonte de dados será adaptado adequadamente, independentemente de a validação ser verdadeira ou falsa.
Atualização: agora no Github para facilitar o compartilhamento e a revisão.
fonte
O inútil
unexpected error
neste caso significa algo como "novo caminho não existe" . Ovalidate
parâmetro opcional é padronizado como True se não for especificado. Com false, o script é concluído sem erros, mas os arquivos de camada resultantes ainda estavam quebrados, mesmo que o caminho de destino e a classe de recurso existam.resultado
Além de inicialmente não saber validar como padrão, true, um bug ou pelo menos algum comportamento muito peculiar dificultava a solução de problemas. Atualizar e corrigir fontes de dados com arcpy.mapping diz Não incluir os nomes dos conjuntos de dados do recurso no caminho da área de trabalho. Os conjuntos de dados do recurso fazem parte da área de trabalho. Se uma classe de recurso, por exemplo, for movida de uma classe de recurso independente para um conjunto de dados de recursos, um documento de mapa ainda será aberto sem que a camada seja quebrada " e " Se uma camada ou tabela em um documento de mapeamento ou arquivo de camada é movido para dentro ou para fora de um conjunto de dados de recursos, seus links não devem ser quebrados ".
Acontece que validar tem um ângulo ligeiramente diferente sobre isso. Sim, não importa em que lugar do novo geodatabase (espaço de trabalho) a classe de recurso de destino reside , no nível superior ou em um conjunto de dados de recursos completamente diferente. No entanto, o espaço de trabalho de destino deve conter um conjunto de dados do recurso com o mesmo nome ou validar falhas .
Fontes :
fonte