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.

Propiedades de FieldMap

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:

  • First: se utiliza el primer valor de entrada.
  • Last: se utiliza el último valor de entrada.
  • Join: combina los valores utilizando el valor del delimitador para separar los valores (solo es válido si el tipo de campo de salida es texto).
  • Min: se utiliza el valor de entrada menor (válido solo si el tipo de campo de salida es numérico).
  • Max: se utiliza el valor de entrada mayor (válido solo si el tipo de campo de salida es numérico).
  • mean: se calcula el valor medio utilizando los valores de entrada (válido solo si el tipo de campo de salida es numérico).
  • Median: se calcula la mediana utilizando los valores de entrada (válido solo si el tipo de campo de salida es numérico).
  • Sum: se calcula la suma utilizando los valores de entrada (válido solo si el tipo de campo de salida es numérico).
  • StdDev: se calcula la desviación estándar utilizando los valores de entrada (válido solo si el tipo de campo de salida es numérico).
  • Count: número de valores incluidos en los cálculos estadísticos. Cuenta todos los valores excepto los nulos.

outputField

Las propiedades del campo de salida se establecen o se devuelven en un objeto de campo.

Métodos de FieldMap

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.

Propiedades de FieldMappings

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étodos de FieldMappings

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)

Temas relacionados


7/11/2012