Detectando Join programaticamente usando o ArcPy?

10

Eu tenho algum código Python que é iniciado a partir de um projeto do ArcMap. Quaisquer associações que o usuário possa ter criado no projeto devem ser removidas para que meu código seja executado. Infelizmente, o código que remove uma junção ... arcpy.RemoveJoin_management ("layer1", "layer2") ... também quebra algumas das propriedades da camada que são críticas para o meu aplicativo (campos destacados, campos somente leitura, etc.).

Se as junções forem removidas clicando com o botão direito do mouse na camada no ArcMap e escolhendo "Remover junções", as propriedades da camada permanecerão intactas.

Se eu detectar que existe uma junção no meu código, simplesmente sairei do código e exibirei uma mensagem de que o usuário deve remover manualmente suas junções antes de tentar executar o código. Então ... Uma junção pode ser detectada programaticamente?

BrianPeasley
fonte
Estou um pouco perdido em como fazer o RemoveJoin via arcpy causa problemas. Como isso arruina um campo somente leitura? Além disso, o uso da ferramenta Remover associação no ArcMap causa os mesmos problemas?
Nathanus 24/03
Talvez outra maneira de resolver isso seja tornar seu código python insensível a junções?
Dan S.
@ Nathanus - O manual Remove Join no ArcMap não quebra as propriedades da minha camada, a ferramenta GP faz. A seguir, uma citação relevante da Ajuda da ESRI: "Como essas ferramentas executam o processo de junção real nos bastidores, ligeiramente diferente da caixa de diálogo Join Data, use as ferramentas se encontrar algum problema inesperado com a funcionalidade de junção nessa caixa de diálogo. "
BrianPeasley
@ Dan S. - Estou usando cursores de inserção e outros no meu código. Não tenho idéia de como eu tornaria meu código insensível a junções.
BrianPeasley
1
bem, valeu a pena perguntar. ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173 parece implicar que você poderá atualizar valores em uma tabela unida, prefixando os nomes das colunas pelo nome da tabela; talvez funcionasse em uma inserção também?
Dan S.

Respostas:

8

Pena que não há uma propriedade hasJoin na classe arcpy.Layer . Acho que você pode testar uma junção observando os nomes dos campos. Aqui está uma prova simples de conceito para dados em um geodatabase de arquivo:

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName
Derek Swingley
fonte
Isso parece promissor! Eu não entendo a essência do que está fazendo: "if f.name.find (lyr.datasetName)> -1:", mas tentarei em alguns dias e apresentarei um relatório (estou prestes a nevar in & perder energia!) ... Obrigado!
BrianPeasley
Feliz em ajudar. Confira o método de busca incorporado para strings python: docs.python.org/library/string.html e também o documento para objetos de campo arcpy : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Campo / ... Eu diria que dê a este código uma chance com seus dados e veja se funciona.
precisa
1
Acabei usando uma função muito semelhante a esta e funciona muito bem ... Para cada camada do meu documento, percorro a lista de campos e uso o Python para determinar se existe um "ponto" no nome do campo.
BrianPeasley
1

Eu acho que você descobrirá que não há uma maneira à prova de balas para fazer isso com objetos GP; será necessário usar ArcObjects e comtypes. Aqui estão algumas discussões dos fóruns da ESRI sobre as dificuldades na verificação de junções com as ferramentas / objetos padrão do GP: https://geonet.esri.com/thread/20317

blah238
fonte
ArcObjects e comtypes não serão a solução para este projeto, eles são estranhos para mim e esse projeto venceu ontem. Obrigado por me indicar esse tópico do fórum! Eu vou tentar a idéia apresentada por aí: "... Verifique se qualquer um dos fieldname.split (".) Resultaria em 2 partes das quais a primeira seria a tabela de junção "!
BrianPeasley