9 votos

Cómo a través de programación de identificar la "Unió de Campo" en ArcMap?

Es posible identificar mediante programación el Campo de combinación que se utiliza para la Tabla de combinación de dos conjuntos de datos juntos en ArcMap? Actualmente estoy usando ArcGIS 10.0, SP5 y podría preferir una ArcPy solución, sin embargo, yo no estaría frente a otras soluciones, si un ArcPy solución no está disponible.

Uno de los métodos que probé fue el bucle a través de todos los campos y busca una coincidencia "baseName", pero eso es sólo una "conjetura", donde tienen la esperanza de que el fieldnames en ambas bases de datos son las mismas.

Para una representación gráfica de lo que estoy después, estoy básicamente de identificar la "Entrada de Campo de combinación" y "Salida de Campo de combinación", como se ve en el "Agregar combinación de diálogo", pero después del hecho, por supuesto.

How to identify the "Input Join Field" and "Output Join Field"?

Esta es una etiqueta en cuestión Puede "Unirse" ser detectado mediante programación?, pero en este caso quiero extender la funcionalidad para identificar el / los CAMPO(s) que se utiliza para unir las dos (o más) conjuntos de datos juntos.

8voto

auramo Puntos 161

Aquí es un enfoque de ArcObjects, con base en este ejemplo, para enumerar todas las combinaciones de una capa y una lista de su origen y de destino de la tabla de nombres y claves principales y externas:

  1. Obtener una referencia a un ILayer que tiene una o más combinaciones
  2. Elenco de la ILayer a IDisplayTable
  3. Elenco de la IDisplayTable.DisplayTable propiedad IRelQueryTable
  4. Mientras que la tabla actual es un IRelQueryTable:
    1. Inspeccione el RelQueryTable's DestinationTable y SourceTable propiedades
    2. Inspeccione el OriginPrimaryKey y OriginForeignKey propiedades de la IRelQueryTable.RelationshipClass de la propiedad.
    3. Establecer la tabla actual para el actual RelQueryTable's SourceTable de la propiedad

Esta secuencia de comandos de Python (utilizando comtypes y este helper módulo) va a ir a través de todos los de la une, desde la más reciente a la más antigua, y la impresión de un destino y origen de los nombres de tabla, el origen de la clave principal y el origen de clave externa para cada combinación:

from ESRICOMHelpers import * # helper module from http://gis.stackexchange.com/a/5082/753
esriArcMapUI = GetESRIModule("esriArcMapUI")
esriCarto = GetESRIModule("esriCarto")
esriGeoDatabase = GetESRIModule("esriGeoDatabase")

def listJoins(table):
    while CType(table, esriGeoDatabase.IRelQueryTable):
        relQueryTable = CType(table, esriGeoDatabase.IRelQueryTable)
        destTable = relQueryTable.DestinationTable
        sourceTable = relQueryTable.SourceTable
        destDataset = CType(destTable, esriGeoDatabase.IDataset)
        sourceDataset = CType(sourceTable, esriGeoDatabase.IDataset)
        relClass = relQueryTable.RelationshipClass
        print destDataset.Name, sourceDataset.Name, relClass.OriginPrimaryKey, relClass.OriginForeignKey
        table = sourceTable

if __name__ == "__main__":
    #app = GetCurrentApp() # Use if run in-process
    app = GetApp("ArcMap") # Use if run in a standalone script
    mxd = CType(app.Document, esriArcMapUI.IMxDocument)

    # Gets the first layer in the active data frame
    map = mxd.FocusMap
    lyr = map.Layer[0]

    # Need to get the "display table" to access the joins
    displayTable = CType(lyr, esriCarto.IDisplayTable).DisplayTable

    # List the layer's joined tables
    listJoins(displayTable)

La salida del ejemplo, dada una capa de origen con tres combinaciones:

join_table_3 master_fc_join_table_1_join_table_2 JOIN_ID_3 master_fc.MASTER_ID
join_table_2 master_fc_join_table_1 JOIN_ID_2 master_fc.MASTER_ID
join_table_1 master_fc JOIN_ID_1 MASTER_ID

Para obtener más información, consulte ¿Cómo puedo acceder a ArcObjects desde Python?

1voto

Tim Puntos 41

Poner todos los datos de los campos de cadenas de caracteres, (después de haber ordenado) se les compara con un fuzzycompare función y seleccione quienes dieron su mejor partido o el partido más allá de una cierta precisión.

Esta solución es cuando algunos de los datos no caben. Si usted piensa que tanto la columna siempre se ajuste, a continuación, sólo ordenar y comparar para un ajuste perfecto con una simple función de comparación.

0voto

pd. Puntos 755

Intente esto:

  • El uso de la Transformación XSLT herramienta de los Metadatos del conjunto de herramientas para escribir un xml/html archivo de metadatos para el conjunto de datos en cuestión.

    arcpy.XSLTransform_conversion(r'X:\temp\Scratch.gdb\fc_FeatureToPoint',"C:\Program Files\ArcGIS\Desktop10.1\Metadata\Stylesheets\ArcGIS.xsl", r'X:\temp\Metadata.html')
    
  • El uso de un analizador de HTML para leer en el archivo de metadatos y la búsqueda de la combinación de campo desde el Campo de combinación de la herramienta de geoprocesamiento de la historia

  • Muestra de la salida de la herramienta de Transformación XSLT

Output from the XSLT Transformation tool

-1voto

Leonard Puntos 2832

Se unió a los nombres de las tablas en la IFeatureLayer - IFeatureLayerDefinition objeto como una cadena.. que creo que probablemente contiene la combinación de SQL y por lo tanto los nombres de campo.

http://edndoc.esri.com/arcobjects/8.3/diagrams/Map%20Layer%20Object%20Model.pdf

O ¿quiere decir que si usted no puede tener acceso a ese objeto?

-2voto

user20040 Puntos 11

para encontrar la coincidencia de campos, independientemente de nombre de campo, se podría hacer algo como esto:

import arcpy

fc = r"temp/RiversJoined.shp"

fldList1 = [f.name for f in arcpy.ListFields(fc)]
fldList2 =[g.name for g in arcpy.ListFields(fc)]

for f in fldList1:
    values1 = [f_row[0] for f_row in arcpy.da.SearchCursor(fc, (f))]
    for g in fldList2:
        values2 = [g_row[0] for g_row in arcpy.da.SearchCursor(fc,(g))]
        #compare field values
        #get names of matching fields
        if (fldList2.index(g) != fldList1.index(f) and values1 == values2):
            print "match: " + str(g) + " match: "+ str(f)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X