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 asignación de campos, vea la herramienta Fusionar en la caja de herramientas Administración de datos; facilita esta asignación de relaciones de modo que los datos se coloquen en los campos de salida deseados con los valores correctos.
El objeto FieldMap proporciona una definición de campo 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 la posición de inicio y final de un valor de texto de entrada, de modo que se pueda crear un nuevo valor de salida utilizando una secció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 combinan utilizando 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 si se utiliza si se especifica el valor de mergeRule Join. Cualquier conjunto de caracteres, tal como un espacio, se puede utilizar como delimitador. En el ejemplo anterior, esto crearía el valor Eureka Street.
Propiedad |
Explicación |
---|---|
inputFieldCount |
Número de campos de entrada definidos. |
joinDelimiter |
Valor de cadena utilizado para separar valores de entrada de la misma tabla si el tipo de campo de salida es string y el valor de mergeRule es Join. |
mergeRule |
Define cómo se combinan los valores de dos o más campos de la misma tabla de entrada en un valor de salida único. Las opciones válidas son las siguientes:
|
outputField |
Las propiedades del campo de salida se establecen o se devuelven en un objeto de campo. |
Método |
Explicación |
---|---|
addInputField(dataset_de_tabla, nombre_de_campo, {posición_inicial}, {posición_final}) |
Agrega un campo a la lista de campos de entrada especificando el nombre, incluyendo la ruta a la tabla de entrada o la clase de entidad del campo y el nombre del campo, así como las posiciones inicial y final del valor de campo, si el valor de entrada es de un campo de texto. |
findInputFieldIndex (dataset_de_tabla, nombre_de_campo) |
Devuelve la posición del índice de un campo específico de la lista de campos de entrada del campo FieldMap. |
getEndTextPosition(index) |
Devuelve la posición dentro del valor del campo de entrada que se utilizará para finalizar el nuevo valor de salida. Esta propiedad solo se utiliza cuando el tipo de campo de entrada es texto. |
getInputFieldName(índice) |
Devuelve el nombre de campo para un campo de entrada concreto. |
getInputTableName(índice) |
Devuelve el nombre de tabla para un campo de entrada concreto. |
getStartTextPosition(índice) |
Devuelve la posición dentro del valor del campo de entrada que se utilizará para iniciar el nuevo valor de salida. Esta propiedad solo se utiliza cuando el tipo de campo de entrada es texto. |
removeAll() |
Elimina el contenido de la lista de campos de entrada de FieldMap. |
removeInputField(índice) |
Quita un campo de entrada de la lista de campos de entrada de FieldMap. |
setEndTextPosition(índice, posición_final) |
Define el valor que indica la última posición de carácter del valor de entrada utilizado para definir el nuevo valor de salida. Esta propiedad solo se utiliza cuando el tipo de campo de entrada es texto. |
setStartTextPosition(índice, posición_inicial) |
Define el valor que indica la primera posición de carácter del valor de entrada utilizado para definir el nuevo valor de salida. Esta propiedad solo se utiliza cuando el tipo de campo de entrada es texto. |
El objeto FieldMappings es una colección de objetos FieldMap y se utiliza como valor de parámetro para las herramientas que realizan la asignación de campos, tales como Merge. La manera más fácil de trabajar con estos objetos es crear primero un objeto FieldMappings y, a continuación, inicializar sus objetos FieldMap agregando las clases de entidad o las tablas de entrada que se vayan a 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. Esta lista se puede modificar agregando nuevos campos, modificando las propiedades o los contenidos de un campo de salida, o quitando los campos de salida no deseados.
Propiedad |
Explicación |
---|---|
fieldCount |
Número de campos de salida. |
fieldValidationWorkspace |
El tipo de espacio de trabajo define las reglas para la denominación de los campos de atributo. Estas reglas se utilizan al determinar los nombres de los campos de salida, que se basan en los nombres de los campos de entrada de las tablas o las clases de entidad de entrada. Por ejemplo, un espacio de trabajo del sistema de archivos que contenga shapefiles solo podrá tener nombres de campo con una longitud máxima de 10 caracteres. |
campos |
Una lista de objetos de campo. Cada objeto de campo representa las propiedades de cada campo de salida. |
Método |
Explicación |
---|---|
addFieldMap (mapa_de_campos) |
Agrega un nuevo objeto FieldMap que definirá un nuevo campo de salida |
addTable(dataset_de_tabla) |
Especifica una tabla o una clase de entidad cuyos campos se utilizarán para definir los campos de salida |
exportToString() |
Guarda el contenido de los objetos FieldMappings en un valor de cadena |
findFieldMapIndex (nombre_mapa_campos) |
Con el nombre del campo de salida, devuelve la posición del objeto FieldMap para el campo dentro de la lista de objetos FieldMap que definen los campos de salida |
getFieldMap(índice) |
Devuelve un objeto FieldMap de la lista de campos de salida utilizando la posición de índice del objeto FieldMap dentro de esa lista |
loadFromString() |
Llena el contenido del objeto FieldMappings utilizando una definición de cadena de caracteres de un objeto FieldMappings |
removeAll() |
Elimina el contenido de la lista FieldMap de modo que no se defina ningún campo de salida |
removeFieldMap(índice) |
Quita un campo de salida de la lista de objetos FieldMap que definen los campos de salida |
replaceFieldMap(índice, valor) |
Reemplaza un campo de salida existente en la lista de objetos FieldMap que definen los campos de salida mediante un nuevo objeto FieldMap |
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 del Estado de Nueva York en Potsdam al norte del estado de Nueva York (36), dentro del distrito censal 991200 del condado de St. Lawrence (089). El ejemplo de secuencia de comandos estas clases de entidad y también creará dos nuevos campos, TRACTID y BLOCKID, porque los datos de entrada solo tienen el atributo STFID. Para hacerlo, se inicializa el objeto FieldMappings utilizando el método addTable para agregar cada entrada. A continuación, se modifica el objeto FieldMappings predeterminado creando dos nuevos objetos FieldMap, llenando sus propiedades y agregándolos al objeto FieldMappings.
import arcpy from arcpy import env 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)
En el ejemplo siguiente se muestra cómo modificar un objeto FieldMap una vez 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)