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- 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.

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.

FieldMap-Eigenschaften

Eigenschaft

Erklärung

inputFieldCount

Die Anzahl der definierten Eingabefelder.

joinDelimiter

Ein Zeichenfolgenwert, mit dem die Eingabewerte aus derselben Tabelle getrennt werden, wenn der Ausgabefeldtyp "String" ist und mergeRule auf Join festgelegt ist.

mergeRule

Legt fest, wie Werte aus zwei oder mehr Feldern aus derselben Eingabe-Tabelle in einem einzigen Ausgabewert zusammengeführt werden. Folgende Optionen sind gültig:

  • First: Der erste Eingabewert wird verwendet.
  • Last: Der letzte Eingabewert wird verwendet.
  • Join: Die Werte werden unter Verwendung des Trennzeichenwertes zusammengeführt, mit dem die Werte voneinander getrennt werden (nur gültig, wenn der Ausgabefeldtyp Text ist).
  • Min: Der kleinste Eingabewert wird verwendet (nur gültig, wenn der Ausgabefeldtyp numerisch ist).
  • Max: Der größte Eingabewert wird verwendet (nur gültig, wenn der Ausgabefeldtyp numerisch ist).
  • Mean: Aus den Eingabewerten wird der Mittelwert berechnet (nur gültig, wenn der Ausgabefeldtyp numerisch ist).
  • Median: Aus den Eingabewerten wird der Medianwert berechnet (nur gültig, wenn der Ausgabefeldtyp numerisch ist).
  • Sum: Aus den Eingabewerten wird die Summe berechnet (nur gültig, wenn der Ausgabefeldtyp numerisch ist).
  • StdDev: Aus den Eingabewerten wird die Standardabweichung berechnet (nur gültig, wenn der Ausgabefeldtyp numerisch ist).
  • Count: Die Anzahl der Werte in statistischen Berechnungen. Zählt alle Werte außer den NULL-Werten.

outputField

Die Eigenschaften des Ausgabefeldes werden in einem Feldobjekt festgelegt oder zurückgegeben.

FieldMap-Methoden

Methode

Erklärung

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

Fügt der Liste der Eingabefelder ein Feld hinzu, wobei der Name (einschließlich des Pfades zur Eingabe-Tabelle oder Feature-Class des Feldes und des Feldnamens) sowie die Anfangs- und Endposition des Feldwertes angegeben werden, wenn der Eingabewert aus einem Textfeld stammt.

findInputFieldIndex (table_dataset, field_name)

Gibt die Indexposition eines bestimmten Feldes in der FieldMap-Liste von Eingabefeldern zurück.

getEndTextPosition(index)

Gibt die Position im Eingabefeldwert zurück, an der der neue Ausgabewert beendet wird. Diese Eigenschaft wird nur verwendet, wenn der Eingabefeldtyp "Text" ist.

getInputFieldName(index)

Gibt den Feldnamen für ein bestimmtes Eingabefeld zurück.

getInputTableName(index)

Gibt den Tabellennamen für ein bestimmtes Eingabefeld zurück.

getStartTextPosition(index)

Gibt die Position im Eingabefeldwert zurück, an der der neue Ausgabewert begonnen wird. Diese Eigenschaft wird nur verwendet, wenn der Eingabefeldtyp "Text" ist.

removeAll()

Löscht den Inhalt der FieldMap-Liste von Eingabefeldern.

removeInputField(index)

Entfernt ein Eingabefeld aus der FieldMap-Liste von Eingabefeldern.

setEndTextPosition(index, end_position)

Legt den Wert fest, der die letzte Zeichenposition des Eingabewertes angibt, mit dem der neue Ausgabewert definiert wird. Diese Eigenschaft wird nur verwendet, wenn der Eingabefeldtyp "Text" ist.

setStartTextPosition(index, start_position)

Legt den Wert fest, der die erste Zeichenposition des Eingabewertes angibt, mit dem der neue Ausgabewert definiert wird. Diese Eigenschaft wird nur verwendet, wenn der Eingabefeldtyp "Text" ist.

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.

FieldMappings-Eigenschaften

Eigenschaft

Erklärung

fieldCount

Die Anzahl der Ausgabefelder.

fieldValidationWorkspace

Der Workspace-Typ definiert die Regeln für die Benennung von Attributfeldern. Diese Regeln werden beim Bestimmen der Namen von Ausgabefeldern angewendet, die auf den Namen der Eingabefelder aus den Eingabe-Tabellen oder Eingabe-Feature-Classes basieren. In einem Dateisystem-Workspace, der Shapefiles enthält, dürfen Feldnamen beispielsweise nur eine maximale Länge von 10 Zeichen aufweisen.

Felder

Eine Liste von Feldobjekten. Jedes Feldobjekt stellt die Eigenschaften der einzelnen Ausgabefelder dar.

FieldMappings-Methoden

Methode

Erklärung

addFieldMap(field_map)

Fügt ein neues FieldMap-Objekt hinzu, das ein neues Ausgabefeld definiert.

addTable(table_dataset)

Gibt eine Tabelle oder Feature-Class an, mit deren Feldern die Ausgabefelder definiert werden.

exportToString()

Speichert den Inhalt der FieldMappings-Objekte in einem Zeichenfolgenwert.

findFieldMapIndex(field_map_name)

Gibt anhand des Namens des Ausgabefeldes die Position des FieldMap-Objekts für das Feld in der Liste der FieldMap-Objekte zurück, mit denen die Ausgabefelder definiert werden.

getFieldMap(index)

Gibt ein FieldMap-Objekt aus der Liste der Ausgabefelder zurück, wobei die Indexposition des FieldMap-Objekts in der betreffenden Liste verwendet wird.

loadFromString()

Füllt den Inhalt des FieldMappings-Objekts mit einer Zeichenfolgendefinition eines FieldMappings-Objekts.

removeAll()

Löscht den Inhalt der FieldMap-Liste, sodass keine Ausgabefelder definiert werden.

removeFieldMap(index)

Entfernt ein Ausgabefeld in der Liste der FieldMap-Objekte, die die Ausgabefelder definieren.

replaceFieldMap(index, value)

Ersetzt ein vorhandenes Ausgabefeld in der Liste der FieldMap-Objekte, die die Ausgabefelder definieren, durch ein neues FieldMap-Objekt.

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)

Verwandte Themen


7/10/2012