Apparier les champs en entrée aux champs en sortie

Une tâche de géotraitement courante consiste à fusionner de nombreux jeux de données dans un nouveau jeu de données ou un jeu de données existant afin de créer un jeu de données unique couvrant une zone plus étendue ou une table contenant un plus grand nombre d’enregistrements. Si les attributs, ou champs, de toutes les entrées utilisées dans une opération de fusion ou d’ajout sont souvent identiques, il arrive cependant parfois qu’ils ne correspondent pas et que les relations entre les champs de noms et de types différents doivent être appariées. Pour obtenir un exemple d’appariement de champs, reportez-vous à l’outil Fusionner de la boîte à outils Gestion des données ; lequel facilite l’appariement des relations de façon à placer les données dans les champs en sortie souhaités avec les valeurs correctes.

FieldMap

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

Les propriétés de l’objet FieldMap comprennent la position de départ et la position de fin d’une valeur de texte en entrée, de façon à ce qu’une valeur en sortie puisse être créée à l’aide d’une tranche 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, chaque valeur d’enregistrement est fusionnée à l’aide de la propriété mergeRule. Il s’agit d’une méthode pratique pour concaténer des valeurs, comme un nom de rue contenu dans un champ et un type de voie contenu dans un autre champ, par exemple, Eureka et Street. La propriété joinDelimiter de FieldMap est utilisée si la valeur mergeRule Join est spécifiée. N’importe quel ensemble de caractères, comme un espace, peut être utilisé comme délimiteur. Dans l’exemple ci-dessus, ceci créerait la valeur Eureka Street.

Fieldmappings

L'objet FieldMappingsest une collection d'objets FieldMap et sert de valeur de paramètre pour les outils qui exécutent un appariement de champs, tels que l’outil Fusionner. La manière la plus simple de travailler avec ces objets est de créer tout d'abord un objet FieldMappings, puis d’initialiser ses objets FieldMap en ajoutant les classes ou tables d’entités en entrée devant être combinées. 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 de toutes les entrées. Cette liste peut être modifiée en ajoutant de nouveaux champs, en modifiant les propriétés ou le contenu d’un champ en sortie, ou en supprimant tout champ en sortie non désiré.

Exemples

Dans l’exemple qui suit, un certain nombre de classes d'entités contenant des données de recensement américain seront fusionnées afin de former une nouvelle classe d’entités. Le champ numérique STFID est l’un des attributs en entrée présent dans toutes les entrées. Cette valeur à 15 chiffres est un identifiant unique attribué à chaque îlot de recensement aux États-Unis. Cette valeur peut être décomposée en quatre composants. Les deux premiers chiffres correspondent au code de l’état, les trois suivants au comté, les six chiffres suivants identifient le secteur de recensement, et les quatre derniers chiffres l’îlot de recensement. La valeur 360899912001006 représente l’îlot de recensement (1006) dans lequel se trouve l’Université d’État de New York à Potsdam dans le nord de l’État de New York (36), au sein du secteur de recensement 991200 du comté de St. Lawrence (089). L’exemple de script fusionnera ces classes d'entités et créera également deux nouveaux champs, TRACTID et BLOCKID, puisque les données en entrée possèdent uniquement l’attribut STFID. Pour ce faire, l’objet FieldMappings est initialisé à l’aide de la méthode addTable pour saisir chaque entrée. L’objet FieldMappings par défaut est ensuite modifié en créant deux nouveaux objets FieldMap, en renseignant leurs propriétés, et en les ajoutant à l’objet 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)

L’exemple suivant montre comment modifier un objet FieldMap une fois celui-ci créé à l’aide de la méthode addTable de l’objet FieldMappings. Ceci est important lorsque les entrées comportent des champs de noms différents mais contenant logiquement des valeurs identiques.

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)

Dans cette rubrique
  1. FieldMap
  2. Fieldmappings
  3. Exemples