Ist es möglich , die programmatisch zu identifizieren Join - Feld , der Tabelle zwei Datensätze zusammen in ArcMap Join verwendet wird? Ich verwende derzeit ArcGIS 10.0, SP5 und würde eine ArcPy-Lösung bevorzugen. Ich wäre jedoch nicht gegen andere Lösungen, wenn eine ArcPy-Lösung nicht verfügbar ist.
Eine Methode, die ich ausprobiert habe, bestand darin, alle Felder zu durchlaufen und nach einem passenden "Basisnamen" zu suchen. Dies ist jedoch nur eine "fundierte Vermutung", bei der Sie hoffen, dass die Feldnamen in beiden Datenbanken gleich sind.
Für eine grafische Darstellung dessen, wonach ich suche, möchte ich grundsätzlich das "Eingabe-Verknüpfungsfeld" und das "Ausgabe-Verknüpfungsfeld" identifizieren, wie im Dialogfeld "Verknüpfung hinzufügen" angezeigt, aber natürlich nachträglich.
Dies ist eine Tag-On-Frage an Kann ein "Join" programmgesteuert erkannt werden? In diesem Fall möchte ich jedoch die Funktionalität erweitern, um die FELD (en) zu identifizieren, die zum Zusammenfügen der zwei (oder mehr) Datensätze verwendet werden.
quelle
Antworten:
Im Folgenden finden Sie einen ArcObjects-Ansatz, der auf diesem Beispiel basiert , um alle Verknüpfungen auf einer Ebene aufzulisten und ihre Ziel- und Quelltabellennamen sowie Primär- und Fremdschlüssel aufzulisten:
ILayer
, der eine oder mehrere Verknüpfungen hatILayer
zuIDisplayTable
IDisplayTable.DisplayTable
Eigenschaft zuIRelQueryTable
IRelQueryTable
:RelQueryTable
‚sDestinationTable
undSourceTable
EigenschaftenOriginPrimaryKey
undOriginForeignKey
Eigenschaften derIRelQueryTable.RelationshipClass
Eigenschaft.RelQueryTable
‚s -SourceTable
EigenschaftDas Python - Skript (mit comtypes und diese Helfer - Modul ) werden alle die Verknüpfungen gehen, von spätestens frühesten und die Ziel- und Quelltabellennamen drucken, Herkunft Primärschlüssel und Herkunft Fremdschlüssel für jeden Join:
Beispielausgabe bei einer Quellenebene mit drei Verknüpfungen:
Weitere Informationen finden Sie unter Wie greife ich von Python aus auf ArcObjects zu?
quelle
"global name 'esriGeoDatabase' is not defined"
. Wo / wie soll es im Code vor der Zeile definiert werdenwhile CType(table, esriGeoDatabase.IRelQueryTable)
?esriGeoDatabase = GetESRIModule("esriGeoDatabase")
.layerList = arcpy.mapping.ListLayers(mxd)
in denlistJoins(table)
Code, aber es wird bei derwhile
Anweisung übersprungen .app.Document
kommt zurück mit'NoneType' object has no attribute 'Document'
Fügen Sie alle Daten der Felder in Zeichenfolgen ein (nachdem Sie sie bestellt haben), vergleichen Sie sie mit einer Fuzzy-Vergleichsfunktion und wählen Sie diejenigen aus, die die beste Übereinstimmung oder Übereinstimmung mit einer bestimmten Genauigkeit erzielt haben.
Diese Lösung ist, wenn einige Daten nicht passen würden. Wenn Sie der Meinung sind, dass beide Spalten immer passen, bestellen und vergleichen Sie einfach, um eine perfekte Übereinstimmung mit einer normalen Vergleichsfunktion zu erzielen.
quelle
Versuche dies:
Verwenden Sie das XSLT-Transformationstool aus dem Metadaten-Toolset , um eine XML / HTML-Metadatendatei für das betreffende Dataset zu schreiben.
Verwenden Sie einen HTML-Parser , um die Metadatendatei einzulesen und nach dem Verknüpfungsfeld aus dem Geoverarbeitungsverlauf des Verknüpfungsfeld-Tools zu suchen
Beispielausgabe des XSLT-Transformationstools
quelle
Verknüpfte Tabellennamen befinden sich im IFeatureLayer - IFeatureLayerDefinition-Objekt als Zeichenfolge. Ich denke, sie enthält wahrscheinlich die Join-SQL und damit die Feldnamen.
http://edndoc.esri.com/arcobjects/8.3/diagrams/Map%20Layer%20Object%20Model.pdf
Oder meinst du, wenn du nicht auf dieses Objekt zugreifen kannst?
quelle
IFeatureLayerDefinition
enthält nicht "Join SQL", sondern nur eineDefinitionExpression
Eigenschaft, die die Definitionsabfrage des Feature-Layers verfügbar macht, sofern diese festgelegt ist. Hierbei handelt es sich um eine WHERE-Klausel, die die Anzeige der Zeilen einschränkt.RelationshipClass
Eigenschaft, aber ich denke, dies macht nur den letzten Join sichtbar. Sie müsstenIRelQueryTable
stattdessen verwenden, um sie alle zu erhalten.Um passende Felder unabhängig vom Feldnamen zu finden, können Sie Folgendes tun:
quelle