Appariement de champs en entrée aux champs en sortie

Une tâche de géotraitement courante consiste à fusionner de nombreux jeux de données en un jeu de données nouveau ou existant pour créer un jeu de données unique couvrant une plus grande surface ou une table contenant un plus grand nombre d'enregistrements. Souvent, les attributs, ou champs, sont les mêmes pour toutes les entrées utilisées dans une opération de fusion ou d'ajout ; parfois, cependant, ils ne correspondent pas et les relations entre les champs présentant des noms et des types différents doivent être appariées. Pour consulter un exemple d'appariement de champs, reportez-vous à l'outil Fusionner de la boîte à outils Gestion des données ; il facilite cet appariement des relations afin que les données soient placées dans les champs en sortie souhaités avec les valeurs correctes.

L'objet FieldMap fournit une définition de champ et une liste de champs en entrée à partir d'un ensemble de tables ou de classes d'entités qui fournissent des valeurs.

Les propriétés de l'objet FieldMap incluent les positions de début et de fin d'une valeur textuelle en entrée, afin qu'une nouvelle valeur en sortie puisse être créée à l'aide d'une partie d'une valeur en entrée. Si un objet FieldMap contient plusieurs champs en entrée provenant de la même table ou classe d'entités, les valeurs de chaque enregistrement sont fusionnées à l'aide de la propriété mergeRule. Cette méthode est pratique pour joindre des valeurs, telles qu'un nom de rue stocké dans un champ et un type de rue stocké dans un autre, par exemple, Eureka et Rue. La propriété joinDelimiter de FieldMap est utilisée si la valeur spécifiée de mergeRule est Jointure. Tout ensemble de caractères, tel qu'un espace, peut être utilisé comme délimiteur. Dans l'exemple ci-dessus, la valeur Rue Eureka serait créée.

Propriétés de FieldMap

Propriété

Explication

inputFieldCount

Nombre de champs en entrée définis

joinDelimiter

Valeur de chaîne permettant de séparer des valeurs en entrée issues de la même table si le champ en sortie est de type chaîne et si mergeRule a la valeur Jointure.

mergeRule

Définit comment les valeurs de deux champs ou plus issus de la même table en entrée sont fusionnées en une seule valeur en sortie. Les choix suivants sont valides :

  • Premier : la première valeur en entrée est utilisée.
  • Dernier : la dernière valeur en entrée est utilisée.
  • Jointure : fusionne les valeurs en utilisant la valeur de délimiteur pour séparer les valeurs (uniquement valide si le type du champ en sortie est texte).
  • Min. : la plus petite valeur en entrée est utilisée (uniquement valide si le type du champ en sortie est numérique).
  • Max. : la plus grande valeur en entrée est utilisée (uniquement valide si le type du champ en sortie est numérique).
  • Moyenne : la moyenne est calculée à l'aide des valeurs en entrée (uniquement valide si le type du champ en sortie est numérique).
  • Médiane : la médiane est calculée à l'aide des valeurs en entrée (uniquement valide si le type du champ en sortie est numérique).
  • Somme : la somme est calculée à l'aide des valeurs en entrée (uniquement valide si le type du champ en sortie est numérique).
  • Ecart type : l'écart type est calculé à l'aide des valeurs en entrée (uniquement valide si le type du champ en sortie est numérique).
  • Total : le nombre de valeurs incluses dans les calculs statistiques. Toutes les valeurs sont prises en compte, hormis les valeurs Null.

outputField

Les propriétés du champ en sortie sont définies ou retournées dans un objet champ.

Méthodes de l'objet FieldMap

Méthode

Explication

addInputField(table_dataset, field_name, {start_position}, {end_position})

Ajoute un champ à la liste des champs en entrée en spécifiant le nom, y compris le chemin d'accès à la table en entrée ou à la classe d'entités du champ et le nom du champ, ainsi que la position de début et de fin de la valeur de champ, si la valeur en entrée provient d'un champ de texte.

findInputFieldIndex (table_dataset, field_name)

Retourne la position d'index d'un champ spécifique dans la liste des champs en entrée de l'objet FieldMap.

getEndTextPosition(index)

Retourne la position dans la valeur du champ en entrée qui sera utilisée pour finir la nouvelle valeur en sortie. Cette propriété est utilisée seulement quand le champ en entrée est de type texte.

getInputFieldName(index)

Retourne le nom de champ d'un champ en entrée spécifique.

getInputTableName(index)

Retourne le nom de table d'un champ en entrée spécifique.

getStartTextPosition(index)

Retourne la position dans la valeur du champ en entrée qui sera utilisée pour commencer la nouvelle valeur en sortie. Cette propriété est utilisée seulement quand le champ en entrée est de type texte.

removeAll()

Supprime le contenu de la liste des champs en entrée de l'objet FieldMap.

removeInputField(index)

