É possível identificar programaticamente o campo Join que está sendo usado para unir dois conjuntos de dados juntos no ArcMap? Atualmente, estou usando o ArcGIS 10.0, SP5 e preferiria uma solução ArcPy , no entanto, não me oporia a outras soluções, se uma solução ArcPy não estiver disponível.
Um método que tentei foi percorrer todos os campos e procurar um "baseName" correspondente, mas esse é apenas um "palpite", no qual você espera que os nomes de campo nos dois bancos de dados sejam os mesmos.
Para uma representação gráfica do que estou procurando, basicamente quero identificar o "Campo de junção de entrada" e "Campo de junção de saída", como visto na caixa de diálogo "Adicionar junção", mas depois do fato, é claro.
Esta é uma pergunta de tag para "Uma junção" pode ser detectada programaticamente? , mas neste caso, desejo estender a funcionalidade para identificar os FIELDs que estão sendo usados para unir os dois (ou mais) conjuntos de dados.
fonte
Respostas:
Aqui está uma abordagem do ArcObjects, baseada neste exemplo , para enumerar todas as junções em uma camada e listar seus nomes de tabela de destino e origem e chaves primárias e estrangeiras:
ILayer
que tenha uma ou mais junçõesILayer
paraIDisplayTable
IDisplayTable.DisplayTable
propriedade paraIRelQueryTable
IRelQueryTable
:RelQueryTable
'sDestinationTable
eSourceTable
propriedadesOriginPrimaryKey
eOriginForeignKey
daIRelQueryTable.RelationshipClass
propriedade.RelQueryTable
'sSourceTable
propriedadeEsse script Python (usando comtypes e este módulo auxiliar ) percorrerá todas as junções, do mais recente ao mais antigo, e imprimirá os nomes das tabelas de destino e de origem, chave primária de origem e chave estrangeira de origem para cada associação:
Exemplo de saída, dada uma camada de origem com três junções:
Para mais informações, consulte Como acesso o ArcObjects a partir do Python?
fonte
"global name 'esriGeoDatabase' is not defined"
. Onde / como deve ser definido no código que precede a linhawhile CType(table, esriGeoDatabase.IRelQueryTable)
?esriGeoDatabase = GetESRIModule("esriGeoDatabase")
.layerList = arcpy.mapping.ListLayers(mxd)
dentro dolistJoins(table)
código, mas ele pula fora nowhile
comunicado.app.Document
volta com'NoneType' object has no attribute 'Document'
Coloque todos os dados dos campos em seqüências de caracteres (depois de ordená-los) compare-os com uma função de comparação difusa e selecione aqueles que deram a melhor correspondência ou correspondência além de uma certa precisão.
Essa solução é quando alguns dados não cabem. Se você acha que as duas colunas sempre se encaixam, basta pedir e comparar para uma combinação perfeita com uma função de comparação comum.
fonte
Tente o seguinte:
Use a ferramenta Transformação XSLT do conjunto de ferramentas Metadados para gravar um arquivo de metadados xml / html para o conjunto de dados em questão.
Use um analisador de HTML para ler o arquivo de metadados e procurar o campo de junção no histórico de geoprocessamento da ferramenta Join Field
Saída de amostra da ferramenta Transformação XSLT
fonte
Os nomes das tabelas unidas estão no objeto IFeatureLayer - IFeatureLayerDefinition como uma seqüência de caracteres .. que eu acho que provavelmente contém a junção SQL e, portanto, os nomes dos campos.
http://edndoc.esri.com/arcobjects/8.3/diagrams/Map%20Layer%20Object%20Model.pdf
Ou você quer dizer se você não pode acessar esse objeto?
fonte
IFeatureLayerDefinition
não contém o "join SQL", ele possui apenas umaDefinitionExpression
propriedade que expõe a consulta de definição da camada de recurso, se definida, que é uma cláusula WHERE que limita quais linhas são exibidas.RelationshipClass
entanto, ele possui uma propriedade, mas acho que isso apenas expõe a associação mais recente. Você precisaria usarIRelQueryTable
para obtê-los todos.para encontrar campos correspondentes, independentemente do nome do campo, você pode fazer algo assim:
fonte