Asignar campos de entrada a campos de salida

Una tarea de geoprocesamiento común consiste en combinar muchos datasets en un dataset nuevo o existente, para crear un dataset único que cubra un área mayor o una tabla que contenga un número de registros mayor. A menudo, los atributos o campos son los mismos para todas las entradas que se utilizan en una operación de combinación o anexión; a veces, sin embargo, no coinciden, y es necesario asignar relaciones entre campos de nombres y tipos diferentes. Para ver un ejemplo de asignaciones de campos, consulte la herramienta Fusionar en la caja de herramientas Administración de datos; facilita esta asignación de relaciones para que los datos se coloquen en los campos de salida deseados y con los valores correctos.

FieldMap

El objeto FieldMap proporciona una definición de campos y una lista de campos de entrada de un conjunto de tablas o clases de entidad que proporcionan sus valores.

Las propiedades del objeto FieldMap incluyen las posiciones inicial y final de un valor de texto de entrada, de tal forma que se pueda crear un valor de salida utilizando una porción de un valor de entrada. Si un objeto FieldMap contiene varios campos de entrada de la misma tabla o clase de entidad, los valores de cada registro se fusionan con la propiedad mergeRule. Ésta es una manera conveniente de unir valores, tales como un nombre de calle contenido en un campo y un tipo de calle contenido en otro, por ejemplo, Eureka y Street. La propiedad joinDelimiter de FieldMap se utiliza si se especifica el valor Join de mergeRule. Cualquier conjunto de caracteres, tal como un espacio, se puede utilizar como delimitador. En el ejemplo anterior, esto crearía el valor Eureka Street.

Fieldmappings

El objeto FieldMappings es una colección de objetos FieldMap y se utiliza como el valor de parámetro en las herramientas que realizan asignación de campos, por ejemplo, Fusionar. La forma más fácil de trabajar con estos objetos consiste en crear primero un objeto FieldMappings y, después, inicializar sus objetos FieldMap agregando las tablas o clases de entidad de entrada que se deben combinar. Una vez proporcionadas todas las entradas, el objeto FieldMappings contendrá un objeto FieldMap, o campo de salida, para cada nombre de campo único de todas las entradas. Puede modificar esta lista agregando campos nuevos, modificando las propiedades o el contenido de un campo de salida o quitando los campos de salida no deseados.

Ejemplos

En el siguiente ejemplo, varias clases de entidad que contienen datos del censo de EE.UU. se combinan para formar una nueva clase de entidad. Uno de los atributos de entrada que se encuentra en todas las entradas es un campo numérico, STFID. Este valor de 15 dígitos es un identificador único para todos los bloques del censo de Estados Unidos. El valor se puede dividir en cuatro componentes. Los primeros dos dígitos proporcionan el código del estado, los tres siguientes indican el condado, los seis siguientes identifican el distrito censal y los últimos cuatro identifican el bloque censal. El valor 360899912001006 representa el bloque censal (1006) que contiene la Universidad Estatal de Nueva York en Potsdam, en el norte del estado de Nueva York (36), dentro del distrito censal 991200 del condado de St. Lawrence (089). La muestra de script fusionará estas clases de entidad y, además, creará dos campos nuevos (TRACTID y BLOCKID), ya que los datos de entrada solo tienen el atributo STFID. Para ello, se inicializa el objeto FieldMappings utilizando el método addTable para introducir cada entrada. Después, se modifica el objeto FieldMappings predeterminado creando dos nuevos objetos FieldMap, rellenando sus propiedades y agregándolos al objeto FieldMappings.