Supprime un champ en entrée dans la liste des champs en entrée de l'objet FieldMap.

setEndTextPosition(index, end_position)

Définit la valeur indiquant la position du dernier caractère de la valeur en entrée utilisée pour définir la nouvelle valeur en sortie. Cette propriété est utilisée seulement quand le champ en entrée est de type texte.

setStartTextPosition(index, start_position)

Définit la valeur indiquant la position du premier caractère de la valeur en entrée utilisée pour définir la nouvelle valeur en sortie. Cette propriété est utilisée seulement quand le champ en entrée est de type texte.

L'objet FieldMappings est une collection d'objets FieldMap et il sert de valeur de paramètre pour les outils qui exécutent un appariement de champs, tels que l'outil Fusionner. La méthode la plus simple pour utiliser ces objets consiste à créer d'abord un objet FieldMappings, puis à initialiser ses objets FieldMap en ajoutant les classes d'entités ou les tables en entrée à associer. Une fois toutes les entrées fournies, l'objet FieldMappings contient un objet FieldMap, ou un champ en sortie, pour chaque nom de champ unique issu de toutes les entrées. Cette liste peut être modifiée en ajoutant de nouveaux champs, en modifiant les propriétés et/ou le contenu d'un champ en sortie ou en supprimant tous les champs en sortie non souhaités.

Propriétés de l'objet FieldMappings

Propriété

Explication

fieldCount

Nombre de champs en sortie

fieldValidationWorkspace

Le type d'espace de travail définit les règles de désignation des champs attributaires. Ces règles sont utilisées pour déterminer les noms des champs en sortie, lesquels s'appuient sur les noms des champs en entrée issus des tables en entrée ou des classes d'entités. Par exemple, un espace de travail de système de fichiers qui contient des fichiers de formes peut avoir uniquement des noms de champs d'une longueur maximale de 10 caractères.

champ

Liste d'objets champ. Chaque objet champ représente les propriétés de chaque champ en sortie.

Méthodes de l'objet FieldMappings

Méthode

Explication

addFieldMap(field_map)

Ajoute un nouvel objet FieldMap qui définit un nouveau champ en sortie.

addTable(table_dataset)

Spécifie une table ou une classe d'entités dont les champs sont utilisés pour définir les champs en sortie.

exportToString()

Enregistre le contenu des objets FieldMappings dans une valeur de chaîne.

findFieldMapIndex(field_map_name)

Utilise le nom du champ en sortie et retourne la position de l'objet FieldMap pour le champ dans la liste des objets FieldMap qui définissent les champs en sortie.

getFieldMap(index)

Retourne un objet FieldMap dans la liste des champs en sortie en utilisant la position d'index de l'objet FieldMap dans cette liste.

loadFromString()

Remplit le contenu de l'objet FieldMappings en utilisant une définition de chaîne d'un objet FieldMappings.

removeAll()

Supprime le contenu de la liste FieldMap afin qu'aucun champ en sortie ne soit défini.

removeFieldMap(index)

Supprime un champ en sortie dans la liste des objets FieldMap qui définissent les champs en sortie.

replaceFieldMap(index, value)

Remplace un champ en sortie existant dans la liste des objets FieldMap qui définissent les champs en sortie par un nouvel objet FieldMap.

Dans l'exemple suivant, plusieurs classes d'entités contenant des données de recensement américaines sont fusionnées en une nouvelle classe d'entités. Le champ numérique STFID est un attribut en entrée qui figure dans toutes les entrées. Cette valeur de 15 chiffres est un identifiant unique pour tous les îlots de recensement aux Etats-Unis. La valeur peut être divisée en quatre composants. Les deux premiers chiffres correspondent au code de l'état, les trois chiffres suivants indiquent le comté, les six suivants identifient le secteur de recensement et les quatre derniers identifient l'îlot de recensement. La valeur 360899912001006 représente l'îlot de recensement (1006) contenant la State University of New York à Potsdam dans le nord de l'Etat de New York (36), dans le secteur de recensement 991200 du comté de St Lawrence (089). L'échantillon de script fusionne ces classes d'entités et crée également deux nouveaux champs, TRACTID et BLOCKID, car les données en entrée possèdent uniquement l'attribut STFID. Pour cela, l'objet FieldMappings est initialisé à l'aide de la méthode addTable pour saisir chaque entrée. Ensuite, l'objet FieldMappings par défaut est modifié par la création de deux nouveaux objets FieldMap, le remplissage de leurs propriétés et leur ajout dans l'objet 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)

L'exemple suivant montre comment modifier un objet FieldMap après sa création à l'aide de la méthode addTable de l'objet FieldMappings. Ceci est important lorsque les entrées possèdent des champs avec des noms différents, mais contenant logiquement les mêmes valeurs.

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)

Rubriques connexes


7/10/2012