Est-il possible d'identifier par programme le champ de jointure utilisé pour regrouper en table deux ensembles de données dans ArcMap? J'utilise actuellement ArcGIS 10.0, SP5 et préférerais une solution ArcPy , mais je ne serais pas opposé à d'autres solutions, si une solution ArcPy n'est pas disponible.
Une méthode que j'ai essayée consistait à parcourir tous les champs et à rechercher un "baseName" correspondant, mais ce n'est qu'une "supposition éclairée" où vous espérez que les noms de champs dans les deux bases de données sont les mêmes.
Pour une représentation graphique de ce que je recherche, je veux essentiellement identifier le "Champ de jointure d'entrée" et le "Champ de jointure de sortie" comme on le voit dans la boîte de dialogue "Ajouter une jointure", mais après coup, bien sûr.
Il s'agit d'une question de balise à Est-ce qu'une «jointure» peut être détectée par programme? , mais dans ce cas, je souhaite étendre la fonctionnalité pour identifier le (s) CHAMP (s) utilisé (s) pour joindre les deux (ou plus) ensembles de données.
la source
Réponses:
Voici une approche ArcObjects, basée sur cet exemple , pour énumérer toutes les jointures sur une couche et répertorier leurs noms de table de destination et source et leurs clés primaire et étrangère:
ILayer
qui a une ou plusieurs jointuresILayer
toIDisplayTable
IDisplayTable.DisplayTable
propriété àIRelQueryTable
IRelQueryTable
:RelQueryTable
« sDestinationTable
etSourceTable
propriétésOriginPrimaryKey
etOriginForeignKey
de laIRelQueryTable.RelationshipClass
propriété.RelQueryTable
de »SourceTable
propriétéCe script Python (à l'aide de comtypes et de ce module d'assistance ) passera par toutes les jointures, de la plus récente à la plus ancienne, et imprimera les noms des tables de destination et source, la clé primaire d'origine et la clé étrangère d'origine pour chaque jointure:
Exemple de sortie, étant donné une couche source avec trois jointures:
Pour plus d'informations, voir Comment accéder à ArcObjects à partir de Python?
la source
"global name 'esriGeoDatabase' is not defined"
. Où / Comment faut-il le définir dans le code précédant la lignewhile CType(table, esriGeoDatabase.IRelQueryTable)
?esriGeoDatabase = GetESRIModule("esriGeoDatabase")
.layerList = arcpy.mapping.ListLayers(mxd)
dans lelistJoins(table)
code, mais il saute à lawhile
déclaration.app.Document
revient avec'NoneType' object has no attribute 'Document'
Mettez toutes les données des champs dans des chaînes (après les avoir commandées), comparez-les avec une fonction fuzzycompare et sélectionnez ceux qui ont donné la meilleure correspondance ou la correspondance au-delà d'une certaine précision.
Cette solution est lorsque certaines données ne correspondent pas. Si vous pensez que les deux colonnes conviendraient toujours, alors commandez et comparez pour une correspondance parfaite avec une fonction de comparaison ordinaire.
la source
Essaye ça:
Utilisez l' outil de transformation XSLT du jeu d' outils Métadonnées pour écrire un fichier de métadonnées xml / html pour le jeu de données en question.
Utilisez un analyseur HTML pour lire le fichier de métadonnées et recherchez le champ de jointure à partir de l'historique de géotraitement de l'outil Join Field
Exemple de sortie de l'outil de transformation XSLT
la source
Les noms des tables jointes sont dans l'objet IFeatureLayer - IFeatureLayerDefinition sous la forme d'une chaîne .. qui, je pense, contient probablement la jointure SQL et donc les noms de champ.
http://edndoc.esri.com/arcobjects/8.3/diagrams/Map%20Layer%20Object%20Model.pdf
Ou voulez-vous dire si vous ne pouvez pas accéder à cet objet?
la source
IFeatureLayerDefinition
ne contient pas le "join SQL", il a seulement uneDefinitionExpression
propriété exposant la requête de définition de la couche d'entités, si elle est définie, qui est une clause WHERE qui limite les lignes affichées.RelationshipClass
propriété, cependant, mais je pense que cela ne révèle que la jointure la plus récente. Vous devrez utiliser à laIRelQueryTable
place pour les obtenir tous.pour trouver des champs correspondants quel que soit le nom du champ, vous pouvez faire quelque chose comme ceci:
la source