Zuordnen von Eingabefeldern zu Ausgabefeldern

Ein häufig benötigter Geoverarbeitungs-Task besteht darin, viele Datasets in einem neuen oder vorhandenen Dataset zusammenzuführen, um ein einziges Dataset für eine größere Fläche oder eine Tabelle mit einer größeren Anzahl von Datensätzen zu erhalten. Häufig sind die Attribute oder Felder für alle in einem Zusammenführungs- oder Anhängevorgang verwendeten Eingaben identisch. Gelegentlich stimmen sie jedoch nicht überein, und die Beziehungen zwischen Feldern mit unterschiedlichen Namen und Typen müssen einander zugeordnet werden. Ein Beispiel für Feldzuordnungen liefert das Werkzeug Zusammenführen (Merge); es ermöglicht das Zuordnen von Beziehungen, sodass Daten mit den richtigen Werten in den gewünschten Ausgabefeldern platziert werden.

FieldMap

The FieldMap object provides a field definition and a list of input fields from a set of tables or feature classes that provide its values.

The properties of the FieldMap object include the start and end position of an input text value, so an output value can be created using a slice of an input value. If a FieldMap object contains multiple input fields from the same table or feature class, each record's values are merged using the mergeRule property. This is a convenient way to join values, such as a street name that is held in one field and a street type that is held in another, for example, Eureka and Street. The joinDelimiter property of the FieldMap object is used when Join is specified as the mergeRule value. Any set of characters, such as a space, can be used as a delimiter. In the example above, this would create a value of Eureka Street.

FieldMappings

The FieldMappings object is a collection of FieldMap objects, and it is used as the parameter value for tools that perform field mapping, such as Merge. The easiest way to work with these objects is to first create a FieldMappings object, then initialize its FieldMap objects by adding the input feature classes or tables that are to be combined. Once all inputs are provided, the FieldMappings object will contain one FieldMap object, or output field, for each unique field name from all the inputs. You can modify this list by adding new fields, altering the properties or contents of an output field, or removing unwanted output fields.

Beispiele

Im folgenden Beispiel werden eine Reihe von Feature-Classes mit US-Volkszählungsdaten zusammengeführt, sodass eine neue Feature-Class entsteht. Eines der Eingabeattribute, das in allen Eingaben enthalten ist, ist das Zahlenfeld STFID. Dieser 15-stellige Wert ist eine eindeutige ID für alle Volkszählungsblöcke in den USA. Der Wert kann in vier Komponenten unterteilt werden. Die ersten zwei Stellen geben den Code für den Bundesstaat an, die nächsten drei das County, die folgenden sechs geben den Zählbezirk und die letzten vier den Volkszählungsblock an. Der Wert 360899912001006 stellt den Volkszählungsblock (1006) dar, der die State University of New York zu Potsdam im Bundesstaat New York (36) innerhalb des Zählbezirks 991200 des County St. Lawrence (089) enthält. Im Skriptbeispiel werden diese Feature-Classes zusammengeführt. Außerdem werden die zwei Felder TRACTID und BLOCKID erstellt, da die Eingabedaten nur das Attribut STFID aufweisen. Hierzu wird das FieldMappings-Objekt mit der addTable-Methode initialisiert, um die einzelnen Eingaben anzugeben. Anschließend wird das FieldMappings-Standardobjekt geändert, indem zwei FieldMap-Objekte erstellt werden. Deren Eigenschaften werden festgelegt, und sie werden dem FieldMappings-Objekt hinzugefügt.

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)

Im nächsten Beispiel wird veranschaulicht, wie ein FieldMap-Objekt nach dem Erstellen mit der addTable-Methode des FieldMappings-Objekts geändert wird. Dies ist wichtig, wenn die Eingaben Felder mit unterschiedlichen Namen aufweisen, sie jedoch in logischer Hinsicht dieselben Werte enthalten.

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"))

# Run the Merge tool.
arcpy.Merge_management([fc1, fc2], outfc, fieldmappings)