Substituir / atualizar permanentemente o servidor / serviço em cada Camada ArcSDE no MXD?

8

Usando o método mxd.findAndReplaceWorkspacePaths, se MXD for atualizado e o caminho em que o arquivo de conexão .sde for movido novamente, todas as fontes de dados serão interrompidas novamente.

Existe um método para atualizar permanentemente cada camada SDE em um Sumário MXD para armazenar permanentemente o Servidor e Serviço SDE? Ou seja. Apenas substitua o SERVER e INSTANCE para cada camada SDE em um MXD usando python ou ArcObjects em Pyhton?

MMV
fonte
Até onde eu sei, o Arcmap sempre usa o caminho para o arquivo de conexão, por exemplo "Database Connections\Connection to Foobar.sde", e não há como simplesmente passar ou salvar as informações de SERVIDOR e SERVIÇO diretamente. Eu ficaria encantado em provar que estou errado. Eu posso imaginar um hack para armazenar um arquivo sde gerado dinamicamente no mesmo diretório que o mxd, ou até mesmo dentro do mxd, e depois referir a ele; embora não saiba como implementá-lo.
275128 matt wilkie
1
@matt, não acho isso completamente correto; O ArcMap usará as propriedades de conexão persistidas dentro da camada. O arquivo de conexão SDE nunca é visualizado novamente, seu caminho é apenas metadados. O problema aqui parece ser específico aos métodos de substituição da fonte de dados do arco-íris. Você pode definir definitivamente as propriedades da conexão sem usar um arquivo de conexão com o ArcObjects (por exemplo, usando a interface IWorkspaceName ). No entanto, com o arcpy, você está limitado aos métodos fornecidos.
precisa saber é o seguinte
@matt você está correto. Estou usando os métodos do Arcpy. Não consigo obter as propriedades de conexão de cada camada para 'salvar'. A dependência para a obtenção de propriedades de conexão do caminho para os restos arquivo de conexão após um mxd.save () ou mxd.saveACopy ()
MMV

Respostas:

7

Eu encontrei uma solução para quebrar a dependência do caminho para o arquivo de conexão .sde usando o ArcPy e o método a seguir.

Funciona assim:

lyr.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)
table.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)

Você pode renomear ou excluir o arquivo de conexão após o MXD ser reparado e salvo. Ele continuará sendo aberto sem problemas depois que o arquivo de conexão não estiver mais lá.

Estes métodos NÃO funcionam:

mxd.findAndReplaceWorkspacePaths
lyr.findAndReplaceWorkspacePath

Você NÃO PODE renomear ou excluir o arquivo de conexão após o reparo do MXD. O MXD procurará o arquivo de conexão .sde sempre no mesmo local sempre que for aberto.

MMV
fonte
Estou usando o lyr.replaceDataSource, no entanto, parece que o arcmap não pode detectar a nova fonte de dados, pois mostra um "!" antes da camada, então eu tenho que reparar a fonte de dados manualmente. Aqui está o meu código:
SMALIS
importação arcpy; mxd = arcpy.mapping.MapDocument (r "C: \ Usuários \ SMALIS \ Documents \ ArcGIS \ pythonSwitchSource.mxd"); para lyr em arcpy.mapping.ListLayers (mxd): se lyr.supports ("DATASOURCE"): lyr.replaceDataSource ("C: \ Usuários \ SMALIS \ AppData \ Roaming \ ESRI \ Desktop10.2 \ ArcCatalog \ DB1.sde" , "SDE_WORKSPACE", lyr.datasetName, False) mxd.saveACopy (r "C: \ Usuários \ SMALIS \ Documents \ ArcGIS \ 1.mxd"); del mxd;
Smalis
Seu comentário sobre os métodos que, para conjuntos de dados de recursos que NÃO FUNCIONAM, me salvou de muitas tentativas frustradas. MUITO OBRIGADO! Concordo que isso não funcionou para mim ou é um bug? o lyr.workspacePath mostra o recurso de conjunto de dados
woodwa
1

Você precisa percorrer as camadas do grupo aninhado e usá-lo arcpy.CreateArcSDEConnectionFile_managementpara criar novos sde usando parâmetros de lyr.servicePropertiese passar parâmetros como servProp.getou arcpy.GetParameterAsText(0).

Não se esqueça de usar os.remove(temp_sde) if os.path.exsists(temp_sde) else None.

for maplayer in lyr_list:
    walknestedgroups(maplayer)
    servProp = maplayer.serviceProperties
    if maplayer.serviceProperties["ServiceType"] == "SDE":
        host = servProp.get('Server','N\A')
    if host in ("MyServer"):
        remap_sde(maplayer)
Andy
fonte
0

Isso pode ser muito simples, mas ...
Se você renomear a conexão antiga e nomear a nova com o nome antigo, isso obtém um resultado melhor?

Brad Nesom
fonte
Se você apontar novamente cada camada em um MXD para usar um arquivo de conexão localizado em '\\ corpshare \ sde \ corpsde.sde', tudo funcionará bem. Se, no entanto, esse caminho ficar indisponível, todo MXD estará quebrado. ' Estou mais interessado nas propriedades da conexão SERVER e SERVICE no arquivo de conexão, em vez do caminho para ele. Quero essencialmente atualizar cada servidor e serviço de camadas, portanto, se esse caminho se tornar indisponível, o MXD ainda poderá acessar o servidor sem o caminho para um arquivo de conexão válido.
MMV
@MMV, você tem certeza? Eu apenas tentei: 1) Adicione uma camada ao mapa usando um arquivo de conexão SDE 2) Salve o MXD e feche o ArcMap 3) Exclua / renomeie o arquivo de conexão SDE 4) Abra o MXD salvo. A camada é carregada sem problemas.
blah238
@ Blah238 correto Eu já vi isso - se o arquivo sde se foi, ele ainda se conecta ??? O que eu pensei é que, se você alterar as propriedades da conexão em um arquivo sde (para apontá-lo para outro servidor / serviço que o encontraria. (Por exemplo, se você não abrir e quebrar os links primeiro. Vou testá-lo) e voltar.
Brad Nesom
Basta ler o post de blah238 acima. Eu não estava ciente disso. porque eu tive problemas com a senha antes e os corrigi alterando as cadeias de conexão. talvez o truque seja quebrá-lo e repará-lo com as novas cadeias de conexão. mas para quebrá-lo, você deve interromper o serviço existente. ??
precisa
@ blah238 Criando manualmente um MXD no ArcMap, salvando-o e removendo o arquivo de conexão, tudo continuará funcionando depois que o caminho para o arquivo .sde for 'quebrado'. Atualizando um MXD já existente usando o ArcPy, é onde fica a dependência do caminho para o arquivo de conexão.
MMV