¿Es posible identificar mediante programación el campo de unión que se está utilizando para unir dos conjuntos de datos en ArcMap? Actualmente estoy usando ArcGIS 10.0, SP5 y preferiría una solución ArcPy , sin embargo, no me opondría a otras soluciones, si una solución ArcPy no está disponible.
Un método que probé fue recorrer todos los campos y buscar un "baseName" coincidente, pero eso es solo una "suposición educada" en la que esperas que los nombres de campo en ambas bases de datos sean los mismos.
Para una representación gráfica de lo que busco, básicamente quiero identificar el "Campo de unión de entrada" y el "Campo de unión de salida" como se ve en el cuadro de diálogo "Agregar unión", pero después del hecho, por supuesto.
Esta es una pregunta etiquetada para ¿Se puede detectar un "Join" mediante programación? , pero en este caso quiero ampliar la funcionalidad para identificar los CAMPOS que se utilizan para unir los dos (o más) conjuntos de datos.
fuente
Respuestas:
Aquí hay un enfoque de ArcObjects, basado en este ejemplo , para enumerar todas las uniones en una capa y enumerar sus nombres de tabla de origen y destino y las claves primarias y externas:
ILayer
que tenga una o más unionesILayer
aIDisplayTable
IDisplayTable.DisplayTable
propiedad aIRelQueryTable
IRelQueryTable
:RelQueryTable
'sDestinationTable
ySourceTable
propiedadesOriginPrimaryKey
yOriginForeignKey
de laIRelQueryTable.RelationshipClass
propiedad.RelQueryTable
'sSourceTable
propiedadEste script de Python (usando comtypes y este módulo auxiliar ) pasará por todas las uniones, de la más reciente a la más temprana, e imprimirá los nombres de la tabla de origen y destino, la clave primaria de origen y la clave externa de origen para cada combinación:
Ejemplo de salida, dada una capa fuente con tres combinaciones:
Para obtener más información, consulte ¿Cómo accedo a ArcObjects desde Python?
fuente
"global name 'esriGeoDatabase' is not defined"
. ¿Dónde / cómo debería definirse en el código que precede a la líneawhile CType(table, esriGeoDatabase.IRelQueryTable)
?esriGeoDatabase = GetESRIModule("esriGeoDatabase")
.layerList = arcpy.mapping.ListLayers(mxd)
ellistJoins(table)
código, pero se omite en lawhile
declaración.app.Document
regresa con'NoneType' object has no attribute 'Document'
Ponga todos los datos de los campos en cadenas (después de haberlos ordenado) compárelos con una función de comparación difusa y seleccione aquellos que dieron la mejor coincidencia o coincidencia con cierta precisión.
Esta solución es cuando algunos datos no encajan. Si cree que ambas columnas siempre encajarían, simplemente ordene y compare para una combinación perfecta con una función de comparación ordinaria.
fuente
Prueba esto:
Utilice la herramienta de transformación XSLT del conjunto de herramientas de metadatos para escribir un archivo de metadatos xml / html para el conjunto de datos en cuestión.
Use un analizador HTML para leer el archivo de metadatos y busque el campo de unión desde el historial de geoprocesamiento de la herramienta Campo de unión
Salida de muestra de la herramienta de transformación XSLT
fuente
Los nombres de las tablas unidas están en el objeto IFeatureLayer - IFeatureLayerDefinition como una cadena ... que creo que probablemente contiene el SQL de unión y, por lo tanto, los nombres de campo.
http://edndoc.esri.com/arcobjects/8.3/diagrams/Map%20Layer%20Object%20Model.pdf
¿O quieres decir si no puedes acceder a ese objeto?
fuente
IFeatureLayerDefinition
no contiene el "join SQL", solo tiene unaDefinitionExpression
propiedad que expone la consulta de definición de la capa de entidades, si está establecida, que es una cláusula WHERE que limita las filas que se muestran.RelationshipClass
propiedad, pero creo que esto solo expone la unión más reciente. Debería usarIRelQueryTable
en su lugar para obtenerlos todos.para encontrar campos coincidentes independientemente del nombre del campo, puede hacer algo como esto:
fuente