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- und Anhängevorgang verwendeten Eingaben identisch. Gelegentlich stimmen sie jedoch nicht überein, und die Felder mit unterschiedlichen Namen und Typen müssen zugeordnet werden. Ein Beispiel für Feldzuordnungen liefert das Werkzeug Zusammenführen (Merge) in der Toolbox "Data Management"; 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 neuer 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"). Der joinDelimiter-Eigenschaft eines FieldMap-Objekts wird verwendet, wenn der mergeRule-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 und/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 den Landkreis, 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) in den Zählbezirk 991200 des Landkreises St. Lawrence (089) enthält. Im Skriptbeispiel werden diese Feature-Classes zusammengeführt. Außerdem werden zwei neue 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 neue FieldMap-Objekte erstellt werden. Deren Eigenschaften werden festgelegt, und sie werden dem FieldMappings-Objekt hinzugefügt.
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)
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"))
# 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)