import arcpy
arcpy.env.workspace = "C:/Data/CityBlocks.gdb"
outfc = "C:/Data/CityBlocks.gdb/AllBlocks"
# Each of the input Feature classes has an STFID, which is the
#   combination of the Tract ID and Block ID for each block. 
#   Separate these values out from this field into two new
#   fields, TRACTID and BLOCKID.
# Create a fieldmappings and two new fieldmaps.
fieldmappings = arcpy.FieldMappings()
fldmap_TRACTID = arcpy.FieldMap()
fldmap_BLOCKID = arcpy.FieldMap()
# List all the feature classes in the workspace that start with 
#   'block' in their name and are of polygon feature type.
fcs = arcpy.ListFeatureClasses("block*", "Polygon")
# Create a value table that will hold the input feature classes to Merge
vTab = arcpy.ValueTable()
for fc in fcs:
    # Adding a table is the fast way to load all the fields from the
    #   input into fieldmaps held by the fieldmappings object.
    fieldmappings.addTable(fc)
    # In this example also create two fieldmaps by 'chopping up'
    #   an input field. Feed the chopped field into the new fieldmaps.
    fldmap_TRACTID.addInputField(fc, "STFID")
    fldmap_BLOCKID.addInputField(fc, "STFID")
    # Populate the input value table with feature classes
    vTab.addRow(fc)
# Set the starting and ending position of the fields going into the
#   TractID fieldmap. This is the location in the STFID field where the
#   TractID falls.
for x in range(0, fldmap_TRACTID.inputFieldCount):
    fldmap_TRACTID.setStartTextPosition(x, 5)
    fldmap_TRACTID.setEndTextPosition(x, 10)
# Set the Name of the Field output from this field map.
fld_TRACTID = fldmap_TRACTID.outputField
fld_TRACTID.name = "TRACTID"
fldmap_TRACTID.outputField = fld_TRACTID
# Set the starting and ending position of the fields going into the
#   BlockID fieldmap. This is the location in the STFID field where the
#   blockID falls.
for x in range(0, fldmap_BLOCKID.inputFieldCount):
    fldmap_BLOCKID.setStartTextPosition(x, 11)
    fldmap_BLOCKID.setEndTextPosition(x, 16)
# Set the Name of the Field output from this field map.
fld_BLOCKID = fldmap_BLOCKID.outputField
fld_BLOCKID.name = "BLOCKID"
fldmap_BLOCKID.outputField = fld_BLOCKID
# Add the custom fieldmaps into the fieldmappings object.
fieldmappings.addFieldMap(fldmap_TRACTID)
fieldmappings.addFieldMap(fldmap_BLOCKID)
# Run the Merge tool.
arcpy.Merge_management(vTab, outfc, fieldmappings)

El siguiente ejemplo muestra cómo modificar un objeto FieldMap después de haberlo creado utilizando el método addTable del objeto FieldMappings. Esto es importante cuando las entradas tienen campos con nombres diferentes pero que lógicamente contienen los mismos valores.

import arcpy
outfc = "C:/data/CityData.gdb/AllBlocks"
# Want to merge these two feature classes together. Have a field
#   that has the same content but the names are slightly different:
#   Blocks1 has TRACT2000 and Blocks2 TRACTCODE. Name the output
#   the same as Blocks1.
fc1 = "C:/data/CityData.gdb/Blocks1"
fc2 = "C:/data/CityData.gdb/Blocks2"
# Create a new fieldmappings and add the two input feature classes.
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(fc1)
fieldmappings.addTable(fc2)
# First get the TRACT2000 fieldmap. Then add the TRACTCODE field
#   from Blocks2 as an input field. Then replace the fieldmap within
#   the fieldmappings object.
fieldmap = fieldmappings.getFieldMap(fieldmappings.findFieldMapIndex("TRACT2000"))
fieldmap.addInputField(fc2, "TRACTCODE")
fieldmappings.replaceFieldMap(fieldmappings.findFieldMapIndex("TRACT2000"), fieldmap)
# Remove the TRACTCODE fieldmap.
fieldmappings.removeFieldMap(fieldmappings.findFieldMapIndex("TRACTCODE"))
# Create a value table that will hold the inputs for Merge.
vTab = arcpy.ValueTable()
vTab.addRow(fc1)
vTab.addRow(fc2)
# Run the Merge tool.
arcpy.Merge_management(vTab, outfc, fieldmappings)