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

Das FieldMap-Objekt stellt eine Felddefinition und eine Liste von Eingabefeldern aus einer Reihe von Tabellen oder Feature-Classes bereit, die die entsprechenden Werte verfügbar machen.

Die Eigenschaften des FieldMap-Objekts enthalten die Anfangs- und die Endposition eines Eingabetextwertes, sodass ein Ausgabewert mit einem Teil eines Eingabewertes erstellt werden kann. Wenn ein FieldMap-Objekt mehrere Eingabefelder aus derselben Tabelle oder Feature-Class enthält, werden die Werte aller Datensätze unter Verwendung der Eigenschaft mergeRule zusammengeführt. Dies ist eine benutzerfreundliche Möglichkeit zum Verbinden von Werten, beispielsweise eines Straßennamens in einem Feld und einer Straßenart, die in einem anderen Feld enthalten ist (z. B. "Eureka" und "Street"). Die Eigenschaft joinDelimiter von FieldMap wird verwendet, wenn für mergeRule der Wert Join angegeben wird. Als Trennzeichen können beliebige Zeichen verwendet werden, beispielsweise Leerzeichen. Im obigen Beispiel würde damit der Wert "Eureka Street" erstellt.

FieldMappings

Das FieldMappings-Objekt ist eine Sammlung von FieldMap-Objekten und wird als Parameterwert für Werkzeuge für die Feldzuordnung verwendet, beispielsweise Zusammenführen (Merge). Sie können am einfachsten mit diesen Objekten arbeiten, indem Sie zuerst ein FieldMappings-Objekt erstellen und dann die zugehörigen FieldMap-Objekte initialisieren, indem Sie die zu kombinierenden Eingabe-Feature-Classes oder Tabellen hinzufügen. Wenn alle Eingaben bereitgestellt wurden, enthält das FieldMappings-Objekt ein FieldMap-Objekt (bzw. ein Ausgabefeld) für jeden eindeutigen Feldnamen aus allen Eingaben. Sie können diese Liste ändern, indem Sie neue Felder hinzufügen, die Eigenschaften oder den Inhalt von Ausgabefeldern ändern oder unerwünschte Ausgabefelder entfernen.

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)